Nginx http flood (limit conn module+fail2ban)
Добавим в /etc/nginx/nginx.conf (в секцию http) строчку:
limit_req_zone $binary_remote_addr zone=mysitelimit:10m rate=4r/s; Так мы ограничим число запросов до 4 в секунду с одного ип. Учтите, что вам, возможно, потребуется другое значение rate.
Теперь идем в конфигурационный файл виртуального хоста, например /etc/nginx/sites-enabled/example.com:
... listen some_ip:80; server_name example.com www.example.com; root /var/www/example.com/; ... location / { #ваша конфигурация limit_req zone=mysitelimit burst=6; error_page 410 = @nolimit; if ($http_user_agent ~ Googlebot|YandexBot|bingbot|Baiduspider) { return 410; } location @nolimit { #ваша конфигурация } location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ico)$ { root /var/www/example.com/; access_log off; error_log off; ... }
Таким образом мы ограничили частоту запросов до 4 в секунду с всплесками до 6 и отключили лимит для поисковиков. Опять же, возможно, вам нужны другие параметры. Проверяйте на конкретном сайте. Заметьте, у вас обязательно должна быть отдельная локация под статику, иначе лимит будет распространяться и на нее, а это нам совсем не нужно.
Fail2ban Установка типична:
aptitude install fail2ban
Дальше создадим правило для nginx. В /etc/fail2ban/filter.d/nginx-conn-limit.conf
[Definition] failregex = limiting requests, excess.*by zone.*client: <HOST>
И в конце /etc/fail2ban/jail.conf включим правило:
[nginx-conn-limit] enabled = true filter = nginx-conn-limit action = iptables-multiport[name=ConnLimit, port="http,https", protocol=tcp] logpath = /var/log/nginx/error.log findtime = 300 bantime = 7200 maxretry = 10
Тут, возможно, вам нужно будет сменить путь на error лог своего хоста. Банить будем на 2 часа. Теперь перезапустим fail2ban: /etc/init.d/fail2ban restart
Посмотреть список забаненых можно с помощью iptables -L fail2ban-ConnLimit