Зачастую владельцы сайтов обращаются с проблемой, что сайт сильно «тормозит» — грешат на DDOS, просят разобраться и помочь.
Анализ логово обычно показывает дополнительную нагрузку от ботов — когда сразу несколько ботов «заходит в гости», а так же частенько попадаются на глаза сканеры уязвимостей, которые тоже прилично грузят систему.
Для блокировки подобных «гостей» на уровне сервера логично использовать уровень фаервола, а в качестве средства для анализа и создания правил для фаервола — fail2ban.
Итак, кратко:
- Если fail2ban ещё не стоит — ставим. Этот пункт описывать не буду — инфы много.
- Создаём кастомные фильтры /etc/fail2ban/filter.d/nginx-block-page.conf и /etc/fail2ban/filter.d/nginx-block-bots.conf (код ниже)
- Создаём кастомный jail /etc/fail2ban/jail.d/custom.conf в котором используем созданные фильтры (код ниже)
- Перезапускаем fail2ban
- Смотрим статистику
sudo fail2ban-client status nginx-block-page
sudo fail2ban-client status nginx-badbots
Код nginx-block-page.conf
Для отлова сканеров я использовал самые распространённые запросы (тут можно значительно расширить, но я думаю этого будет достаточно)
[Definition]
failregex = ^.»(GET|POST|HEAD) /admin.php.»
^.»(GET|POST|HEAD) /wp-login.php.»
^.»(GET|POST|HEAD) /wp-.»
^.»(GET|POST|HEAD) /phpinfo.php.»
^.»(GET|POST|HEAD) /(vendor|api|config).»
^.»(GET|POST|HEAD) .env.»
^.»(GET|POST|HEAD) .git.»
ignoreregex =
Код nginx-block-bots.conf
Тут я использовал список ботов который у меня раньше был + глянул по логам и довольно существнно расширил
[Definition]
failregex = ^.«(GET|POST|HEAD) .«.«.» «.(PetalBot|AhrefsBot|SemrushBot|Bytespider|DotBot|Applebot|MJ12bot|Amazonbot|PerplexityBot|DataForSeoBot|OAI-SearchBot|LinkpadBot|SputnikBot|Crowsnest|PaperLiBot|peerindex|ia_archiver|Slurp|Aport|NING|JS-Kit|rogerbot|BLEXBot|MJ12bot|Twiceler|Baiduspider|Java|CommentReader|Yeti|discobot|BTWebClient|Tagoobot|Ezooms|igdeSpyder|Teleport|Offline|DISCo|netvampire|Copier|HTTrack|WebCopier).«
ignoreregex =
Код конфигурационного файла
[nginx-block-page]
enabled = true
port = http,https
filter = nginx-block-page
logpath = /var/www/clients/client1/web4/log/access.log
maxretry = 1
findtime = 1h
bantime = 30d
banaction = iptables-allport
[nginx-block-bots]
enabled = true
port = http,https
filter = nginx-block-bots
logpath = /var/www/clients/client1/web4/log/access.log
maxretry = 1
findtime = 1h
bantime = 30d
banaction = iptables-allport
Внимание — путь до логов нужно подставить свой!
Перед включением jail нужно обязательно протестировать фильтры sudo
fail2ban-regex /var/www/clients/client1/web4/log/access.log /etc/fail2ban/filter.d/nginx-block-page.conf
sudo fail2ban-regex /var/www/clients/client1/web4/log/access.log /etc/fail2ban/filter.d/nginx-block-bots.conf