fail2ban
fail2ban
fail2ban — это сторож для сервера: программа, которая читает логи (журналы событий), замечает подозрительное поведение — например, десять неверных паролей подряд с одного адреса — и автоматически блокирует этот IP-адрес через файрвол (сетевой фильтр) на заданное время.
История
fail2ban придумал швейцарский разработчик Сирил Жакье (Cyril Jaquier) в 2004 году. Контекст эпохи такой: к середине 2000-х дешёвые выделенные серверы и первые VPS стали массовыми, почти на каждом торчал наружу SSH (протокол удалённого доступа к серверу), и по всему интернету уже вовсю гуляли боты, которые круглосуточно перебирали логины и пароли на 22-м порту. Логи любого сервера были забиты тысячами строк «Failed password for root». Админы писали самодельные скрипты «посчитай неудачные попытки — забань IP», и fail2ban стал обобщением этой идеи в нормальный, настраиваемый инструмент.
Ключевые вехи:
- 2004 — первый релиз, простенький Python-скрипт вокруг iptables.
- Ветка 0.8 (примерно 2006–2013) — самая долгоживущая классика, именно она разошлась по репозиториям Debian и Ubuntu и сделала fail2ban стандартом де-факто.
- 0.9–0.10 (примерно 2014–2018) — переработанная архитектура клиент-сервер, поддержка Python 3, поддержка IPv6.
- 0.11 (примерно 2020) — инкрементальные баны: рецидивистов банят каждый раз всё дольше.
- 1.0 (2022) — «взрослая» версия, окончательный переезд на Python 3.
Сейчас fail2ban — зрелый open-source-проект под лицензией GPL, живёт на GitHub (репозиторий fail2ban/fail2ban), развивается сообществом мейнтейнеров. Он входит в стандартные репозитории практически всех дистрибутивов Linux и по-прежнему ставится одной командой вида apt install fail2ban.
Что это такое
Формально fail2ban относится к классу HIPS — host-based intrusion prevention system (система предотвращения вторжений на уровне хоста). Но по сути это очень простая машина из трёх частей:
- Наблюдатель — следит за лог-файлами или systemd-журналом.
- Фильтр — набор регулярных выражений (шаблонов поиска по тексту), которые вылавливают из логов строки «кто-то сделал плохое» и извлекают из них IP-адрес.
- Действие — команда, которую нужно выполнить, когда плохого от одного IP накопилось слишком много. Обычно это добавление запрещающего правила в файрвол: iptables, nftables, firewalld — на выбор.
Связка «за каким логом следим + каким фильтром + что делаем» называется jail («тюрьма», «клетка»). Самый известный jail — sshd: следит за логом SSH-демона и банит тех, кто не смог залогиниться несколько раз подряд.
Чем fail2ban отличается от соседей по цеху:
- fail2ban vs файрвол. Файрвол — это статичный список правил: «этот порт открыт, этот закрыт». Сам он ничего не решает. fail2ban — это автоматика над файрволом: он динамически добавляет и убирает правила на основе поведения.
- fail2ban vs WAF (web application firewall). WAF разбирает содержимое HTTP-запросов и режет SQL-инъекции и прочие атаки на приложение. fail2ban в содержимое почти не смотрит — он смотрит в логи и считает события.
- fail2ban vs IDS (система обнаружения вторжений, например Snort). IDS анализирует сетевой трафик целиком и ищет сигнатуры атак; это тяжёлая артиллерия. fail2ban анализирует только логи — это легковес, который закрывает один конкретный класс проблем: перебор и назойливое сканирование.
- fail2ban vs rate limiting (ограничение частоты запросов). Rate limiting притормаживает всех, кто ходит слишком часто, без понятия «виновности». 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 увеличивается счётчик неудач. Здесь работают три главных параметра конфигурации:
maxretry— сколько неудач терпим (по умолчанию 5);findtime— за какое окно времени их считаем (по умолчанию 10 минут);bantime— на сколько банить (по умолчанию 10 минут).
Читается это так: «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 никогда их не тронет.
Где встречается в обычной жизни
- «Неверный пароль. Аккаунт заблокирован на 30 минут» — в почте, банке, госуслугах. Это та же логика fail2ban, только на уровне приложения: счётчик неудач → временная блокировка.
- Капча после нескольких неудачных входов. Сайт заметил серию ошибок с твоего адреса и включил проверку «ты человек?». Порог и счётчик — те же самые.
- SIM-карта и PIN. Три неверных PIN — телефон требует PUK. Счётчик, порог, эскалация наказания — родная схема, только блокировка не по времени, а до ввода мастер-кода.
- Домофонные и офисные СКУД. Несколько неверных кодов подряд — и панель «замирает» на минуту, чтобы нельзя было перебрать все комбинации за вечер.
- Онлайн-игры и маркетплейсы банят по устройству или адресу за подозрительную активность — концептуально это тот же jail, просто сигналом служит не строка лога, а поведенческая метрика.
Где встречается в IT и бизнесе
- Защита SSH на любом сервере. Классика и причина существования инструмента. Голый SSH на публичном IP собирает от сотен до десятков тысяч попыток перебора в сутки — fail2ban превращает этот шум в короткий список забаненных.
- Почтовые серверы (Postfix, Dovecot, Exim). Боты перебирают пароли почтовых ящиков, чтобы рассылать спам от твоего имени. Jail по логам почты — стандартная практика.
- Веб-приложения и админки. Перебор паролей к
wp-login.phpв WordPress, к панелям типа cPanel/ISPmanager. fail2ban читает access-лог nginx/Apache и банит настойчивых. - VoIP-серверы (Asterisk, FreeSWITCH). Взломанная телефония — это прямые деньги: злоумышленник звонит на платные номера за твой счёт. Jail для SIP-регистраций — must have.
- Нужно когда: у тебя есть любой сервис с аутентификацией, торчащий в интернет, и ты хочешь автоматическую реакцию на перебор, не переписывая само приложение.
Кто пользуется
- Практически каждый Linux-VPS в интернете. fail2ban входит в репозитории Debian, Ubuntu, RHEL/CentOS/Alma, Arch и других; в гайдах «первичная настройка сервера» у DigitalOcean, Hetzner, Linode он идёт обязательным пунктом сразу после создания пользователя и настройки ключей. Точной статистики установок нет (пакет бесплатный, телеметрии нет), но счёт идёт на миллионы машин.
- Хостинг-панели. В ISPmanager, Plesk, VestaCP/HestiaCP fail2ban либо предустановлен, либо включается галочкой — то есть им пользуются и те, кто слова «регулярное выражение» никогда не слышал.
- Малый и средний бизнес — почтовые серверы, сайты, CRM на своих VPS. Для компаний без выделенного безопасника fail2ban — это 90% практической защиты от перебора за 10 минут настройки.
- В крупных компаниях с центральным SIEM (системой сбора событий безопасности) и облачными WAF fail2ban встречается реже — там его роль выполняют более тяжёлые платформы.
Альтернативы и конкуренты
- CrowdSec (Франция, проект стартовал в 2020). Плюсы: современная архитектура, разбор логов отделён от блокировки (bouncer'ы), а главное — коллаборативная репутация: участники обмениваются данными об атакующих IP, и ты получаешь бан-листы, собранные всей сетью. Минусы: сложнее концептуально, часть ценности завязана на облачный сервис компании.
- sshguard. Плюсы: написан на C, очень лёгкий и быстрый, почти не ест ресурсов. Минусы: заточен под меньший набор сервисов, гибкость фильтров заметно ниже — свои паттерны добавлять сложнее.
- DenyHosts. Плюсы: исторически простой инструмент ровно под SSH. Минусы: работает через устаревший механизм hosts.deny, проект давно почти не развивается — сегодня выбирать его нет причин.
- Встроенные средства. Правила nftables/iptables с модулем
recent(банить тех, кто открывает соединения слишком часто) или ужесточение самого sshd. Плюсы: нет лишнего софта вообще. Минусы: это rate limiting без понимания логов — не отличает легитимного пользователя с неверным паролем от бота, и настройка требует уверенного знания файрвола.
Отдельно: самая сильная «альтернатива» — убрать сервис из зоны доступа. SSH только по ключам с отключёнными паролями делает перебор бессмысленным; SSH за VPN или port knocking убирает сам факт открытого порта. fail2ban тогда остаётся лишь шумодавом для логов.
fail2ban — не броня, а шумодав
Контринтуитивный факт: с точки зрения строгой безопасности fail2ban почти ничего не добавляет серверу, где вход и так только по SSH-ключам — подобрать ключ перебором нельзя. Его главная практическая ценность — гигиена: логи не распухают на гигабайты от мусорных попыток (вчерашняя история с забитым диском — как раз про это), метрики не зашумлены, а простенькие пароли в других сервисах получают реальную защиту от перебора.
Когда НЕ стоит использовать
- Пользователи приходят с общих IP (офисный NAT, мобильные сети с CGNAT, кампусный Wi-Fi). Один сотрудник трижды ошибся паролем — забанился весь офис, потому что снаружи все выглядят одним адресом. Здесь блокировать надо учётную запись, а не IP.
- Сервис стоит за облачным прокси или балансировщиком (Cloudflare, любой LB). В логи прилетает IP прокси, а не атакующего: либо забанишь сам прокси и отрубишь всех, либо баны просто не сработают. Нужно сначала пробросить реальный адрес (заголовок X-Forwarded-For, real_ip в nginx) — а лучше банить средствами самого прокси-слоя.
- Против распределённой атаки с тысяч адресов. Каждый бот делает 1–2 попытки — порог не срабатывает ни для кого. Здесь работают другие механизмы: ключи вместо паролей, MFA, коллаборативные списки вроде CrowdSec, WAF.
Связанные понятия
- Brute force (перебор) — атака подбором паролей или ключей «в лоб»; главный противник fail2ban.
- iptables / nftables — механизмы фильтрации пакетов в ядре Linux; руки, которыми fail2ban исполняет баны (nftables — современная замена iptables).
- Регулярные выражения (regex) — язык шаблонов для поиска по тексту; на нём написаны все фильтры fail2ban.
- WAF (Web Application Firewall) — фильтр HTTP-трафика на уровне приложения; дополняет fail2ban там, где атака не видна в логах как «неудачный вход».
- IDS/IPS — системы обнаружения/предотвращения вторжений, анализирующие трафик целиком (Snort, Suricata); тяжёлый старший класс того же семейства.
- Honeypot (приманка) — ложный сервис, созданный чтобы ловить и изучать атакующих; часто используется вместе с автобаном: тронул приманку — в бан.
Литература и источники
- Wikipedia (en): статья «Fail2ban» — история, архитектура, ссылки. https://en.wikipedia.org/wiki/Fail2ban
- Официальный репозиторий и вики: https://github.com/fail2ban/fail2ban — актуальные версии, changelog, примеры фильтров.
- Man-страницы
jail.conf(5)иfail2ban-client(1)— исчерпывающая документация по параметрам (доступны на любом сервере с установленным пакетом). - Туториал DigitalOcean «How To Protect SSH with Fail2Ban» — лучший пошаговый старт для новичка; искать по этому названию, есть версии под каждый дистрибутив.
- Документация CrowdSec (https://docs.crowdsec.net) — чтобы понять, куда класс инструментов эволюционирует после fail2ban.
- Книга: Michael W. Lucas, «SSH Mastery» (2-е издание, 2018, en) — про грамотную настройку SSH, при которой fail2ban становится лишь приятным дополнением.
Где встретилось у меня
Вчера ночью разбирались с VPS: агент должен был настроить авточистку диска, но SSH внезапно перестал пускать — TCP-соединение устанавливалось, а дальше тишина, таймаут на баннере. Классическая картина: fail2ban на сервере забанил исходящий IP, с которого ходили агенты, и понадобился ручной разбан через консоль хостинга. Ирония в том, что чистили диск в том числе от разросшихся логов SSH-брутфорса — того самого шума, ради борьбы с которым fail2ban и существует: сторож, который забанил хозяина, пока тот выносил мусор за взломщиками.
Краткое резюме
- fail2ban (2004, Сирил Жакье) — сторож для сервера: читает логи, считает плохие события по каждому IP и временно банит нарушителей через файрвол.
- Ключевая тройка настроек:
maxretryплохих событий заfindtime→ бан наbantime. Связка «лог + фильтр + действие» называется jail. - Главная ценность — автоматическое подавление перебора паролей и шумных ботов на SSH, почте, веб-админках и VoIP; ставится и настраивается за минуты.
- Главные грабли — самобан: добавь свои IP в
ignoreip, а на крайний случай помни про консоль VNC/KVM в панели хостинга иfail2ban-client unban. - Это шумодав, а не броня: от распределённых атак и целевого взлома не спасает — там нужны ключи вместо паролей, MFA, VPN и коллаборативные списки вроде CrowdSec.