Fail2ban
| Первый выпуск | 2004 |
|---|---|
| Язык | Python |
| Лицензия | GPLv2 |
| Принцип | логи → фильтр (regex) → действие (бан в файрволе) |
| Источники логов | файлы, systemd journal |
| Действия | iptables, nftables, firewalld, ufw, Cloudflare, почта |
| Конфигурация | /etc/fail2ban/jail.local |
| Альтернатива | CrowdSec |
Fail2ban — программа для Linux-серверов, которая следит за журналами сервисов и, обнаружив много неудачных попыток входа с одного IP-адреса, временно блокирует этот адрес в файрволе. Любой сервер с публичным IP уже через несколько минут после запуска начинают атаковать боты, перебирающие пароли к SSH, почте и веб-панелям. Fail2ban не делает слабый пароль надёжным, но резко снижает шум в логах, нагрузку и шансы перебора.
Как работает
Fail2ban построен из трёх понятий:[1]
| Понятие | Что это | Пример |
|---|---|---|
| Фильтр (filter) | регулярные выражения для строк лога о неудаче | Failed password for .* from <HOST> |
| Действие (action) | что сделать с адресом | добавить в набор nftables, отправить письмо |
| Джейл (jail) | связка: какой лог, какой фильтр, какие пороги и действие | [sshd] |
Демон читает логи (файлы или systemd journal), находит совпадения, и если с одного адреса за время findtime набралось maxretry неудач, выполняет действие бана на срок bantime. По истечении срока адрес разблокируется автоматически. Фильтры для десятков популярных сервисов — sshd, nginx, Postfix, Dovecot, vsftpd, WordPress — поставляются в комплекте.
Установка и настройка
sudo apt install fail2ban # Debian/Ubuntu
sudo dnf install fail2ban # Fedora/RHEL (EPEL)
Файлы jail.conf и filter.d/*.conf перезаписываются при обновлении пакета, поэтому собственные настройки кладут в /etc/fail2ban/jail.local или /etc/fail2ban/jail.d/*.local:[2]
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
backend = systemd
banaction = nftables-multiport
# повторно попавшимся — дольше
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = true
port = ssh
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
В ignoreip обязательно добавляют собственный статический адрес, чтобы случайно не заблокировать себя. После правки — sudo systemctl restart fail2ban (служба управляется systemd).
Управление
sudo fail2ban-client status # список джейлов
sudo fail2ban-client status sshd # счётчики и забаненные адреса
sudo fail2ban-client set sshd unbanip 198.51.100.7
sudo fail2ban-client banned # все баны
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf # проверить фильтр
fail2ban-regex незаменим при написании собственного фильтра: он показывает, сколько строк лога совпало и какие адреса были бы заблокированы.
Свой фильтр
Например, для приложения, пишущего в лог LOGIN FAILED ip=1.2.3.4 user=admin:
# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*LOGIN FAILED ip=<HOST> .*$
ignoreregex =
# /etc/fail2ban/jail.d/myapp.local
[myapp]
enabled = true
logpath = /var/log/myapp/auth.log
maxretry = 10
findtime = 5m
Важно, чтобы приложение логировало реальный IP клиента: за обратным прокси или CDN в логах окажется адрес прокси, и бан заблокирует всех сразу. В таком случае нужно настроить передачу X-Forwarded-For или банить на уровне CDN через соответствующее действие.
Ограничения
- Распределённые атаки. Ботнет с тысячами адресов, каждый из которых делает пару попыток, пороги не превысит.
- IPv6. Злоумышленник легко меняет адрес внутри своей подсети /64; блокировка отдельных адресов малоэффективна.
- Реакция по логам. Fail2ban реагирует уже после неудачных попыток и не защищает от уязвимостей в самом сервисе.
- Риск самоблокировки при неверно настроенном
ignoreipили общем адресе офиса.
Fail2ban — не главная защита SSH
Перебор пароля SSH надёжнее всего предотвращается отказом от паролей:[5]
# /etc/ssh/sshd_config
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
Вход только по ключам делает перебор бессмысленным; Fail2ban в этом случае лишь уменьшает шум в логах. Дополнительно помогают ограничение доступа к порту SSH по списку адресов в файрволе, вход через VPN-сеть или бастион и принцип наименьших привилегий для учётных записей.
Альтернативы
CrowdSec — современная альтернатива с похожей идеей: агент анализирует логи по сценариям, а решения о блокировке применяют отдельные «вышибалы» (bouncers) на файрволе, nginx или CDN. Главная особенность — общая база репутации: адреса, атакующие других участников, блокируются заранее.[4] Для веб-приложений также используют ограничение частоты запросов в nginx (limit_req), WAF и капчу.