Nginx http flood (limit conn module+fail2ban)

Материал из Webko Wiki
Версия от 21:42, 21 апреля 2015; Sol (обсуждение | вклад) (Новая страница: «Добавим в /etc/nginx/nginx.conf (в секцию http) строчку: limit_req_zone $binary_remote_addr zone=mysitelimit:10m rate=4r/s; Так мы…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Добавим в /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