Fail2ban: настройка защиты SSH и сайта от перебора паролей
Содержание · 7

Fail2ban читает логи сервера и блокирует IP-адреса, с которых идёт много неудачных попыток входа. Настроить его для SSH можно за 10 минут: установить пакет, создать /etc/fail2ban/jail.local, включить jail sshd, задать maxretry, findtime и bantime и перезапустить службу. Для админки сайта нужен свой фильтр. При этом Fail2ban не заменяет вход по ключу и двухфакторную аутентификацию: он только замедляет подбор.
Как работает Fail2ban
Программа следит за файлами журналов, например /var/log/auth.log, и ищет в них строки по шаблону (фильтру). Если с одного адреса за заданное время набралось слишком много совпадений, она добавляет правило в межсетевой экран и отклоняет новые соединения на период блокировки. По описанию проекта на GitHub, он идёт с готовыми фильтрами для sshd и Apache, а для остальных логов фильтры пишутся вручную. Настройки лежат в /etc/fail2ban, управление идёт через fail2ban-client.
Три параметра задают поведение каждой «клетки» (jail):
| Параметр | Смысл | Как задавать |
|---|---|---|
| maxretry | Сколько неудач допускается | Число, например 5 |
| findtime | Окно, в котором считаются неудачи | 10m, 1h или секунды |
| bantime | Сколько длится блокировка | 1h, 1d, -1 для бессрочной |
| ignoreip | Адреса, которые не банятся никогда | Список IP, подсетей и имён |
| backend | Откуда читать события | auto, systemd, polling |
Значения по умолчанию зависят от версии и дистрибутива, поэтому не полагайтесь на память: после установки проверьте их командой fail2ban-client get sshd bantime (и так же для findtime и maxretry).
Установка и базовая настройка SSH
- Установите пакет: на Debian и Ubuntu
apt install fail2ban, на RHEL-подобных сначала подключите репозиторий EPEL, затемdnf install fail2ban. - Не правьте
jail.conf: в документации проекта прямо сказано, что*.confлучше оставлять как есть, а свои значения хранить в*.local. Создайте/etc/fail2ban/jail.local. - Добавьте в него настройки ниже, подставив свой IP в
ignoreip. - Включите и запустите службу:
systemctl enable --now fail2ban. - Проверьте:
fail2ban-client statusпокажет список jail, аfail2ban-client status sshd— число неудач и заблокированные адреса.
Пример для SSH на сервере, где журналы пишет systemd:
[DEFAULT]—ignoreip = 127.0.0.1/8 ::1 ваш_адрес,bantime = 1h,findtime = 10m,maxretry = 5;[sshd]—enabled = true,backend = systemd;- если используется nftables, добавьте
banaction = nftables, иначе по умолчанию подставится iptables-multiport.
Защита админки сайта: nginx и Apache
Для HTTP-авторизации (Basic Auth) в дистрибутиве есть готовые jail, например nginx-http-auth. Включаются они так же: enabled = true в jail.local. А вот страницы входа CMS (/wp-login.php, /bitrix/admin/, админка Joomla) ничего не знают о Fail2ban: приложение отвечает кодом 200 или 302, и по логу веб-сервера неудачу от успеха не отличить.
Обычно делают так: пишут фильтр, который считает все POST-запросы на страницу входа, и ставят порог повыше. Пример фильтра /etc/fail2ban/filter.d/wp-login.conf: в строке failregex после ^ ставится макрос HOST (в угловых скобках, как в готовых фильтрах из каталога filter.d), далее идёт .* "POST /wp-login\.php. Подключите его в jail со logpath = /var/log/nginx/access.log, maxretry = 10, findtime = 5m. Для проверки фильтра используйте fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wp-login.conf: утилита покажет, сколько строк совпало.
Если сайт стоит за Cloudflare или другим прокси, в логе будет адрес прокси, а не клиента. Сначала настройте передачу реального IP (в nginx модулем realip), иначе вы забаните прокси и положите сайт для всех. Подробный случай, когда лимит по IP не помог, разобран в статье про перебор пароля админки с 200 адресов.
Повторные нарушители и ручное управление
Если один и тот же адрес возвращается после снятия блокировки, включите jail recidive: он читает журнал самого Fail2ban и банит надолго тех, кого уже блокировали несколько раз. В новых версиях есть и постепенное увеличение срока блокировки (bantime.increment), но поддержку параметра проверьте в вашей версии (fail2ban-client version).
- посмотреть заблокированные:
fail2ban-client status sshd; - разбанить адрес:
fail2ban-client set sshd unbanip 203.0.113.10; - проверить синтаксис настроек:
fail2ban-client -t; - перечитать настройки без простоя:
fail2ban-client reload.
Что Fail2ban не умеет
| Задача | Fail2ban справится? | Что использовать |
|---|---|---|
| Подбор паролей с одного адреса | Да | Fail2ban с разумным порогом |
| Подбор с сотен адресов (ботнет) | Слабо, у каждого адреса мало попыток | Ключи, 2FA, лимиты на приложении |
| Эксплуатация уязвимости в CMS | Нет | Обновления, WAF |
| DDoS | Нет | Защита на уровне провайдера |
| Слабый пароль администратора | Нет | Менеджер паролей, 2FA |
Проект сам предупреждает: он не снимает риска слабой аутентификации, для критичных служб рекомендуют ключи или двухфакторную проверку. Поэтому лучший порядок такой: вход по ключам и PasswordAuthentication no, 2FA в админках, Fail2ban как дополнительный слой. Как внедрить второй фактор, расписано в материале про двухфакторную аутентификацию, а пароли для команды можно сгенерировать генератором паролей. Свежий пример, почему вход по паролю лучше отключить: SSHole в OpenSSH.
Чек-лист после настройки
ignoreipсодержит ваши адреса, вторая SSH-сессия открыта.fail2ban-client statusпоказывает нужные jail со статусом включённых.- Тестовый «неверный вход» с запасного IP приводит к блокировке через заданное число попыток.
- Блокировка снимается командой
unbanip, и вы знаете, как это сделать. - Реальный IP клиента виден в логах веб-сервера, если сайт за прокси.
- Журнал
/var/log/fail2ban.logпопадает в ваш мониторинг.
Настройку, мониторинг блокировок и разбор инцидентов мы берём в поддержку сервера. Если сайт уже атакуют, смотрите защиту сайта.
Вопросы и ответы
Что такое Fail2ban простыми словами?
Это программа, которая читает журналы сервера и временно блокирует IP-адреса, с которых идёт много неудачных попыток входа. Блокировка работает через межсетевой экран.
Где хранить настройки Fail2ban?
В файлах jail.local и jail.d/*.local. Файлы *.conf менять не стоит: при обновлении пакета ваши правки могут пропасть.
Как разблокировать свой IP?
Выполните fail2ban-client set sshd unbanip ваш_адрес (вместо sshd подставьте нужный jail). Чтобы такое не повторялось, добавьте адрес в ignoreip.
Защитит ли Fail2ban от взлома сайта на WordPress?
Только от простого перебора паролей, и только если настроен фильтр на страницу входа. От эксплуатации уязвимостей защищают обновления и фильтрующие правила WAF.
Fail2ban или вход только по ключам?
Лучше вместе. Ключи убирают сам смысл подбора пароля, а Fail2ban гасит шум в логах и нагрузку от ботов.