linux-labs

Вики / Службы и systemd

fail2ban

Сервис Ubuntu 24.04 · fail2ban 1.0 СлужбыБезопасностьЛоги

Бан по логам — защита SSH и сервисов от перебора; jail'ы, статус, разбан.

fail2ban читает логи сервисов, ловит признаки атаки (например, неудачные входы по SSH) и временно банит IP через файрвол. Служба fail2ban под systemd.

systemctl status fail2ban
sudo fail2ban-client status        # список активных jail'ов
sudo fail2ban-client status sshd   # детали jail sshd (забаненные IP)

Не правь jail.conf — создай jail.local (переживает обновления пакета):

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h          # на сколько банить (поддерживает 10m, 1h, 1d)
findtime = 10m         # окно, в котором считаем попытки
maxretry = 5           # сколько промахов до бана
ignoreip = 127.0.0.1/8 10.0.0.0/24    # белый список (свои сети!)
backend  = systemd     # в Ubuntu логи SSH часто в journald

[sshd]
enabled = true

[recidive]             # бан повторных нарушителей надолго
enabled  = true
bantime  = 1w
findtime = 1d
maxretry = 5
sudo systemctl restart fail2ban
sudo fail2ban-client status               # все jail'ы
sudo fail2ban-client status sshd          # кто забанен, счётчики
sudo fail2ban-client set sshd unbanip 1.2.3.4   # разбанить
sudo fail2ban-client set sshd banip 1.2.3.4     # забанить вручную
sudo fail2ban-client get sshd bantime     # текущее значение параметра
sudo fail2ban-client reload               # перечитать конфиг
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf   # тест фильтра
journalctl -u fail2ban -f                 # лог решений

Для своего сервиса: фильтр (regex с группой <HOST>) + jail:

# /etc/fail2ban/filter.d/myapp.conf
[Definition]
failregex = ^.*authentication failed from <HOST>.*$

# /etc/fail2ban/jail.local
[myapp]
enabled  = true
logpath  = /var/log/myapp/access.log
maxretry = 4

Проверь регуляркой до включения: fail2ban-regex <лог> <фильтр> (покажет, сколько совпадений поймал).

Забанил сам себя

С консоли (гипервизор/serial) или с разрешённого IP: fail2ban-client set sshd unbanip <твой IP>. Добавь свою сеть в ignoreip.

Jail не банит

  • enabled = true? fail2ban-client status показывает jail?
  • Верный logpath и фильтр под формат логов; в Ubuntu SSH часто в journald — нужен backend = systemd.
  • Проверь фильтр: fail2ban-regex на реальном логе — ловит ли строки.

Банит, но атака продолжается с других IP

Это распределённый брутфорс. Включи recidive, ужесточи maxretry/findtime, рассмотри гео/ASN-блок на firewall (см. whois для CIDR).

Не уверен, работает ли вообще

fail2ban-client status sshd → Total/Currently failed и banned. journalctl -u fail2ban покажет «Ban»/«Unban».

sudo fail2ban-client status              # jail'ы
sudo fail2ban-client status sshd         # забаненные
sudo fail2ban-client set sshd unbanip IP # разбан
sudo fail2ban-regex LOG FILTER           # тест фильтра
# jail.local: bantime/findtime/maxretry/ignoreip/backend=systemd ; [recidive]

См. также