Любой сервер рано и поздно подвергается флуду, что приводит к увеличению нагрузки на службы и повышенное использование ресурсов. Многочисленные боты в сети интернет сканируют сайты на наличие уязвимостей и сбора данных.
Такие боты несут вредительский характер поведения и чтобы не тратить на них ресурсы сервера - их следует блокировать.
В данной статье мы рассматриваем именно один из способов борьбы с флудом, для борьбы с DDOS атаками используются другие службы и методы.
Пример таких запросов:
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /aa.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp- HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /wp- HTTP/1.1" 404 48273 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 404 27 "-" "-"
Как видно из лога, в секунды бот делает порядка 9 запросов к серверу, что достаточно много, особенно если представить, что таких ботов с разными IP адресами может быть несколько - на виртуальный сервер может быть создана существенная нагрузка.
Наша задача блокировать IP адреса, делающие очень много регулярных запросов, при этом исключая статику - считать будем только динамические запросы - именно они создают нагрузку.
1. Установка Fail2ban
apt install fail2ban
2. Настройка
nano /etc/fail2ban/jail.local
[DEFAULT]
# Основные настройки
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 200
# Настройки email
destemail = corp@domain.tld
sender = fail2ban@domain.tld
sendername = Fail2Ban
mta = sendmail
# Действие по умолчанию (с отправкой email)
action = %(action_mwl)s
[nginx-flood]
enabled = true
port = http,https
filter = nginx-flood
logpath = /var/log/nginx/*access*.log
maxretry = 200
findtime = 60
bantime = 3600
# action наследуется из DEFAULT, поэтому не нужно дублировать
2.1 Сам фильтр
nano /etc/fail2ban/filter.d/nginx-flood.conf
[Definition]
# Исключаем статические файлы из подсчета
failregex = ^<HOST> -.*"(GET|POST|HEAD) (?!.*\.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg|pdf|txt|xml)(\?.*)?$).* HTTP/\d\.\d".*
ignoreregex =
datepattern = ^[^\[]*\[({DATE})\s+({TIME})\s+[^\]]*\]
2.2 Правки
Не забудьте поменять email на свой
destemail = corp@domain.tld
sender = fail2ban@domain.tld
2.3 Порог срабатывания
При необходимости измените параметры для себя, чтобы исключить ложные срабатывания:
maxretry = 200
findtime = 60
bantime = 3600
3. Запуск служб
systemctl restart fail2ban
systemctl enable fail2ban
4. Просмотр и управление
4.1 Просмотр заблокированных IP
Для iptables
iptables -L -n
Для fail2ban
fail2ban-client status nginx-flood
4.2 Проверка
Временно добавьте тестовый IP в бан
fail2ban-client set nginx-flood banip 1.2.3.4
Проверьте блокировку, а также пришло ли письмо
fail2ban-client set nginx-flood unbanip 1.2.3.4