Fail2ban запущен, jail sshd активен, а после пяти неверных паролей никто не забанен: фильтр, путь к логу и расхождение времени

Что было. На Debian настроен fail2ban: 5 попыток, бан на 3 часа. Автор вводит неверный пароль по SSH пять и более раз, а система продолжает спрашивать пароль, бана нет.

Что советовали участники (сводка, каждая причина встречается регулярно):

  1. Фильтр не совпадает со строками лога. fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf показывает, сколько строк распознано. Ноль означает, что формат записей sshd (версия OpenSSH, LogLevel) не совпадает с фильтром; обновить fail2ban или использовать режим mode = aggressive в jail.
  2. Неверный logpath или отсутствующий лог. На системах без rsyslog файла auth.log нет; нужен backend = systemd. Об этом есть отдельный разбор про проверку fail2ban.
  3. Правки в jail.conf затираются обновлением; настройки должны быть в jail.local или jail.d/*.conf. Проверить, что jail действительно включён: enabled = true под [sshd].
  4. Расхождение времени. fail2ban сравнивает метки времени в логе с системным временем: если часовой пояс лога и системы различаются или часы сбиты, попытки выглядят «старыми», не попадают в findtime, и счётчик не набирается. Проверка: date против последней строки лога; timedatectl.
  5. Слишком короткий findtime для ручного теста (по умолчанию 10 минут; при медленном вводе пять попыток растягиваются) либо ваш адрес в ignoreip.
  6. Несколько попыток в одном соединении считаются по-разному: клиент OpenSSH делает до трёх попыток за подключение, и sshd пишет одну строку Failed password на каждую, но maxretry считает строки, а не соединения. Пять строк набираются за два подключения.

Как проверить результат, не полагаясь на ощущения.

fail2ban-client status sshd            # Currently failed / Currently banned
fail2ban-client get sshd findtime
tail -f /var/log/fail2ban.log           # Found <ip> ... Ban <ip>

Строки Found означают, что фильтр видит попытки; отсутствие Ban при достаточном числе Found означает проблему с maxretry/findtime; отсутствие Found означает проблему с логом или фильтром.

Важное замечание из обсуждения. Часть участников резонно заметила: с отключённой парольной аутентификацией перебор теряет смысл, а fail2ban становится лишь средством уменьшения шума в логах. Ключи первичны, fail2ban вторичен.

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