Fail2ban для защиты WordPress и не только на OpenLiteSpeed (CyberPanel) от хакерских сканеров
Как настроить Fail2ban для защиты WordPress на OpenLiteSpeed (CyberPanel) от хакерских сканеров
Современные сайты на WordPress круглосуточно подвергаются автоматизированному сканированию. Боты ищут оставленные бэкдоры, файлы конфигурации, уязвимости в REST API и пытаются эксплуатировать старые плагины. Если ваш сервер работает на связке OpenLiteSpeed + CyberPanel, стандартные фильтры Fail2ban часто оказываются бесполезными из-за специфического формата ведения логов.
В этой статье мы подробно разберем, как написать кастомный фильтр web-scan, который умеет распознавать структуру логов OpenLiteSpeed, учитывает начальные кавычки, маскировку ботов и эффективно блокирует распределенные атаки на сетевом уровне брандмауэра.
Проблема: Что ищут хакеры в ваших логах?
Типичная атака начинается с быстрого перебора системных файлов и папок. Вот как выглядит реальный фрагмент лога OpenLiteSpeed при сканировании:
"62.60.130.58 - - [07/Nov/2026:10:38:48 +0700] "GET /wp-admin/css/ HTTP/1.1" 404 711 "binance.com" "Mozilla/5.0..."
"62.60.130.58 - - [07/Nov/2026:10:38:48 +0700] "GET /.well-known/ HTTP/1.1" 404 9226 "binance.com" "Mozilla/5.0..."
"62.60.130.240 - - [06/Nov/2026:23:23:26 +0700] "GET /filefuns.php HTTP/1.1" 404 8052 "://google.com" "Mozlila/5.0..."
Анатомия этой атаки:
- Перебор скрытых скриптов: Бот ищет файлы
filefuns.phpилиcache.php— это типичные имена веб-шеллов (бэкдоров), которые хакеры загружают на взломанные сайты для скрытого управления. - Сканирование папок: Изучается структура каталогов (
/uploads/,/wp-admin/css/,/.well-known/). - Подмена заголовков (Referer Spoofing): Злоумышленник подставляет легитимные домены вроде
binance.comв поле источника перехода, пытаясь обмануть базовые спам-фильтры. - Кривая маскировка: Заголовки User-Agent часто подделываются вручную и содержат нелепые опечатки (например,
MozlilaвместоMozilla).
Главная техническая сложность для классического Fail2ban здесь — двойная кавычка в самом начале строки лога (
"62.60...). Стандартный токен спотыкается о нее и отказывается парсить строку.Пошаговая настройка защиты
web-scanШаг 1. Создание кастомного фильтра
Нам нужно написать регулярное выражение, которое «съедает» начальную кавычку, выдергивает IP-адрес атакующего и сопоставляет его с паттернами известных угроз.
Создайте файл фильтра в терминале сервера:
sudo nano /etc/fail2ban/filter.d/web-scan.conf
Вставьте в него следующую конфигурацию:
[Definition]
failregex = ^"?<HOST> \- \- \[.*\] "GET .*(\.zsh_history|sftp-config\.json|babel\.config\.js|webpack\.config\.js|package\.json|composer\.json) HTTP/.*" (404|403|301)
^"?<HOST> \- \- \[.*\] "GET .*(filefuns\.php|cache\.php) HTTP/.*" 404
^"?<HOST> \- \- \[.*\] "GET .* HTTP/.*" 404 .* "Mozlila/.*"
^"?<HOST> \- \- \[.*\] "GET .* HTTP/.*" 404 "binance\.com"
^"?<HOST> \- \- \[.*\] "GET \/(wp-admin\/css|\.well-known|sites\/default|admin\/controller|uploads|files|images)[^"]*" 404
^"?<HOST> \- \- \[.*\] "GET \/wp-json\/(wemail|wp\/v2\/users|ultimate-member|ldlms|wp-user-manager|wc\/v3)[^"]*" (404|401)
^"?<HOST> \- \- \[.*\] "POST \/(api\/graphql|xmlrpc\.php)[^"]*" (404|403)
ignoreregex =
Что блокирует этот фильтр:
- Попытки скачать файлы конфигураций проекта (
package.json,composer.json,.zsh_history). - Поиск веб-шеллов (
filefuns.php,cache.php). - Ботов со сломанным User-Agent (
Mozlila). - Сканеров с поддельным реферером
binance.com. - Массовый перебор служебных папок WordPress (
/wp-admin/css/,/uploads/). - Агрессивное сканирование REST API (
/wp-json/) на предмет уязвимостей в плагинах пользователей. - Попытки эксплуатации шлюза
xmlrpc.phpи GraphQL.
Шаг 2. Активация правила (Jail)
Теперь свяжем созданный фильтр с реальными логами ваших сайтов в CyberPanel. Откройте локальный файл конфигурации Fail2ban:
sudo nano /etc/fail2ban/jail.local
Добавьте в конец файла новую секцию:
[web-scan]
enabled = true
port = http,https
filter = web-scan
# Маска путей автоматически найдет access-логи всех ваших доменов в CyberPanel
logpath = /home/*/logs/*.access_log
findtime = 600
maxretry = 2
bantime = 172800
Параметры findtime = 600 и maxretry = 2 означают, что если бот совершит хотя бы 2 подозрительных запроса в течение 10 минут, он мгновенно отправится в бан на 48 часов (bantime = 172800).
Шаг 3. Тестирование регулярных выражений
Перед запуском службы в рабочий режим обязательно протестируйте регулярное выражение с помощью встроенного отладчика Fail2ban. Это гарантирует, что синтаксис верен:
sudo fail2ban-regex /home/yourdomain.ru/logs/yourdomain.ru.access_log /etc/fail2ban/filter.d/web-scan.conf
В результате успешного теста вы увидите итоговую таблицу с ненулевым количеством попаданий (
Failregex: X total total), подтверждающую, что маска ложится на логи идеально.Шаг 4. Перезапуск и проверка статуса
Примените конфигурацию, перезапустив демон:
sudo systemctl restart fail2ban
Чтобы посмотреть список заблокированных IP-адресов, которые брандмауэр сервера отсек на сетевом уровне, выполните команду статуса:
sudo fail2ban-client status web-scan
В строке
Banned IP list отобразятся адреса всех нарушителей, которые больше не смогут нагружать ваш процессор генерацией пустых страниц.Дополнительный уровень защиты: Закрываем XML-RPC
В логах часто можно увидеть атаки методом перебора на файл
xmlrpc.php. Чтобы полностью снять нагрузку с PHP-обработчиков, этот файл лучше закрыть железно на уровне сервера. Добавьте в начало вашего файла .htaccess в корне WordPress следующие строки:<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
Заключение
Настройка связки Fail2ban и OpenLiteSpeed в CyberPanel позволяет автоматизировать защиту серверной инфраструктуры. Фильтр web-scan успешно решает проблему нестандартного форматирования логов, разгружает процессор домашнего сервера и пресекает действия ботнетов на ранних стадиях разведки.