Fail2ban — демон безопасности для Linux, написанный на Python. Читает лог-файлы сервисов (SSH, Nginx, Apache, Postfix, Dovecot) и ищет паттерны неудачной аутентификации. При превышении порога попыток автоматически добавляет IP в блоклист через iptables/nftables.
Как работает
Fail2ban работает с двумя типами правил: filters (фильтры) — регулярные выражения для распознавания паттернов в логах, и jails (тюрьмы) — конфигурация: какой сервис мониторить, какой фильтр применять, порог попыток (maxretry), время бана (bantime), временное окно (findtime).
Пример: jail sshd мониторит /var/log/auth.log, применяет фильтр sshd (матчит строки «Failed password», «Invalid user»). При 5 ошибках за 10 минут — бан IP на 1 час через iptables: iptables -I INPUT -s x.x.x.x -j DROP. После истечения bantime правило автоматически удаляется.
Fail2ban не защищает от распределённых атак (сотни IP) — для этого нужна DDoS-защита. Основная задача — фильтрация автоматических ботов, сканирующих SSH-порты с одного IP. По статистике, сервер с открытым портом 22 получает тысячи попыток входа в сутки с ботнетов.
История
Fail2ban создан Сирилем Ясне (Cyril Jaquier) в 2004 году. Написан на Python, изначально использовал ipchains, затем iptables. Активно поддерживается — последние релизы для Python 3. Версия 0.9.x (2014) принесла поддержку nftables. Fail2ban — стандартная практика для любого публичного Linux-сервера наряду с отключением root-входа по SSH.
Fail2ban: сложные правила и оптимизация
Кастомные фильтры для нестандартных приложений: файл /etc/fail2ban/filter.d/myapp.conf содержит failregex — регулярное выражение, которое ищет в логах. Пример для WordPress: failregex =
Оптимизация производительности: при высоком объёме логов (> 10 000 строк/мин) стандартный pyinotify может не справляться. Использовать systemd backend (backend = systemd в jail.conf) или polling. Постоянный бан: action = iptables-allports плюс bantime = -1 для критичных jail-правил. Репутация IP: интеграция с AbuseIPDB API — автоматически репортить забаненные IP в глобальную базу данных.
На что обращать внимание
Fail2ban нужно настраивать с осторожностью: слишком жёсткие правила могут заблокировать легитимных пользователей, вводящих неверный пароль. Рекомендуется: bantime = 1h, maxretry = 5, findtime = 10m. Для SSH добавить собственный IP в белый список (ignoreip). Fail2ban не заменяет аутентификацию по SSH-ключу — это дополнительный слой. Для VPS с панелью управления Fail2ban часто входит в стандартный набор (HestiaCP устанавливает его автоматически).
Fail2ban на практике
Fail2ban — стандартный инструмент защиты VPS от автоматических атак. Конфиг: /etc/fail2ban/jail.local. Для SSH: [sshd] jail включён по умолчанию, блокирует IP после 5 неудачных попыток за 10 минут. Для nginx: создайте jail на основе access.log — блокировка при HTTP 4xx-флуде. Whitelist собственных IP: параметр ignoreip. Интеграция с панелью управления: ISPmanager включает Fail2ban как опциональный модуль. Статистика блокировок: fail2ban-client status sshd. Fail2ban не защищает от распределённых атак с тысяч IP — для этого нужна защита от DDoS на уровне CDN.