Ddos

Nginx

Ограничение одновременных запросов с одного IP адреса.

limit_req_zone $binary_remote_addr zone=myzone:10m rate=20r/m;

Данная строка означает
zone=myzone - название зоны
10m - буфер для хранения данных IP адресов. Этого числа вполне достаточно. Если буфер будет заполнен будут удаляться самые невостребованные записи
rate=20r/m - в данном случае означает 20 запросов в минуту, можно указать например 2r/s это будет значит 2 запроса в секунду. Далее в лог будут писаться сообщения об ошибке и остальные запросы блокироваться.

        location / {
                limit_req zone=myzone burst=20 nodelay;
                limit_req_status 429;
                proxy_pass http://myzone;
        }

limit_req_status - какое сообщение об ошибке будет отправлено клиенту.
burst=20 - какое количество пакетов может привысить заданное выше в rate число. В моем случае указано 20 запросов в минуту, значит я могу посылать запрос не чаще чем раз в 3 секунды, но указывая 20 здесь, показывает, что я могу отправить 20 запросов в минуту и не получить ошибку.
nodelay - означает, что те 20 запросов, что я могу отправить будут без задержек, иначе запрос отработается с задержкой в 3 секунды.

Не забудье исключить всю графику и системные url из этого правила.

fail2ban

/etc/fail2ban/jail.conf

[nginx-limit-req]
enabled = true
filter  = nginx-limit-req
port    = http,https
logpath = /var/log/nginx/error.log
findetime = 60
maxretry = 30
bantime = 1800

enabled - включаем обработчик
filter - тип фильтра
port - порт
logpath - путь к логу который будем парсить
findetime - время за которое будем искать запросы
maxretry - количество запросов за findetime время
bantime - время на которое блокируем

[ Править ]

@kiranananda