Fail2Ban для WordPress: пошаговая настройка защиты от брутфорс‑атак

Почему Fail2Ban – важный щит для WordPress

WordPress‑сайты ежедневно сталкиваются с миллионами попыток подбора пароля. Традиционные плагины помогают, но они работают на уровне PHP и могут замедлять сайт. Fail2Ban работает на уровне сервера: анализирует логи, блокирует IP‑адреса в firewall и полностью избавляет от нежелательного трафика до того, как запрос достигнет WordPress.

Что понадобится перед началом

  • Доступ к SSH с правами root или sudo.
  • Рабочий WordPress‑сайт, расположенный на Apache или Nginx.
  • Установленный чек‑лист безопасности WordPress – поможет убедиться, что базовые меры уже включены.

Шаг 1. Установка Fail2Ban

  1. Подключитесь к серверу:
    ssh user@your-server.com
  2. Для Ubuntu/Debian выполните:
    sudo apt update && sudo apt install fail2ban -y
  3. Для CentOS/RHEL:
    sudo yum install epel-release -y && sudo yum install fail2ban -y
  4. Проверьте статус сервиса:
    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.