В логах Nginx появились ошибки "Primary script unknown".
Это боты и сканеры перебирают стандартные WordPress файлы:
Файлов нет, но запросы создают нагрузку и засоряют логи.
Отсекать подозрительные запросы на уровне Nginx, не передавая их PHP.
То есть: если запрос идёт к файлу, которого заведомо нет и быть не должно — сразу закрывать соединение.
Все запросы к:
Получают ответ 444 (закрыть соединение без ответа).
/wp-admin, /wp-includes, /wordpress и другие.
Добавили в конфиг IP, которые активно сканировали сайт.
nikto, sqlmap, nmap, masscan и другие сканеры.
Разрешили только GET, HEAD, POST. Всё остальное — 444.
.env, .git, .svn, .htaccess и т.д.
Ограничили количество запросов с одного IP.
До: запрос → Nginx → PHP-FPM → ошибка "Primary script unknown" → лог.
После: запрос → Nginx проверяет → если в чёрном списке → сразу 444 → в лог ничего не пишется (или пишется, но не ошибка).
В логах Nginx появились множественные ошибки:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream client: 104.23.221.139, request: "GET /wp-admin/setup-config.php" client: 112.202.123.39, request: "POST /xmlrpc.php" client: 20.53.240.38, request: "GET /wp-trackback.php" client: 89.187.168.122, request: "GET /archivarix.cms.php"
Это боты и сканеры, перебирающие стандартные и подозрительные файлы.
Автоматическая блокировка IP, с которых приходит много подозрительных запросов.
[Definition]
failregex = ^.*client: <HOST>.*request: ".*(wp-login\.php|xmlrpc\.php|setup-config\.php|wp-trackback\.php|about\.php|info\.php|admin\.php|file\.php|goods\.php|rip\.php|sf\.php|chosen\.php|archivarix\.cms\.php).*"
ignoreregex =
[wp-scanner]
enabled = true
filter = wp-scanner
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 3600
action = ufw
Примечание: в DEFAULT секции указано banaction = ufw
# Создать тестовый лог
echo '2026/02/21 13:12:04 [error] client: 89.187.168.122 request: "GET /wp-login.php HTTP/1.1"' > /tmp/test.log
# Проверить фильтр
sudo fail2ban-regex /tmp/test.log /etc/fail2ban/filter.d/wp-scanner.conf
Failregex: 1 total Lines: 1 lines, 1 matched, 0 missed
echo "$(date +'%Y/%m/%d %H:%M:%S') [error] client: 89.187.168.122 request: \"GET /wp-login.php HTTP/1.1\"" | sudo tee -a /var/log/nginx/error.log
sudo fail2ban-client status wp-scanner
Status for the jail: wp-scanner |- Filter | |- Currently failed: 1 | |- Total failed: 1 | `- File list: /var/log/nginx/error.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Бан произойдет после 10 нарушений за 60 секунд (или после 1, если временно установить maxretry = 1)
# Перезапуск fail2ban
sudo systemctl restart fail2ban
# Статус конкретного джейла
sudo fail2ban-client status wp-scanner
# Логи fail2ban
sudo tail -f /var/log/fail2ban.log
# Разблокировать IP (если ошиблись)
sudo fail2ban-client set wp-scanner unbanip 89.187.168.122
Fail2ban настроен и работает. Сканеры, пытающиеся обращаться к несуществующим WordPress-файлам, будут автоматически блокироваться на 1 час после 10 попыток в течение 60 секунд.
Статус на 21.02.2026: защита активна.
Комментарии
Пока нет комментариев. Будьте первым!