<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">
<channel>
<title>Свои заметки - Личный IT блог - записки на полях</title>
<link>https://eremeew.ru/</link>
<language>ru</language><item>
<title>Fail2ban для защиты WordPress и не только на OpenLiteSpeed (CyberPanel) от хакерских сканеров</title>
<link>https://eremeew.ru/it-news/main-note/16-fail2ban-dlja-zaschity-wordpress-i-ne-tolko-na-openlitespeed-cyberpanel-ot-hakerskih-skanerov.html</link>
<pdalink>https://eremeew.ru/it-news/main-note/16-fail2ban-dlja-zaschity-wordpress-i-ne-tolko-na-openlitespeed-cyberpanel-ot-hakerskih-skanerov.html</pdalink>
<guid>https://eremeew.ru/it-news/main-note/16-fail2ban-dlja-zaschity-wordpress-i-ne-tolko-na-openlitespeed-cyberpanel-ot-hakerskih-skanerov.html</guid>
<pubDate>Sat, 07 Nov 2026 13:41:05 +0700</pubDate>
<category>index</category>

<content:encoded><![CDATA[<div role="heading">Как настроить Fail2ban для защиты WordPress на OpenLiteSpeed (CyberPanel) от хакерских сканеров</div> <div>Современные сайты на WordPress круглосуточно подвергаются автоматизированному сканированию. Боты ищут оставленные бэкдоры, файлы конфигурации, уязвимости в REST API и пытаются эксплуатировать старые плагины. Если ваш сервер работает на связке <b>OpenLiteSpeed + CyberPanel</b>, стандартные фильтры Fail2ban часто оказываются бесполезными из-за специфического формата ведения логов.</div> <div>В этой статье мы подробно разберем, как написать кастомный фильтр <b>web-scan</b>, который умеет распознавать структуру логов OpenLiteSpeed, учитывает начальные кавычки, маскировку ботов и эффективно блокирует распределенные атаки на сетевом уровне брандмауэра.</div> <div><br></div> <hr> <div><br></div> <div role="heading"><b>Проблема: Что ищут хакеры в ваших логах?</b></div> <div>Типичная атака начинается с быстрого перебора системных файлов и папок. Вот как выглядит реальный фрагмент лога OpenLiteSpeed при сканировании:</div> <div><br></div> <div> <pre class="language-markup"><code>"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..." </code></pre> <p><br></p> <div><b>Анатомия этой атаки:</b></div> <ol> <li><b>Перебор скрытых скриптов:</b> Бот ищет файлы <code dir="ltr">filefuns.php</code> или <code dir="ltr">cache.php</code> — это типичные имена веб-шеллов (бэкдоров), которые хакеры загружают на взломанные сайты для скрытого управления.</li> <li><b>Сканирование папок:</b> Изучается структура каталогов (<code dir="ltr">/uploads/</code>, <code dir="ltr">/wp-admin/css/</code>, <code dir="ltr">/.well-known/</code>).</li> <li><b>Подмена заголовков (Referer Spoofing):</b> Злоумышленник подставляет легитимные домены вроде <code dir="ltr">binance.com</code> в поле источника перехода, пытаясь обмануть базовые спам-фильтры.</li> <li><b>Кривая маскировка:</b> Заголовки User-Agent часто подделываются вручную и содержат нелепые опечатки (например, <code dir="ltr">Mozlila</code> вместо <code dir="ltr">Mozilla</code>).</li> </ol> <div>Главная техническая сложность для классического Fail2ban здесь — <b>двойная кавычка в самом начале строки лога (<code dir="ltr">"62.60...</code>)</b>. Стандартный токен спотыкается о нее и отказывается парсить строку.</div> <div><br></div> <div> <div role="heading">Пошаговая настройка защиты <code dir="ltr">web-scan</code></div> <div><br></div> <div role="heading"><b>Шаг 1. Создание кастомного фильтра</b></div> <div>Нам нужно написать регулярное выражение, которое «съедает» начальную кавычку, выдергивает IP-адрес атакующего и сопоставляет его с паттернами известных угроз.</div> <div>Создайте файл фильтра в терминале сервера:</div> <div><br></div> <div> <pre class="language-markup"><code>sudo nano /etc/fail2ban/filter.d/web-scan.conf </code></pre> <p>Вставьте в него следующую конфигурацию:</p> <pre class="language-markup"><code>[Definition] failregex = ^"?&lt;HOST&gt; \- \- \[.*\] "GET .*(\.zsh_history|sftp-config\.json|babel\.config\.js|webpack\.config\.js|package\.json|composer\.json) HTTP/.*" (404|403|301) ^"?&lt;HOST&gt; \- \- \[.*\] "GET .*(filefuns\.php|cache\.php) HTTP/.*" 404 ^"?&lt;HOST&gt; \- \- \[.*\] "GET .* HTTP/.*" 404 .* "Mozlila/.*" ^"?&lt;HOST&gt; \- \- \[.*\] "GET .* HTTP/.*" 404 "binance\.com" ^"?&lt;HOST&gt; \- \- \[.*\] "GET \/(wp-admin\/css|\.well-known|sites\/default|admin\/controller|uploads|files|images)[^"]*" 404 ^"?&lt;HOST&gt; \- \- \[.*\] "GET \/wp-json\/(wemail|wp\/v2\/users|ultimate-member|ldlms|wp-user-manager|wc\/v3)[^"]*" (404|401) ^"?&lt;HOST&gt; \- \- \[.*\] "POST \/(api\/graphql|xmlrpc\.php)[^"]*" (404|403) ignoreregex = </code></pre> <p><br></p> <div><b>Что блокирует этот фильтр:</b></div> <ul> <li>Попытки скачать файлы конфигураций проекта (<code dir="ltr">package.json</code>, <code dir="ltr">composer.json</code>, <code dir="ltr">.zsh_history</code>).</li> <li>Поиск веб-шеллов (<code dir="ltr">filefuns.php</code>, <code dir="ltr">cache.php</code>).</li> <li>Ботов со сломанным User-Agent (<code dir="ltr">Mozlila</code>).</li> <li>Сканеров с поддельным реферером <code dir="ltr">binance.com</code>.</li> <li>Массовый перебор служебных папок WordPress (<code dir="ltr">/wp-admin/css/</code>, <code dir="ltr">/uploads/</code>).</li> <li>Агрессивное сканирование REST API (<code dir="ltr">/wp-json/</code>) на предмет уязвимостей в плагинах пользователей.</li> <li>Попытки эксплуатации шлюза <code dir="ltr">xmlrpc.php</code> и GraphQL.</li> </ul> <div role="heading">Шаг 2. Активация правила (Jail)</div> <div>Теперь свяжем созданный фильтр с реальными логами ваших сайтов в CyberPanel. Откройте локальный файл конфигурации Fail2ban:</div> <div><br></div> <div> <pre class="language-markup"><code>sudo nano /etc/fail2ban/jail.local </code></pre> <p><br></p> <div>Добавьте в конец файла новую секцию:</div> <div><br></div> <div> <pre class="language-markup"><code>[web-scan] enabled = true port = http,https filter = web-scan # Маска путей автоматически найдет access-логи всех ваших доменов в CyberPanel logpath = /home/*/logs/*.access_log findtime = 600 maxretry = 2 bantime = 172800 </code></pre> <p><br></p> <p>Параметры <code dir="ltr">findtime = 600</code> и <code dir="ltr">maxretry = 2</code> означают, что если бот совершит хотя бы 2 подозрительных запроса в течение 10 минут, он мгновенно отправится в бан на 48 часов (<code dir="ltr">bantime = 172800</code>).</p> <p><br></p> <div role="heading"><b>Шаг 3. Тестирование регулярных выражений</b></div> <div>Перед запуском службы в рабочий режим обязательно протестируйте регулярное выражение с помощью встроенного отладчика Fail2ban. Это гарантирует, что синтаксис верен:</div> <div><br></div> <div> <pre class="language-markup"><code>sudo fail2ban-regex /home/yourdomain.ru/logs/yourdomain.ru.access_log /etc/fail2ban/filter.d/web-scan.conf </code></pre> <p><br></p> <div>В результате успешного теста вы увидите итоговую таблицу с ненулевым количеством попаданий (<code dir="ltr">Failregex: X total total</code>), подтверждающую, что маска ложится на логи идеально.</div> <div><br></div> <div><br></div> <div><br></div> <div role="heading"><b>Шаг 4. Перезапуск и проверка статуса</b></div> <div>Примените конфигурацию, перезапустив демон:</div> <div><br></div> <div> <pre class="language-markup"><code>sudo systemctl restart fail2ban </code></pre> <p><br></p> <p>Чтобы посмотреть список заблокированных IP-адресов, которые брандмауэр сервера отсек на сетевом уровне, выполните команду статуса:</p> <pre class="language-markup"><code>sudo fail2ban-client status web-scan </code></pre> <p><br></p> <div>В строке <code dir="ltr">Banned IP list</code> отобразятся адреса всех нарушителей, которые больше не смогут нагружать ваш процессор генерацией пустых страниц.</div> <div><br></div> <div> <div role="heading"><b>Дополнительный уровень защиты: Закрываем XML-RPC</b></div> <div>В логах часто можно увидеть атаки методом перебора на файл <code dir="ltr">xmlrpc.php</code>. Чтобы полностью снять нагрузку с PHP-обработчиков, этот файл лучше закрыть железно на уровне сервера. Добавьте в начало вашего файла <code dir="ltr">.htaccess</code> в корне WordPress следующие строки:</div> </div> </div> </div> </div> </div> </div> </div> <pre class="language-markup"><code>&lt;Files xmlrpc.php&gt; order deny,allow deny from all &lt;/Files&gt; </code></pre> </div> <div> <div role="heading"><b>Заключение</b></div> <div>Настройка связки Fail2ban и OpenLiteSpeed в CyberPanel позволяет автоматизировать защиту серверной инфраструктуры. Фильтр <b>web-scan</b> успешно решает проблему нестандартного форматирования логов, разгружает процессор домашнего сервера и пресекает действия ботнетов на ранних стадиях разведки.</div> </div>]]></content:encoded>
</item></channel></rss>