Еще два способа защиты от http флуда (DDOS) fail2ban

Способ №1

Просмотрев логи своего веб сервера (xampp) /opt/lampp/logs/error_log я заметил, что кто-то брутит пытаясь найти что то.

[Mon Apr 04 23:05:52 2011] [error] [client XX.104.134.251] File does not exist: /opt/lampp/htdocs/pass.txt, referer: http://webxakep.net
[Mon Apr 04 23:05:52 2011] [error] [client XX.104.134.251] File does not exist: /opt/lampp/htdocs/moderator, referer: http://webxakep.net
[Mon Apr 04 23:05:52 2011] [error] [client XX.104.134.251] File does not exist: /opt/lampp/htdocs/modules, referer: http://webxakep.net
[Mon Apr 04 23:05:52 2011] [error] [client XX.104.134.251] File does not exist: /opt/lampp/htdocs/newsadmin, referer: http://webxakep.net
После установки fail2ban в конфиге /etc/fail2ban/jail.conf изменил эти строки:

[apache-shorewall]

enabled = true
filter = apache-noscript
action = iptables[name=httpd, port=http, protocol=tcp]
logpath = /opt/lampp/logs/error_log
maxretry = 3

true — включить
apache-noscript — фильтр который лежит в /etc/fail2ban/filter.d
iptables[name=httpd, port=http, protocol=tcp] — фаервол iptables
/opt/lampp/logs/error_log — путь к лог файлу апача
maxretry = 3 — кол-во ошибок
При возникновение 3 ошибок доступ блокируется при помощи файервола iptables.

Также изменил конфиг фильтра в /etc/fail2ban/filter.d


failregex = [[]client []] (File does not exist|.* not found or unable to stat)

«.*» — обозначает любой текст
Это значит что будет блокироваться вот такие строки:

[Mon Apr 04 23:04:37 2011] [error] [client XX.104.134.251] script ‘/opt/lampp/htdocs/moderator.php’ not found or unable to stat, referer: http://webxakep.net
[Mon Apr 04 23:04:27 2011] [error] [client XX.104.134.251] File does not exist: /opt/lampp/htdocs/mssql, referer: http://webxakep.net

Способ №2

Во время DDOS в логах апаче /opt/lampp/logs/access_log записывается много таких строк:

XX.119.73.134 — — [23/Jun/2011:14:22:03 +0600] «GET /index.php HTTP/1.1» 200 —
XX.119.73.134 — — [23/Jun/2011:14:22:03 +0600] «GET /index.php HTTP/1.1» 200 —
XX.119.73.134 — — [23/Jun/2011:14:22:03 +0600] «GET /index.php HTTP/1.1» 200 —
В /etc/fail2ban/jail.conf изменил вот так:


[apache-badbots]

enabled = true
filter = apache-badbots
action = iptables[name=Bad, port=http, protocol=tcp]
logpath = /opt/lampp/logs/access_log
bantime = 1800
maxretry = 250

bantime = 1800 — блокировать на 30 мин
maxretry = 250 — количество строк в логах с одним и тем же IP (меньше ставить не советую)

Конфиг фильтра в /etc/fail2ban/filter.d


failregex = ^ -.*"(GET|POST).*

Узнаем кого заблокировали /var/log/fail2ban.log

2011-06-29 04:16:49,743 fail2ban.actions: WARNING [apache-shorewall] Ban XX.24.139.11
2011-06-29 04:16:50,757 fail2ban.actions: WARNING [apache-shorewall] XX.24.139.11 already banned
2011-06-29 04:26:50,211 fail2ban.actions: WARNING [apache-shorewall] Unban XX.24.139.11
2011-06-29 16:55:38,908 fail2ban.actions: WARNING [apache-badbots] Ban XX.119.73.134
PS: я сам не догоняю выражение «already banned»

Добавлю, что для включения
[ssh-iptables]
нужны логи /var/log/auth
Для этого надо в
/etc/syslog.conf
добавить строчку:

auth.* -/var/log/auth

перезапустить службу
service syslog restart
И еще не забываем правила:

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j REJECT
iptables -A INPUT -p tcp --syn --dport 2106 -m connlimit --connlimit-above 15 -j REJECT
iptables -A INPUT -p tcp --syn --dport 7777 -m connlimit --connlimit-above 200 -j REJECT