Fail2ban需日志路径正确、正则匹配准确、防火墙动作真实生效三者缺一不可;须确认SSH日志位置(如Ubuntu用/var/log/auth.log、CentOS用/var/log/secure),验证失败记录存在,配置jail.local启用sshd并设maxretry=3、findtime=600、bantime=1h,检查banaction对应防火墙命令可用,最后reload服务并用fail2ban-client status sshd和tail -f /var/log/fail2ban.log验证全流程。

Fail2ban 不是装上就封 IP 的“自动开关”,它靠实时读 SSH 日志、匹配失败模式、再调用防火墙动作三步联动生效。关键在日志路径对、规则准、动作真落地。
确认 SSH 日志真实位置并确保有失败记录
Fail2ban 只能分析它看得到的日志。不同系统默认路径不同:
- Ubuntu/Debian:/var/log/auth.log
- RHEL/CentOS/Rocky 8+:/var/log/secure
- 若启用了 journald 且未落盘日志,需改用 backend = systemd,并验证 journalctl -u ssh | grep "Failed" 能输出内容
执行命令检查是否有真实失败记录:
sudo tail -20 /var/log/auth.log | grep "Failed password"(Ubuntu)
sudo tail -20 /var/log/secure | grep "Failed"(CentOS)
如果无输出,说明日志没写入——需检查 /etc/rsyslog.conf 中 authpriv.* 是否指向正确路径,并重启 rsyslog 和 sshd。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
配置 jail.local 启用并调优 SSH 防护
切勿直接改 jail.conf,先复制生成本地配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 /etc/fail2ban/jail.local,定位到 [sshd] 区块,确保以下设置合理:
- enabled = true —— 必须开启
- maxretry = 3 —— 3 次失败即响应,兼顾灵敏与防误触
- findtime = 600 —— 10 分钟滑动窗口,适应持续扫描节奏
- bantime = 1h —— 封禁 1 小时,足够打断自动化脚本;如需更严可设为 1d 或 -1(永久)
- ignoreip 填入你常用运维 IP,例如:127.0.0.1/8 ::1 203.0.113.55 192.168.1.0/24
- logpath 必须与上一步确认的日志路径一致
匹配防火墙后端并验证封禁是否真正生效
Fail2ban 只负责发指令,封禁靠底层防火墙。常见失灵原因就是命令没跑通:
- 查当前动作:sudo fail2ban-client get sshd banaction(返回 iptables/nftables/firewallcmd 等)
- 若返回 iptables,但系统无该命令 → 安装:sudo apt install iptables(Debian)或 sudo dnf install iptables(RHEL)
- 若返回 nftables,运行:sudo nft list chain inet fail2ban filter_input 2>/dev/null | grep sshd,看是否有规则
- 云服务器(如 AWS、阿里云 ECS)通常禁用本地防火墙,只认安全组 → 此时本地 fail2ban 封禁无效,需改用 API action 或依赖安全组+告警人工干预
重启服务并快速验证全流程是否打通
配置保存后必须 reload 才生效:
- 重启服务:sudo systemctl restart fail2ban
- 查状态:sudo fail2ban-client status sshd(应显示 active jails 数 > 0)
- 盯日志:sudo tail -f /var/log/fail2ban.log,看到 Running exec action ban 表示链路通了
- 手动测试(谨慎):从另一台机器故意输错密码 3 次,再尝试连接,应被拒绝;随后查 iptables/nft 规则是否新增对应条目

















