Сохраните доступ до включения бана
Как устроен Fail2ban: jail, фильтр и action
Fail2ban уменьшает эффект brute force: служба читает уже записанные события, а не перехватывает пакеты на сетевом интерфейсе. Если служба не записала неудачный вход, строка имеет неожиданный формат либо в ней нет адреса клиента, Fail2ban не сможет принять корректное решение о блокировке.
| Компонент | Назначение | Что настраивают |
|---|---|---|
| Jail | Связывает источник событий, фильтр, пороги и действие для одной службы. | enabled, filter, backend, logpath, maxretry, findtime, bantime, action. |
| Фильтр Fail2ban | Набор регулярных выражений failregex, распознающих строки нарушения и адрес <HOST>. | Готовый фильтр из filter.d или собственный локальный фильтр. |
| Backend | Способ чтения записей: systemd journal или файл. | backend = systemd либо файловый backend, например polling; для файлов нужен logpath. |
| Action | Команда на ban и unban; обычно добавляет и удаляет правило firewall. | Подходящий action из action.d, совместимый с iptables, nftables, firewalld или другим фактическим стеком. |
maxretry задаёт число распознанных неудач от одного адреса, после достижения которого в пределах окна findtime запускается ban. bantime задаёт длительность блокировки. Значения выбирают по реальному трафику: агрессивный порог может заблокировать администратора, мониторинг, пользователей за общим NAT или обратный прокси.
Имена и состав файлов зависят от пакета
Гд е размещать настройку: jail.local или jail.d
Не изменяйте поставляемые пакетом jail.conf, файлы jail.d/*.conf и штатные фильтры напрямую: обновление может заменить их. Конфигурация jail читается в таком порядке: jail.conf, затем jail.d/*.conf в лексикографическом порядке, затем jail.local и после него jail.d/*.local в лексикографическом порядке. Более позднее значение переопределяет более раннее. Практичный вариант — создать собственный файл, например /etc/fail2ban/jail.d/10-local-sshd.local: его проще сопровождать и сравнивать со штатной конфигурацией.
/etc/fail2ban/jail.local также подходит для небольшого числа общих переопределений. Но отдельные файлы jail.d/*.local удобнее разделять по сервисам: SSH, приложение, исключения и дополнительные jail. Эффективную конфигурацию после изменения проверяйте запуском Fail2ban и статусом нужного jail, а не только содержимым одного файла.
Настройка Fail2ban для SSH
Включение jail sshd
Пример использует типичный jail sshd и штатный фильтр sshd. Сначала определите, куда ваша система записывает события SSH: в systemd journal или файл журнала аутентификации.
- 1Проверьте реальные неудачные входыВ отдельной тестовой сессии создайте контролируемую неудачную попытку входа либо найдите уже существующую запись. В журнале должен быть исходный IP клиента. Если адреса нет, сначала исправьте журналирование или схему прокси: jail не сможет заблокировать нужный источник.
- 2Выберите источник журналаЕсли записи SSH доступны через
journalctl, используйтеbackend = systemd, когда этот backend поддерживается установленной версией Fail2ban. Если sshd пишет в файл, используйте файловый backend и укажите фактическийlogpath. Не копируйте путь кauth.logилиsecureс другого дистрибутива без проверки. - 3Создайте локальное переопределениеСоздайте файл в
jail.d, включите jail, назначьте пороги и добавьте только необходимые доверенные адреса. Вариант для journald приведён ниже. - 4Перезапустите службу и проверьте jailПосле перезапуска
fail2ban-client status sshdдолжен показать jail без ошибок. Если jail не появился, проверьте журнал самой службы Fail2ban и синтаксис локального файла.
[sshd]
enabled = true
filter = sshd
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 198.51.100.25
Адрес 198.51.100.25 в примере — документационный, замените его только подтверждённым адресом аварийного доступа либо удалите строку. Синтаксис времени (10m, 1h) поддерживается современными версиями Fail2ban; при работе со старым пакетом сверяйте документацию именно его версии.
[sshd]
enabled = true
filter = sshd
backend = polling
logpath = /фактический/путь/к/журналу-аутентификации.log
maxretry = 5
findtime = 10m
bantime = 1h
Второй вариант предназначен для файлового журнала. polling — файловый backend, не зависящий от уведомлений файловой системы, но способный создавать лишние обращения к журналу на нагруженной системе. Некоторые пакеты предлагают и другие файловые backend; выбирайте доступный в вашей версии. Не оставляйте шаблонный путь: Fail2ban должен читать существующий файл с записями sshd.
sudo systemctl restart fail2ban && sudo fail2ban-client status sshdОбычно вывод содержит имя jail, число текущих и всех банов, а также список `Banned IP list`. Формат и состав полей могут различаться между версиями.Защита SSH от перебора не заменяет настройку ключей, ограничение root-входа и проверенный аварийный доступ. Эти меры разобраны в статье «Безопасная настройка SSH: ключи, root и ограничение доступа».
Fail2ban для Nginx, Apache и веб-приложения
Nginx и Apache часто регистрируют HTTP-запрос в access log, но обычная строка access log сама по себе не всегда означает неудачную аутентификацию. Событие входа может записывать приложение, модуль аутентификации, PHP-FPM, reverse proxy или отдельный журнал ошибок. Выбирайте jail только после того, как нашли в журнале реальные строки неудачного входа и IP клиента.
Reverse proxy и адрес клиента
Создание jail для событий входа в веб-приложение
Штатные jail для Nginx и Apache могут присутствовать в пакет е, но их назначение и имена различаются. Для аутентификации конкретного приложения часто нужен отдельный фильтр.
- 1Зафиксируйте строку неудачного входаВозьмите несколько строк легитимной неудачной аутентификации из фактического журнала. Проверьте, что каждая содержит IP клиента и устойчивый признак ошибки входа, а не только HTTP-статус.
- 2Проверьте готовый фильтр или создайте локальныйСначала посмотрите фильтры, поставленные пакетом, и проверьте их через
fail2ban-regex. Если формат приложен ия не совпадает, создайте новый файл вfilter.dс уникальным именем, не меняя штатный фильтр. - 3Создайте jail с фактическим logpathСвяжите jail с фильтром, включите файловый backend и укажите конкретный журнал приложения или веб-сервера. Подберите осторожные пороги по наблюдаемой активности.
- 4Проверьте распознавание до реального банаЗапустите
fail2ban-regexна журнале. Результат должен показывать найденные совпадения и адреса. Если совпадений нет или ловятся нормальные запросы, исправьте фильтр, а не снижайте порог.
Сначала определите, кто проверяет пароль. Для HTTP Basic Authentication, выполняемой самим веб-сервером, в поставке Fail2ban часто есть фильтры nginx-http-auth и apache-auth. Перед использованием проверьте наличие соответствующего файла в filter.d и совпадения на фактическом журнале ошибок. Если пароль проверяет форма входа приложения, эти фильтры обычно не подходят: используйте журнал и фильтр приложения, как в примере ниже.
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
backend = polling
logpath = /фактический/путь/к/журналу-ошибок-nginx.log
maxretry = 5
findtime = 10m
bantime = 1h[apache-auth]
enabled = true
filter = apache-auth
backend = polling
logpath = /фактический/путь/к/журналу-ошибок-apache.log
maxretry = 5
findtime = 10m
bantime = 1h[Definition]
# Пример предназначен только для строки точного вида:
# myapp-auth authentication failed client=192.0.2.10
# Замените весь шаблон на подтверждённый формат журнала приложения.
failregex = ^myapp-auth authentication failed client=<HOST>\s*$
ignoreregex =[myapp-auth]
enabled = true
filter = myapp-auth
backend = polling
logpath = /фактический/путь/к/журналу-приложения.log
maxretry = 8
findtime = 15m
bantime = 1h
Ш аблон фильтра синтаксически использует механизм Fail2ban, но выражение authentication failed и поле client не универсальны: замените их на подтверждённый формат вашего приложения. Пользовательские фильтры храните как новые файлы filter.d/*.conf или локальные переопределения .local, а не редактируйте пакетный фильтр.
sudo fail2ban-regex /фактический/путь/к/журналу-приложения.log /etc/fail2ban/filter.d/myapp-auth.confФормат результата зависит от версии. Убедитесь, что число совпавших строк ненулевое, извлечены ожидаемые адреса и нормальные запросы не попали в совпадения. Нулевой результат означ ает, что путь, формат строки или регулярное выражение не совпадают.Для journald вместо файла используйте backend = systemd, если этот backend доступен в установленном Fail2ban. Условия отбора journal обычно задаются через journalmatch в определении фильтра; подходящие unit и поля нужно брать из реальных записей конкретной службы. logpath для systemd backend не является источником событий. Если установленный fail2ban-regex поддерживает чтение journal, проверяйте фильтр непосредственно командой вида fail2ban-regex systemd-journal <имя-фильтра> и применяйте подходящие условия journalmatch по документации своей версии. Экспорт небольшого фрагмента через journalctl в файл полезен для отдельной проверки failregex, но не подтверждает работу journalmatch и отбора структурированных полей.
Как посмотреть Fail2ban status, banned IP и выполнить unban
Управляйте работающей службой через fail2ban-client. Команды ниже используют документированный интерфейс, но точный формат вывода может отличаться по версиям. Запускайте их с правами, достаточными для доступа к сокету Fail2ban.
sudo fail2ban-client statussudo fail2ban-client status sshdsudo fail2ban-client get sshd banipsudo fail2ban-client set sshd unbanip 203.0.113.17sudo fail2ban-client get sshd banipРазблокированный адрес не должен оставаться в списке этого jail. Если он остаётся, проверьте имя jail, формат адреса, права запуска команды и журнал Fail2ban.Статус jail не доказывает блокировку трафика
Banned IP list означает, что Fail2ban считает адрес заблокированным и выполнил action. Это не заменяет проверку фактического firewall: action может не соответствовать активному стеку, правила могут быть перезаписаны другим менеджером или не обрабатывать нужный IPv4/IPv6-трафик. Проверьте правила штатным инструментом выбранного стека и тестовым подключением из контролируемого источника.Не используйте unban как постоянное решение: сначала определите, почему заблокирован легитимный адрес — неверный пароль, общий NAT, мониторинг, неверно распознанная строка или ошибочная сеть прокси. Политику firewall и порядок правил рассматривает статья «Firewall сервера: default deny, порядок правил и политика доступа».
Как настроить Fail2ban ignoreip без широких исключений
ignoreip исключает адреса и сети из обработки jail: для них не должен применяться бан. Это не общее правило доступа firewall, а исключение из реакции Fail2ban. Указывайте только loopback и минимально необходимые, документированные адреса — например, один стабильный адрес аварийного доступа, если его исключение действительно оправдано.
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 198.51.100.25
- Не добавляйте широкую корпоративную подсеть или весь VPN-диапазон только ради удобства: скомпрометированное устройство из этой сети не будет заблокировано Fail2ban.
- Не добавляйте IP reverse proxy автоматически. Сначала подтвердите, что журнал содержит адреса клиентов и что jail не пытается блокировать сам прокси.
- Зафиксируйте владельца, назначение и дату пересмотра каждого исключения. Удаляйте запись, когда аварийный маршрут или адрес перестал использоваться.
- Если исключение нужно лишь одному сервису, задавайте его в соответствующем jail, а не в
[DEFAULT].
Почему Fail2ban не блокирует IP: порядок диагностики
Проверка цепочки от события до firewall
Идите по цепочке последовательно. Переходить к следующему пункту имеет смысл только после подтверждения предыдущего.
- 1Убедитесь, что служба запущенаПроверьте состояние службы Fail2ban. Ожидаемый результат — активная служба без ошибок запуска. При ошибке смотрите системный журнал службы: синтаксическая ошибка в локальном файле или отсутствующий action могут помешать загрузке.
- 2Проверьте включение jailВыполните
fail2ban-client statusи убедитесь, что нужный jail есть в списке. Затем выполнитеfail2ban-client status <jail>. Если jail отсутствует, проверьтеenabled = true, имя секции и сообщения о загрузке конфигурации. - 3Найдите исходное событиеПроверьте фактический файл через просмотр последних строк либо записи journald через
journalctl. Ожидаемый результат — реальная строка неудачного входа с IP клиента. Если события нет, проблема находится в сервисе, приложении или его журналировании, а не в Fail2ban. - 4Проверьте фильтр на тех же событияхДля файлового источника запустите
fail2ban-regexс тем же журналом и фил ьтром. Для journald используйте поддерживаемый установленной версией режим чтения systemd journal и те же условияjournalmatch, что применяет фильтр. Экспорт записей в файл проверяет только текстовое регулярное выражение и не подтверждает отбор полей journal. Ожидаемый результат — совпадения только с нужными ошибками и извлечение адреса через<HOST>. - 5Сверьте пороги и исключенияУбедитесь, что число распознанных событий достигло
maxretryв интервалеfindtime, а адрес не входит вignoreip. Если нормальные пользователи достигают порога, пересмотрите значения на основании журналов, а не отключайте jail полностью. - 6Проверьте action и firewall
- 7Подтвердите эффект контролируемым тестомИз тестового, не доверенного адреса создайте достаточное число безопасных неудачных попыток и проверьте статус jail, правила firewall и результат нового подключения. Не проводите такой тест с единственного административного IP.
sudo systemctl status fail2ban --no-pagerПроблема
Jail включён, но бан не появляется
Возможные причины
- Указан неверный `logpath`, файл недоступен или сервис пишет в journald.
- Фильтр не соответствует фактическому формату строки.
- В записи нет реального IP клиента.
- События не достигли `maxretry` за `findtime` либо адрес исключён через `ignoreip`.
Решение
Проверьте источник записи, затем выполните fail2ban-regex на той же строке и фильтре. Исправьте путь или регулярное выражение, подтвердите IP клиента и только после этого меняйте пороги.
Как избежать
После обновления приложения, веб-сервера или схемы прокси повторно тестируйте фильтр на новых строках журналов.
Проблема
Fail2ban показывает бан, но адрес продолжает подключаться
Возможные причины
- Action не соответствует активному firewall-стеку.
- Другой инструмент управляет правилами и перезаписывает результат action.
- Проверяется другой IP, IPv6 вместо IPv4 или трафик приходит через proxy.
- Правило firewall находится в цепочке или порядке, не влияющем на нужный поток.
Решение
Проверьте имя action в эффективной конфигурации jail, его файл в action.d, правила активного firewall и фактический адрес источника. Выберите action, документированный для используемого стека, и повторите контролируемый тест.
Как избежать
На одном хосте определите источник управления firewall. Не смешивайте независимые правила UFW, firewalld, ручные iptables/nftables и action Fail2ban без понимания итогового набора правил.
Recidive: дополнительный jail для повторных банов
Jail recidive, если он поставляется вашим пакетом, учитывает повторные баны, записанные Fail2ban, и может назначать более длительную блокировку адресам, которые неоднократно попадают в бан одного или нескольких jail. Это дополнительный слой, а не обязательная настройка для каждого сервера. Его доступность, источник журнала, исходные пороги и action различаются между пакетами и версиями.
[recidive]
enabled = true
# Перед включением сверить поставляемый filter, logpath/backend и action.
# Пороги подбирать по реальным банам и риску ложной блокировки.
До включения recidive проверьте, что журналы самого Fail2ban доступны, а обычные jail не создают ложных срабатываний. Особенно осторожно оценивайте его при общих NAT-адресах, VPN и прокси: длительный бан общего адреса может затронуть много легитимных пользователей.
Границы защиты от перебора
Fail2ban временно ограничивает повторяющиеся нарушения, уже попавшие в журнал. Он не устраняет уязвимость приложения, не заменяет надёжную аутентификацию и не предотвращает объёмный DDoS: трафик должен дойти до сервера или его канала до того, как локальный action применит блокировку. О защите канала, фильтрации у провайдера и действиях при перегрузке читайте в материале «Защита сервера от DDoS: возможности firewall, фильтрация у провайдера и действия при атаке».
Термины в статье
- Allowlist
- Allowlist — перечень разрешающих записей или правил: система допускает только те субъекты, объекты, действия или значения, которые им соответствуют.
- Brute force
- Brute force — атака, при которой систематически проверяют варианты пароля, ключа или иного секрета через сервис либо по данным для автономной проверки.
- Fail2ban
- Fail2Ban — средство автоматического реагирования на повторяющиеся события в журналах служб, выполняющее заданные действия, обычно временную блокировку IP-адреса, по настроенным фильтрам.
- Jail Fail2ban
- Jail Fail2ban — профиль защиты службы, связывающий фильтр журналов с условиями блокировки и действием, например добавлением адреса в firewall.
- iptables
- iptables — утилита Linux для управления правилами пакетной фильтрации Netfilter через таблицы, цепочки и цели; это не самостоятельный межсетевой экран.
- nftables
- nftables — подсистема Linux и интерфейс управления правилами Netfilter, использующие единый набор правил, выражения, множества и атомарное обновление конфигурации.
- Виртуальный патч
- Виртуальный патч — компенсирующая защита, блокирующая попытки эксплуатации известной уязвимости правилами WAF, IPS, EDR или иного средства без изменения уязвимого кода.
- Журнал аутентификации
- Журнал аутентификации — набор записей о попытках подтверждения личности, их результатах и данных, необходимых для расследования и контроля доступа.
- Межсетевой экран
- Межсетевой экран — средство контроля сетевого трафика, разрешающее или блокирующее его по правилам на границе или между сегментами сети.
- Ограничение частоты запросов
- Ограничение частоты запросов — механизм контроля нагрузки, ограничивающий число запросов от клиента или другого субъекта за заданный интервал.
- Список блокировки
- Список блокировки — набор идентификаторов, адресов или признаков, для которых политика явно запрещает действие, например подключение, доставку сообщения или доступ к ресурсу.
- Фильтр Fail2ban
- Фильтр Fail2ban — набор регулярных выраж ений для выявления в журналах событий, учитываемых jail как неудачные попытки или иные нарушения.
- Централизованное журналирование
- Централизованное журналирование — сбор и хранение журналов разных систем в общем сервисе для унифицированного поиска, контроля целостности и анализа.
