fail2ban 默认不生效,因 jail.conf 中 sshd 的 enabled = false;需创建 jail.local 启用 sshd 并正确配置 logpath、maxretry 等参数,同时确保 backend 与系统防火墙匹配(如 systemd 或 auto),否则封禁无效。

fail2ban 装上不配置,等于没装——默认 jail.conf 里 [sshd] 是 enabled = false,服务跑着也封不了一个 IP。
安装失败或服务启动但不生效的常见原因
Debian/Ubuntu 直接 apt install fail2ban 即可;RHEL/CentOS/Rocky 必须先启用 EPEL,否则 dnf install fail2ban 会报“no package found”。源码安装则需确认 Python 3.5+ 可用,且 fail2ban-server 启动时调用的是 Python 3(CentOS 7 默认 Python 2,硬切会直接退出)。
装完立刻检查:sudo systemctl status fail2ban 显示 active ≠ 生效。真正关键看配置是否加载成功:
-
sudo fail2ban-client -t:语法校验,报错行会明确指出比如Invalid value 'true '(末尾多空格)或中文等号 -
sudo fail2ban-client get sshd logpath:必须返回真实存在的路径,如/var/log/auth.log(Debian)或/var/log/secure(RHEL),否则日志根本没在读 -
sudo ls -l /var/log/auth.log:确认文件存在且root可读;若权限为600且 fail2ban 以非 root 用户运行,会静默失败
必须创建 jail.local 并启用 [sshd]
别改 jail.conf,它每次升级可能被覆盖。执行:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
然后编辑 jail.local,确保有且仅有一处 [sshd] 段落,并包含:
-
enabled = true(注意:不能是True或yes,只认小写true) -
logpath = /var/log/auth.log(Debian/Ubuntu)或logpath = /var/log/secure(RHEL/CentOS/Rocky) -
maxretry = 3(允许两次手误,第三次才触发) -
findtime = 600(10 分钟窗口,比 60 秒更抗临时抖动) -
bantime = 3600(封 1 小时,避免永久封导致运维中断)
改完必须 sudo systemctl restart fail2ban,且重启前建议 sudo systemctl daemon-reload(尤其你动过 systemd service 文件)。
封禁没反应?检查 backend 和防火墙联动
Fail2ban 默认靠 iptables 封 IP,但新系统(如 Ubuntu 22.04+、Rocky 9)默认用 nftables。若不匹配,规则写不进内核,fail2ban-client status sshd 可能显示已封 IP,但 sudo iptables -L | grep <ip></ip> 找不到任何规则。
解决方法:在 jail.local 的 [DEFAULT] 段落加一行:
-
backend = systemd(推荐,兼容性好,不额外占 CPU) - 或
backend = auto(自动探测,但某些容器环境可能误判) - 别手动设
backend = polling,会持续扫日志,CPU 白耗
验证是否真封了:sudo nft list chain inet fail2ban filter_sshd(nftables)或 sudo iptables -L f2b-sshd(iptables)。
测试与日常维护的关键动作
输错三次密码后,立即执行:
-
sudo fail2ban-client status sshd:看Currently banned:是否 > 0,以及 IP 列表 -
sudo tail -n 20 /var/log/fail2ban.log:搜Ban关键字,确认时间戳和 IP 匹配 -
ssh -p 22 user@your-server(从被封 IP 连):应卡住或秒拒,不是密码错提示
解封某 IP:sudo fail2ban-client set sshd unbanip 192.0.2.100;想清空所有封禁:sudo fail2ban-client unban --all。
最易被忽略的一点:如果你改过 sshd_config 的 LogLevel(比如设成 VERBOSE 或 DEBUG),sshd 过滤器可能无法匹配日志格式,导致完全漏判——fail2ban 依赖标准 auth 日志字段,不是所有日志行都算“失败登录”。











