fail2ban不是开箱即用工具,必须确保日志路径正确、防火墙命令可用、配置修改后执行reload三者缺一不可;否则无法触发ip封禁。

fail2ban 不是装上就自动封 IP 的“开箱即用”工具,它必须准确读取日志、匹配失败模式、调用防火墙生效,三者缺一不可。多数人配置失败,卡在日志路径错、后端命令缺失或 reload 没执行这三步。
确认 SSH 日志路径和 Fail2ban 是否真在监听
Fail2ban 不会自己猜日志在哪。Debian/Ubuntu 默认写入 /var/log/auth.log,RHEL/CentOS 默认写入 /var/log/secure,但如果你改过 sshd_config 的 SyslogFacility 或禁用了 rsyslog,日志可能根本没落地——此时 fail2ban-client status sshd 会显示 0 active jails 或报 Invalid command。
- 先查 SSH 实际日志位置:
sudo grep -r "auth.*log\|secure" /etc/ssh/sshd_config /etc/rsyslog.conf 2>/dev/null - 再验证日志里有没有失败记录:
sudo tail -20 /var/log/auth.log | grep "Failed password"(Ubuntu)或sudo tail -20 /var/log/secure | grep "Failed"(CentOS) - 如果没输出,说明 SSH 失败没记日志,得先修日志:确保
/etc/rsyslog.conf含*.info;mail.none;authpriv.none;cron.none /var/log/messages,且authpriv.* /var/log/secure(RHEL)或对应auth.log行启用 - 改完记得
sudo systemctl restart rsyslog && sudo systemctl restart sshd
检查 banaction 是否可用、规则是否真进防火墙
Fail2ban 默认用 iptables 或 nftables 封禁,但它只负责“调用命令”,不负责“命令是否存在”。现象是日志里有 Running exec action ban,但你从另一台机器仍能 ssh 连上——大概率防火墙规则压根没加进去。
- 查当前用的后端:
sudo fail2ban-client get sshd banaction,返回iptables就去查iptables命令;返回nftables就查nft命令 - 手动验证命令可用性:
sudo iptables -L INPUT -n | grep f2b-(iptables)或sudo nft list chain inet fail2ban filter_input 2>/dev/null | grep sshd(nftables) - 若命令不存在:
sudo apt install iptables或sudo apt install nftables(Ubuntu/Debian);sudo yum install iptables-services(CentOS 7);sudo dnf install iptables-nft(CentOS 8+) - 云服务器(如 AWS EC2、阿里云 ECS)常禁用本地 iptables/nftables,只认安全组——此时
fail2ban封禁无效,必须换 action(如调用云 API)或放弃本地封禁
验证封禁逻辑是否按滑动窗口工作
很多人设了 maxretry = 3、findtime = 10m,却以为“输错 3 次就立刻封”,其实不是:Fail2ban 是滑动时间窗口统计,前两次失败在 9 分钟前,第三次在现在,那这次不算“3 次”,要等第 4 次才触发。不验证,永远不知道阈值是不是形同虚设。
- 从客户端快速重试(别等超时):
ssh -o ConnectTimeout=3 -o BatchMode=yes user@your-server,输错密码后Ctrl+C,重复 3–4 次 - 同时开两个终端:一个实时看封禁日志:
sudo tail -f /var/log/fail2ban.log;另一个查状态:sudo fail2ban-client status sshd - 观察日志中是否出现
Found xxx.xxx.xxx.xxx和Ban xxx.xxx.xxx.xxx;状态里Currently banned数量是否增加 - 注意
bantime单位:设成1h会被解析为 3600 秒;设成-1才是永久封禁;设成600就是 10 分钟
为什么 jail.local 改了但不生效?reload 是关键动作
编辑 /etc/fail2ban/jail.local 后,systemctl restart fail2ban 并非必须,但 sudo fail2ban-client reload 是强制要求。因为 Fail2ban 进程是长驻的,它只在 reload 时重新加载配置并重建 jail,否则新配置只是磁盘文件,内存里还是旧的。
- 改完
jail.local必须执行:sudo fail2ban-client reload - 如果 reload 报错(如语法错误),会提示具体哪行出问题,比如
logpath = /var/log/auth.log后多了一个空格,或漏了enabled = true - reload 成功后,再跑
sudo fail2ban-client status sshd,应看到Status为Started,且Number of jail≥ 1 - 别用
systemctl restart fail2ban替代 reload——它会中断正在封禁的 IP,导致部分封禁丢失
真正卡住人的,从来不是“怎么写配置”,而是“日志没写进来”“防火墙命令根本不存在”“改完没 reload”。这三个点不逐个敲实,所有参数调得再细也没用。











