banner

Слабый DDos. Разбор полётов.

Совсем недавно на меня была совершена слабая ddos атака, но не смотря на то что она была слабая я провозился порядка 12 часов.
Сначала я долго не мог понять почему ложиться vps, грешил на дц и работу apache. Пришлось воспользоваться услугами админа, который дал понять, что имеет место быть атака, а не какие-то другие проблемы. Далее был установлен nginx, которые проксировал apache, чтобы разгрузить запросы и сам vps.
Nginx в разы быстрее и лучше справляется со статикой, с динамикой придется повозится, чтобы только он с ней работал, поэтому без помощи apache не обойтись.
Ну а дальше я начал сам разбираться и искать способ борьбы с атакой, придумал буквально за 15 минут .
Для начала я вогрзил на домен klipner.ru статическую страничку и сохранил дамп трафика, чтобы посмотреть запросы.

 tcpdump -n -i eth0 -s 0 -w output.txt dst port 80 and host klipner.ru

Дампил я ровно минуту, получившихся логов мне полностью хватило. Открыв файл я понял, что запросы идут абсолютно шаблонные со случайными куками от vbulletin.

Cookie: bbsessionhash=b8b77070ea0ca437fccb11a11a665738; bblastvisit=1297852636; bblastactivity=0

Посмотрев доки по nginx я приятно удивился его функционалом.
Далее было прописано правило для домена , которое логирует ip с такими куками и отдаёт ошибку 503.

log_format IP ‘$remote_addr’;
if ($http_cookie ~* "bbsessionhash" ) {
	access_log /var/log/nginx/ban IP;
  	return 503;
}

Дело осталось за малым, заблокировать эти айпишники на уровне фаервола .
Удаляем дубли ip и генерируем правила для iptables.

import os
#coding:utf-8
f = open("ban").readlines()
f = list(set(f))
listq = []
for ip in f:
    rule = 'iptables -I INPUT -s %s -j DROP\n'%(ip)
    os.system(rule)
    listq.append(rule)
open('ban.iptalbes','a+').writelines(listq)

После этой истории я понял что nginx крутейший веб сервер :) .
Update:
Куки удалили на следующий день, но меня это не напугало.
Лимитируем кол-во одновременных соединений до 5, всех кто привысил пишем в лог, лог анализируем по крону каждую минуту, всех наглых добавляем в iptables ;) .

    limit_zone   lconn  $binary_remote_addr  10m;
    limit_conn lconn 5;
    limit_conn_log_level error;
#coding:utf-8
import os,re
f = open("/var/log/nginx/ban").readlines()
limf = open("/var/log/nginx/error.log").read()
lg = open("/var/log/nginx/lg", 'a+')
f = list(set(f))
listq = []
for ip in f:
    ip = ip[1:-2]
    listq.append('/sbin/iptables -I INPUT -s %s -j DROP' % (ip))
ips =  list(set(re.findall('limiting connections by zone "lconn", client: (.*?),',limf)))
for ip in ips:
    #print ip
    listq.append('/sbin/iptables -I INPUT -s %s -j DROP' % (ip))
for list in listq:
    try:
        os.system(list)
    except Exception, err:
        print err
        lg.write(str(err))
lg.close()      
open("/var/log/nginx/ban", "w")
open("/var/log/nginx/error.log", "w")
  • aeriman

    Да спамилка, поди, самопальная наткнулась. Самопал настолько кому, что иногда прям плакать хочется.

  • http://klipner.ru rushter

    Ага, держать одновременно 700 соединений на главную с разных ip. Крутая такая спамилка :)

  • тупой школьник

    Автор, ты идиот честное слово, нормальный ддос ты никогда не отразишь такими детсад методами

  • http://klipner.ru rushter

    И нормальный отобью, ты главное не переживай.

  • наивный школьник

    Бугага, давай проверим?

  • http://klipner.ru rushter

    Можешь начинать.

  • http://bomzhikseo.blogspot.com Bomzhik

    Это может быть процесс какой-нибудь заклинило, и сервак повис целиком, у меня такое было пару раз.

  • http://klipner.ru rushter

    Это может мне опровергнул админ, я же написал.
    Сам грешил сначала на софтверную сторону.

  • Nasibu

    Rushter, запусти сервак. Чё то вечером никак не могу зайти в прогу, а утром заходит -  но я на работе(

  • http://klipner.ru/ RushteR

    Всё нормально, просто нужно обновить её.

  • Ul-support

    Подскажи , где в коде изменить колличество совпадений айпи адреса в логе что бы не забанить обычного пользака . Например что бы в логе об этом айпи упоминалось раз 20 например , если меньше то в бан не отправлял

  • http://klipner.ru/ RushteR

    Здесь такое не подсчитывается даже