fail2ban

16 июля 2026 · ~12 мин чтения

инструмент безопасность linux сеть devops

fail2ban

fail2ban — это сторож для сервера: программа, которая читает логи (журналы событий), замечает подозрительное поведение — например, десять неверных паролей подряд с одного адреса — и автоматически блокирует этот IP-адрес через файрвол (сетевой фильтр) на заданное время.

История

fail2ban придумал швейцарский разработчик Сирил Жакье (Cyril Jaquier) в 2004 году. Контекст эпохи такой: к середине 2000-х дешёвые выделенные серверы и первые VPS стали массовыми, почти на каждом торчал наружу SSH (протокол удалённого доступа к серверу), и по всему интернету уже вовсю гуляли боты, которые круглосуточно перебирали логины и пароли на 22-м порту. Логи любого сервера были забиты тысячами строк «Failed password for root». Админы писали самодельные скрипты «посчитай неудачные попытки — забань IP», и fail2ban стал обобщением этой идеи в нормальный, настраиваемый инструмент.

Ключевые вехи:

Сейчас fail2ban — зрелый open-source-проект под лицензией GPL, живёт на GitHub (репозиторий fail2ban/fail2ban), развивается сообществом мейнтейнеров. Он входит в стандартные репозитории практически всех дистрибутивов Linux и по-прежнему ставится одной командой вида apt install fail2ban.

Что это такое

Формально fail2ban относится к классу HIPS — host-based intrusion prevention system (система предотвращения вторжений на уровне хоста). Но по сути это очень простая машина из трёх частей:

  1. Наблюдатель — следит за лог-файлами или systemd-журналом.
  2. Фильтр — набор регулярных выражений (шаблонов поиска по тексту), которые вылавливают из логов строки «кто-то сделал плохое» и извлекают из них IP-адрес.
  3. Действие — команда, которую нужно выполнить, когда плохого от одного IP накопилось слишком много. Обычно это добавление запрещающего правила в файрвол: iptables, nftables, firewalld — на выбор.

Связка «за каким логом следим + каким фильтром + что делаем» называется jail («тюрьма», «клетка»). Самый известный jail — sshd: следит за логом SSH-демона и банит тех, кто не смог залогиниться несколько раз подряд.

Чем fail2ban отличается от соседей по цеху:

Важно понимать и то, чем fail2ban не является: это не защита от целевой атаки. Если атакующий распределил перебор по тысячам IP-адресов ботнета — каждый адрес сделает по 2–3 попытки и никогда не доберётся до порога бана.

Аналогии из жизни

Вышибала у клуба с блокнотом. Стоит на входе, смотрит за поведением. Кто трижды попытался пройти по чужой карте — записывается в блокнот и не подходит к двери ближайший час. Через час запись стирается, можно попробовать снова (вдруг человек просто перепутал карту). Где ломается: вышибала видит только тех, кто ломится в его дверь. Если в клубе есть чёрный ход (другой открытый сервис, за логом которого никто не следит) — блокнот не поможет. И если хулиганы приходят каждый раз новые (ботнет), блокнот распухает, а толку нет.

Банкомат, глотающий карту после трёх неверных PIN. Точно та же механика: счётчик неудач → порог → блокировка на время. Именно поэтому подбор PIN перебором невозможен, хотя комбинаций всего 10 000. Где ломается: банкомат блокирует карту (то есть учётную запись), а fail2ban блокирует адрес, с которого приходят попытки. Разница принципиальна: fail2ban не защитит аккаунт, если атакующий меняет адреса, зато не даст одному хаму долбить все аккаунты подряд.

Иммунная система. Организм не знает заранее все вирусы в лицо, но реагирует на паттерн «что-то чужое повторяется» и вырабатывает временный ответ. Где ломается: у иммунитета бывает аутоиммунная реакция — атака на своих. У fail2ban ровно так же: промахнёшься с настройкой — и он забанит тебя самого. Это не гипотетика, а самые популярные грабли (см. ниже).

Как это работает

Проследим полный цикл на примере jail для SSH.

Шаг 1. Кто-то стучится. Бот подключается к серверу и пробует пароль root/12345. SSH-демон отклоняет попытку и пишет в лог строку вида:

Jul 15 01:03:11 vps sshd[1234]: Failed password for root from 203.0.113.7 port 51812 ssh2

Шаг 2. Фильтр ловит строку. fail2ban следит за этим логом (через systemd-журнал или подписку на изменения файла). Каждая новая строка прогоняется через failregex — регулярное выражение фильтра. В нём есть специальный маркер <HOST> — место, откуда извлекается IP нарушителя.

Шаг 3. Счётчик. Для адреса 203.0.113.7 увеличивается счётчик неудач. Здесь работают три главных параметра конфигурации:

Читается это так: «5 плохих событий за 10 минут → бан на 10 минут».

Шаг 4. Бан. Порог превышен — fail2ban выполняет действие (action). Классика — добавить правило в файрвол:

iptables -I f2b-sshd -s 203.0.113.7 -j REJECT

С этого момента пакеты от 203.0.113.7 сервер отвергает (REJECT — с ответом «нельзя») или молча выбрасывает (DROP — вообще без ответа). Для атакующего сервер как будто пропал.

Шаг 5. Разбан. fail2ban запоминает время бана и по истечении bantime сам убирает правило. Если включён инкрементальный режим (bantime.increment = true), то за повторные прегрешения срок растёт: 10 минут, потом 20, 40 — и так до недель.

Схема целиком:

попытка входа ──> лог ──> фильтр (failregex)
                              │ совпало, извлекли IP
                              v
                      счётчик по IP
                              │ maxretry за findtime
                              v
                    action: правило в файрвол ──> IP заблокирован
                              │ прошло bantime
                              v
                    правило снято, счётчик обнулён

Архитектурно fail2ban состоит из двух программ: fail2ban-server (демон, который всё это делает) и fail2ban-client (утилита управления: посмотреть статус, забанить руками, разбанить). Конфигурация лежит в /etc/fail2ban/: файл jail.conf — заводские настройки, которые не трогают, а свои правки кладут рядом в jail.local — при обновлении пакета они не затрутся.

Пара команд, которые покрывают 90% общения с fail2ban:

fail2ban-client status sshd        # кто сейчас в бане у jail'а sshd
fail2ban-client unban 203.0.113.7  # разбанить адрес
fail2ban-client unban --all        # амнистия всем

Самые популярные грабли — самобан

Ошибся паролем несколько раз, дёргаешь SSH в цикле из скрипта, у CI-агента протух ключ — и вот твой собственный IP в бане, а сервер «пропал». Симптом коварный: TCP-соединение может устанавливаться, но дальше — тишина, таймауты. Лечится только с другого адреса или через консоль хостинга (VNC/KVM — экран сервера прямо в браузере панели управления). Профилактика: добавь свои постоянные IP в параметр ignoreip, и fail2ban никогда их не тронет.

Где встречается в обычной жизни

Где встречается в IT и бизнесе

Кто пользуется

Альтернативы и конкуренты

Отдельно: самая сильная «альтернатива» — убрать сервис из зоны доступа. SSH только по ключам с отключёнными паролями делает перебор бессмысленным; SSH за VPN или port knocking убирает сам факт открытого порта. fail2ban тогда остаётся лишь шумодавом для логов.

fail2ban — не броня, а шумодав

Контринтуитивный факт: с точки зрения строгой безопасности fail2ban почти ничего не добавляет серверу, где вход и так только по SSH-ключам — подобрать ключ перебором нельзя. Его главная практическая ценность — гигиена: логи не распухают на гигабайты от мусорных попыток (вчерашняя история с забитым диском — как раз про это), метрики не зашумлены, а простенькие пароли в других сервисах получают реальную защиту от перебора.

Когда НЕ стоит использовать

Связанные понятия

Литература и источники

Где встретилось у меня

Вчера ночью разбирались с VPS: агент должен был настроить авточистку диска, но SSH внезапно перестал пускать — TCP-соединение устанавливалось, а дальше тишина, таймаут на баннере. Классическая картина: fail2ban на сервере забанил исходящий IP, с которого ходили агенты, и понадобился ручной разбан через консоль хостинга. Ирония в том, что чистили диск в том числе от разросшихся логов SSH-брутфорса — того самого шума, ради борьбы с которым fail2ban и существует: сторож, который забанил хозяина, пока тот выносил мусор за взломщиками.

Краткое резюме