# Fail2ban

> Утилита, которая читает логи сервисов и временно блокирует в файрволе IP-адреса с повторяющимися неудачными попытками входа; защита от перебора паролей SSH, веб-форм и почты.

Источник: https://llmdocs.ru/wiki/fail2ban/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Первый выпуск**: 2004
- **Язык**: Python
- **Лицензия**: GPLv2
- **Принцип**: логи → фильтр (regex) → действие (бан в файрволе)
- **Источники логов**: файлы, systemd journal
- **Действия**: iptables, nftables, firewalld, ufw, Cloudflare, почта
- **Конфигурация**: /etc/fail2ban/jail.local
- **Альтернатива**: CrowdSec
**Fail2ban** — программа для Linux-серверов, которая следит за журналами сервисов и, обнаружив много неудачных попыток входа с одного IP-адреса, временно блокирует этот адрес в [файрволе](https://llmdocs.ru/wiki/firewall.md). Любой сервер с публичным IP уже через несколько минут после запуска начинают атаковать боты, перебирающие пароли к [SSH](https://llmdocs.ru/wiki/ssh.md), почте и веб-панелям. Fail2ban не делает слабый пароль надёжным, но резко снижает шум в логах, нагрузку и шансы перебора.

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

Fail2ban построен из трёх понятий:[1]

| Понятие | Что это | Пример |
|---|---|---|
| **Фильтр** (filter) | регулярные выражения для строк лога о неудаче | `Failed password for .* from <HOST>` |
| **Действие** (action) | что сделать с адресом | добавить в набор nftables, отправить письмо |
| **Джейл** (jail) | связка: какой лог, какой фильтр, какие пороги и действие | `[sshd]` |

Демон читает логи (файлы или [systemd journal](https://llmdocs.ru/wiki/journald-logs.md)), находит совпадения, и если с одного адреса за время `findtime` набралось `maxretry` неудач, выполняет действие бана на срок `bantime`. По истечении срока адрес разблокируется автоматически. Фильтры для десятков популярных сервисов — sshd, [nginx](https://llmdocs.ru/wiki/nginx.md), Postfix, Dovecot, vsftpd, WordPress — поставляются в комплекте.

## Установка и настройка

```bash
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]

```ini
[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](https://llmdocs.ru/wiki/systemd.md)).

## Управление

```bash
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`:

```ini
# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*LOGIN FAILED ip=<HOST> .*$
ignoreregex =
```

```ini
# /etc/fail2ban/jail.d/myapp.local
[myapp]
enabled  = true
logpath  = /var/log/myapp/auth.log
maxretry = 10
findtime = 5m
```

Важно, чтобы приложение логировало реальный IP клиента: за [обратным прокси](https://llmdocs.ru/wiki/reverse-proxy.md) или 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-сеть или бастион и [принцип наименьших привилегий](https://llmdocs.ru/wiki/least-privilege.md) для учётных записей.

## Альтернативы

**CrowdSec** — современная альтернатива с похожей идеей: агент анализирует логи по сценариям, а решения о блокировке применяют отдельные «вышибалы» (bouncers) на файрволе, nginx или CDN. Главная особенность — общая база репутации: адреса, атакующие других участников, блокируются заранее.[4] Для веб-приложений также используют ограничение частоты запросов в nginx (`limit_req`), WAF и капчу.

## См. также

- [Файрвол (iptables, nftables)](https://llmdocs.ru/wiki/firewall.md)
- [SSH](https://llmdocs.ru/wiki/ssh.md)
- [journald и логи](https://llmdocs.ru/wiki/journald-logs.md)
- [Принцип наименьших привилегий](https://llmdocs.ru/wiki/least-privilege.md)

## Источники

1. [Fail2ban — репозиторий и wiki](https://github.com/fail2ban/fail2ban)
2. [Fail2ban — jail.conf (man page)](https://manpages.debian.org/stable/fail2ban/jail.conf.5.en.html)
3. [ArchWiki — fail2ban](https://wiki.archlinux.org/title/Fail2ban)
4. [CrowdSec Documentation](https://docs.crowdsec.net/)
5. [OpenSSH — sshd_config(5)](https://man.openbsd.org/sshd_config)
