Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
IPtables не пригодны для фильтрации большого количества адресов.
# создаем DROP правила для 50 самых агрессивных ботов
# загружаем blacklist
Я сделал раз в 5 минут.
cat /var/log/nginx/error.log | grep «limiting connections by zone» | grep «request: \»GET / HTTP/1.1"| awk '{print $12}'| awk -F"," '{print $Можно выкинуть cat, фильтрацию засунуть в awk и так далее.
1}'| sort | uniq -c | sort -nr > /tmp/botnet.blacklist
tcp 0 0 77.21.155.100:80 91.77.35.87:1674 TIME_WAIT tcp 0 0 77.21.155.100:80 79.139.231.33:52911 TIME_WAIT tcp 0 0 77.21.155.101:80 94.41.251.59:1365 TIME_WAIT
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
/etc/logrotate.d/nginxстандартный скрипт ротации логов Debian.
location =/
awk '{print "iptables -A INPUT -p tcp --dport 80 -s " $2 " -j DROP" }' botnet.blacklist | head -n 50 >> /tmp/iptables_ban.shawk '{print "iptables -A INPUT -p tcp --dport 80 -s " $2 " -j DROP" }' /tmp/botnet.blacklist | head -n 50 >> /tmp/iptables_ban.shawk: cannot open botnet.blacklist (No such file or directory)"awk: line 1: syntax error at or near end of linebotnet.blacklist2013/11/26 13:58:15 [error] 737#0: *16080 limiting connections by zone "perip", client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:15 [error] 737#0: *16077 limiting connections by zone "perip", client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:15 [error] 737#0: *16081 limiting connections by zone "perip", client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:15 [error] 737#0: *16038 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:3000/", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:15 [error] 737#0: *16035 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:3000/", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:15 [error] 737#0: *16023 connect() failed (110: Connection timed out) while connecting to upstream, client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:3000/", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:17 [error] 737#0: *16082 limiting connections by zone "perip", client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:19 [error] 737#0: *16051 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:3000/", host: "mysite.ru", referrer: "http://mysite.ru/"
2013/11/26 13:58:19 [error] 737#0: *16090 limiting connections by zone "perip", client: 91.191.234.194, server: mysite.ru, request: "GET / HTTP/1.0", host: "mysite.ru", referrer: "http://mysite.ru/"
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
/var/log/nginx/*.log {
daily
missingok
rotate 9
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
grep -E ' 499 [0-9]| 500 [0-9]| 502 [0-9]| 503 [0-9]| 504 [0-9]' $LOGFILEawk '{if ($1>10)print "iptables -A INPUT -p tcp --dport 80 -s " $2 " -j DROP";}' $BOTSLIST > $SH
Простой и эффективный метод отразить http DDoS от 50мбит с помощью nginx и iptables