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

Fail2Ban 不是“装完就封 IP”的黑盒工具,而是一套依赖日志可读性、规则匹配准确性和防火墙动作生效的闭环防御系统。它真正起效的关键,在于让三件事严丝合缝:日志里得有失败记录、Fail2Ban 得看得懂这些记录、封禁命令得真能写进防火墙规则。
确保日志真实存在且路径正确
Fail2Ban 不会自动猜日志在哪。不同系统默认路径不同:
- Ubuntu/Debian:日志通常写入 /var/log/auth.log
- CentOS/RHEL/Rocky/AlmaLinux:日志默认在 /var/log/secure
但如果你改过 sshd_config 的 SyslogFacility,或禁用了 rsyslog,日志可能根本没生成。验证方法:
- 查实际路径:
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"(RHEL系)
如果无输出,说明 SSH 登录失败没记日志——需检查 /etc/rsyslog.conf 是否启用 authpriv.* 输出,并重启 rsyslog 和 sshd。
配置 jail.local 并精准启用 sshd 防护
不要直接改 jail.conf,而是创建本地覆盖文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local- 编辑
/etc/fail2ban/jail.local,定位到[sshd]区块
必须设置以下几项:
- enabled = true —— 启用该防护项
- logpath = /var/log/auth.log(或对应路径)—— 明确指定日志位置
- maxretry = 3 —— 3 次失败即触发封禁
- findtime = 600 —— 10 分钟滑动窗口内累计达上限才计数
-
bantime = 1h —— 封禁 1 小时(支持
s/m/h/d单位) - ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.5 —— 加入你常用运维 IP,防误封
确认后端适配与封禁动作真实生效
Fail2Ban 只负责调用命令,不保证命令存在或可用。新系统多用 nftables,旧系统可能用 iptables:
- 在
[DEFAULT]段添加 backend = systemd 或 backend = auto,确保兼容 - 验证封禁动作是否执行:
sudo fail2ban-client get sshd banactionnft(nftables)或sudo fail2ban-client get sshd banactioniptables(iptables) - 手动检查规则是否落地:
sudo nft list chain inet fail2ban filter_input 2>/dev/null | grep sshd或sudo iptables -L INPUT -n | grep f2b-
云服务器(如阿里云 ECS、AWS EC2)若禁用本地防火墙,只认安全组,则 Fail2Ban 默认封禁无效——此时需换用调用云 API 的 action,或放弃本地封禁策略。
验证效果与日常监控习惯
配置保存后必须重启并验证:
sudo systemctl restart fail2ban-
sudo fail2ban-client status sshd—— 查看已封 IP 数量和列表 -
sudo tail -f /var/log/fail2ban.log—— 实时观察 “Ban” 记录,确认封禁触发 - 模拟攻击测试(谨慎):从另一台机器反复输错密码,观察是否被封;再用
sudo fail2ban-client set sshd unbanip X.X.X.X解封
封禁逻辑是滑动时间窗口,不是“第 3 次输错就立刻拉黑”。例如前两次失败发生在 9 分钟前,第三次发生在当前,那这次不会触发封禁——这是设计使然,也是防误封的关键机制。

















