02.17Слабый DDos. Разбор полётов.
Сначала я долго не мог понять почему ложиться 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
Cookie: bbsessionhash=b8b77070ea0ca437fccb11a11a665738; bblastvisit=1297852636; bblastactivity=0
Далее было прописано правило для домена , которое логирует 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)
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
-
тупой школьник
-
http://klipner.ru rushter
-
наивный школьник
-
http://klipner.ru rushter
-
http://bomzhikseo.blogspot.com Bomzhik
-
http://klipner.ru rushter
-
Nasibu
-
http://klipner.ru/ RushteR
-
Ul-support
-
http://klipner.ru/ RushteR