Настройка fail2ban на Debian

Fail2ban блокирует IP после N неудачных попыток входа. На Debian 12+ есть подвох: journald вместо классического /var/log/auth.log.

Установка

sudo apt install -y fail2ban

После установки стартует сам, но без настроенных jail-ов ничего не делает.

Главная gotcha: Debian 12 и journald

Debian 12 (Bookworm) пишет логи в systemd journal, а не в /var/log/auth.log. Если настроить fail2ban по старым гайдам с logpath, он упадёт:

ERROR  Failed during configuration: Have not found any log file for sshd jail

Решение — backend = systemd вместо logpath:

[sshd]
enabled = true
backend = systemd    # <-- ключевой момент для Debian 12+

Проверьте свою систему

Если файл /var/log/auth.log существует — можно использовать классический logpath. Если нет (стандарт для Debian 12 minimal) — только backend = systemd.

Конфигурация

Конфиг — в /etc/fail2ban/jail.local (jail.conf не трогать — перезатрётся при обновлении):

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = ufw
 
[sshd]
enabled = true
port = 22
filter = sshd
backend = systemd
maxretry = 3
bantime = 86400

Параметры

ПараметрОписаниеПример
bantimeВремя бана в секундах86400 (24 часа)
findtimeОкно поиска неудачных попыток600 (10 минут)
maxretryЧисло попыток до бана3
banactionДействие при банеufw или iptables-multiport
backendИсточник логовsystemd для Debian 12+
portПорт сервисаЕсли SSH на нестандартном порту — указать

Выбор banaction

Firewallbanaction
UFWufw
iptablesiptables-multiport
firewalldfirewallcmd-rich-rules

Проверка

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 1.2.3.4   # разбанить вручную

fail2ban в Docker?

Для SSH — ставить на хосте. В контейнере нужны --net=host, --cap-add=NET_ADMIN, монтирование /var/log — теряется смысл изоляции.

Для Docker-сервисов (nginx, веб-приложения) есть crazymax/fail2ban, но это сложнее: проброс логов, настройка chain в iptables.

Связанные заметки