Вопрос из обсуждения. «Поставил fail2ban для sshd. В его логе почти пусто, в правилах брандмауэра ничего похожего не вижу. Работает ли он вообще?»
Как проверить за минуту.
fail2ban-client status: список активных jail. Еслиsshdтам нет, защита SSH не включена.fail2ban-client status sshd: число проверенных строк лога, число неудачных попыток, число забаненных адресов и их список. На любом сервере с публичным адресом через сутки в бане будут десятки и сотни адресов; ноль значит, что fail2ban не видит журнал.- Правила брандмауэра:
iptables -L f2b-sshd -nили, на системах с nftables,nft list table inet f2b-table. Пустой вывод при непустом списке банов означает, что действие бана не применяется. - Сам журнал:
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.