Fail2ban установлен, но банит ли он кого-нибудь? Как проверить и почему на новых системах он может молчать

Вопрос из обсуждения. «Поставил fail2ban для sshd. В его логе почти пусто, в правилах брандмауэра ничего похожего не вижу. Работает ли он вообще?»

Как проверить за минуту.

  1. fail2ban-client status: список активных jail. Если sshd там нет, защита SSH не включена.
  2. fail2ban-client status sshd: число проверенных строк лога, число неудачных попыток, число забаненных адресов и их список. На любом сервере с публичным адресом через сутки в бане будут десятки и сотни адресов; ноль значит, что fail2ban не видит журнал.
  3. Правила брандмауэра: iptables -L f2b-sshd -n или, на системах с nftables, nft list table inet f2b-table. Пустой вывод при непустом списке банов означает, что действие бана не применяется.
  4. Сам журнал: journalctl -u ssh | grep -c "Failed password" или grep -c "Failed password" /var/log/auth.log. Если неудачные попытки есть, а fail2ban их не считает, проблема в источнике данных.

Почему fail2ban может «не видеть» попытки.

  • Нет файла лога. На Ubuntu 22.04+ и Debian 12 rsyslog может быть не установлен, и /var/log/auth.log не существует. В /etc/fail2ban/jail.local для [sshd] указать backend = systemd, тогда fail2ban читает журнал systemd напрямую.
  • Нестандартный порт SSH. Фильтр попытки видит, но правило бана создаётся на порт ssh из /etc/services. Указать port = 2222 в секции jail.
  • Свой адрес в ignoreip. Полезно для админского адреса, но проверять бан с него бессмысленно.
  • Ключи вместо паролей. Если парольный вход выключен, попыток «Failed password» почти нет: боты отваливаются раньше, в журнале Connection closed by authenticating user или Invalid user. Современный фильтр sshd с mode = aggressive ловит и их.

Почему бан не применяется.

  • На системе с nftables и без iptables-legacy действие по умолчанию iptables-multiport ничего не делает. Указать banaction = nftables-multiport (и banaction_allports = nftables-allports) в [DEFAULT].
  • ufw как основной брандмауэр: banaction = ufw, иначе правила fail2ban и ufw живут в разных цепочках и порядок применения непредсказуем.

Разумные параметры для sshd. maxretry = 5, findtime = 10m, bantime = 1h с bantime.increment = true, чтобы повторные визитёры получали удвоение. Слишком агрессивные настройки в первую очередь бьют по вам самим после смены пароля.

Настройка описана в документации fail2ban.