Image

База знаний → Защита от флуда (частого регулярного обхода старниц) nginx сервера

[Виртуальные сервера]
Дата публикации: 10.09.2025

Любой сервер рано и поздно подвергается флуду, что приводит к увеличению нагрузки на службы и повышенное использование ресурсов. Многочисленные боты в сети интернет сканируют сайты на наличие уязвимостей и сбора данных.

Такие боты несут вредительский характер поведения и чтобы не тратить на них ресурсы сервера - их следует блокировать.

В данной статье мы рассматриваем именно один из способов борьбы с флудом, для борьбы с 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




Нет комментариев