Перейти к содержимому
Все статьи
Безопасность

Fail2ban: настройка защиты SSH и сайта от перебора паролей

·10 ноября 2026 г.· 7 мин чтения
Проверьте, не задело ли ваш сайтПроверить свой сайт
Содержание · 7
  1. Как работает Fail2ban
  2. Установка и базовая настройка SSH
  3. Защита админки сайта: nginx и Apache
  4. Повторные нарушители и ручное управление
  5. Что Fail2ban не умеет
  6. Чек-лист после настройки
  7. Вопросы и ответы
Иллюстрация к статье «Fail2ban: настройка защиты SSH и сайта от перебора паролей»

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

  1. Установите пакет: на Debian и Ubuntu apt install fail2ban, на RHEL-подобных сначала подключите репозиторий EPEL, затем dnf install fail2ban.
  2. Не правьте jail.conf: в документации проекта прямо сказано, что *.conf лучше оставлять как есть, а свои значения хранить в *.local. Создайте /etc/fail2ban/jail.local.
  3. Добавьте в него настройки ниже, подставив свой IP в ignoreip.
  4. Включите и запустите службу: systemctl enable --now fail2ban.
  5. Проверьте: 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.

Чек-лист после настройки

  1. ignoreip содержит ваши адреса, вторая SSH-сессия открыта.
  2. fail2ban-client status показывает нужные jail со статусом включённых.
  3. Тестовый «неверный вход» с запасного IP приводит к блокировке через заданное число попыток.
  4. Блокировка снимается командой unbanip, и вы знаете, как это сделать.
  5. Реальный IP клиента виден в логах веб-сервера, если сайт за прокси.
  6. Журнал /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 гасит шум в логах и нагрузку от ботов.

Нужна помощь с проектом?

Обсудим задачу и предложим решение — от сайта до SaaS и защиты.

Связаться