Fail2Ban для WordPress: пошаговая настройка защиты от брутфорс‑атак
Почему Fail2Ban – важный щит для WordPress
WordPress‑сайты ежедневно сталкиваются с миллионами попыток подбора пароля. Традиционные плагины помогают, но они работают на уровне PHP и могут замедлять сайт. Fail2Ban работает на уровне сервера: анализирует логи, блокирует IP‑адреса в firewall и полностью избавляет от нежелательного трафика до того, как запрос достигнет WordPress.
Что понадобится перед началом
- Доступ к SSH с правами
rootилиsudo. - Рабочий WordPress‑сайт, расположенный на
ApacheилиNginx. - Установленный чек‑лист безопасности WordPress – поможет убедиться, что базовые меры уже включены.
Шаг 1. Установка Fail2Ban
- Подключитесь к серверу:
ssh user@your-server.com - Для Ubuntu/Debian выполните:
sudo apt update && sudo apt install fail2ban -y - Для CentOS/RHEL:
sudo yum install epel-release -y && sudo yum install fail2ban -y - Проверьте статус сервиса:
sudo systemctl status fail2ban
Шаг 2. Создание фильтра для WordPress‑логов
Fail2Ban использует «фильтры», описывающие шаблоны в логах. Мы будем отслеживать запросы к wp-login.php и xmlrpc.php.
# /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^ -.*"POST /wp-login.php HTTP/.*" 200
^ -.*"GET /wp-login.php?action=login.*" 200
^ -.*"POST /xmlrpc.php HTTP/.*" 403
^ -.*"POST /xmlrpc.php HTTP/.*" 200
ignoreregex =
Сохраните файл и проверьте синтаксис:
sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/wordpress.conf Если вывод показывает найденные совпадения – фильтр работает.
Шаг 3. Настройка jail (тюрьмы) для WordPress
Jail связывает фильтр с действиями (бан). Создадим отдельный jail, чтобы можно было гибко менять параметры.
# /etc/fail2ban/jail.d/wordpress.local.conf
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 600
bantime = 86400 ; 1 день
action = iptables[name=WordPress, port=http, protocol=tcp]
Перезапустите сервис:
sudo systemctl restart fail2ban Проверьте статус jail:
sudo fail2ban-client status wordpress Шаг 4. Тестируем защиту
С помощью curl имитируем несколько неуспешных попыток входа:
for i in {1..6}; do curl -s -o /dev/null -w "%{http_code}n" -d "log=wrong&pwd=123" https://example.com/wp-login.php; done После пятой попытки IP‑адрес будет занесён в iptables. Проверить можно так:
sudo iptables -L -n | grep "WordPress" Шаг 5. Расширенные настройки и интеграция с другими инструментами
5.1. Уменьшаем ложные срабатывания
Добавьте в ignoreip диапазоны доверенных сетей (ваш офис, CDN). Пример:
ignoreip = 127.0.0.1/8 192.168.0.0/16 203.0.113.0/24 5.2. Связка с WP‑CLI
С помощью WP‑CLI можно быстро отключать пользователя, если его IP попал в бан.
wp user list --field=ID --login=bad_user | xargs -I % wp user delete % --yes 5.3. Логи в JSON для аналитики
Если используете Rank Math SEO PRO и собираете JSON‑логи, включите logencoding = utf-8 в jail‑конфиге, чтобы избежать проблем с кириллицей.
Шаг 6. Мониторинг и автоматическое оповещение
Fail2Ban умеет отправлять email‑уведомления. Добавьте в /etc/fail2ban/jail.local:
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mwl)s Опция action_mwl отправит письмо с журналом последних попыток.
Итоги: защита без нагрузки
Настройка Fail2Ban занимает несколько минут, но экономит часы работы администраторов, избавляя от бесконечных попыток взлома. При правильных параметрах система блокирует злоумышленников на уровне firewall, не нагружая PHP и не влияя на скорость сайта. Для полной картины безопасности не забудьте про оптимизацию изображений и кэширование – они снижают нагрузку и делают ваш сайт быстрее и безопаснее.
❓ Часто задаваемые вопросы
Как Fail2Ban различает легитимный трафик от атак?
Fail2Ban использует регулярные выражения, описанные в фильтрах, и считает попытку атакой, если она превышает заданный порог maxretry за findtime секунд.
Можно ли использовать Fail2Ban с Nginx?
Да, укажите в jail‑конфиге путь к логам Nginx (обычно /var/log/nginx/access.log) и адаптируйте failregex под формат логов.
Как избежать блокировки собственных IP‑адресов?
Добавьте свои диапазоны в параметр ignoreip в /etc/fail2ban/jail.local. После изменения перезапустите сервис.
Нужен ли отдельный сервер для Fail2Ban?
Нет. Fail2Ban работает как системный демон и может быть установлен на том же сервере, где размещён ваш WordPress.