Fail2ban 插件装了但未封 SSH,主因是未启用 sshd 防护、日志路径错误、findtime/bantime 过短、云服务器安全组未限制或日志格式不匹配;需手动勾选 sshd、校准日志路径、调大封禁时长、配置安全组并验证 filter 规则。

Fail2ban 插件装了但没封 SSH,检查 sshd 服务是否被正确监控
Fail2ban 默认不会自动启用对 sshd 的防护,即使插件已安装并启动。宝塔面板的 Fail2ban 插件界面里,“防护服务”列表默认可能是空的,或者只勾选了 nginx 或 apache,而漏掉了最关键的 sshd。
实操建议:
- 进入宝塔面板 → 「安全」→「Fail2ban 防爆破」→ 点击右上角「设置」
- 在「防护服务」区域,确认
sshd已勾选(不是灰色禁用状态) - 检查「日志路径」是否为
/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian),路径错会导致无法读取登录失败记录 - 保存后点「重启 Fail2ban」,再手动执行
fail2ban-client status sshd查看是否显示Status: started和当前封禁 IP 数量
封禁后又被解封?查 bantime 和 findtime 配置是否过短
常见现象是:某 IP 在 5 分钟内失败 10 次,被封 10 分钟;但 10 分钟一到立刻重试,形成“封—解—再封”的无效循环。根本原因是默认配置太宽松,findtime(检测窗口)和 bantime(封禁时长)都只有 600 秒(10 分钟)。
实操建议:
- 编辑配置文件:
/www/server/fail2ban/etc/jail.local - 在
[sshd]段下添加或修改两行:findtime = 1800(30 分钟内累计失败即触发)bantime = 86400(封 24 小时,避免反复试探) - 改完后必须执行
fail2ban-client reload,不能只重启服务 - 验证:用错误密码连 SSH 多次,再运行
fail2ban-client status sshd,看Currently banned数量是否稳定增加
封了 IP 却还能连上宝塔?别忘了云服务器的安全组没同步拦截
Fail2ban 只作用于本机 iptables/nftables,它封的是服务器本地网络层。如果你用的是阿里云、腾讯云等厂商的云服务器,攻击者仍可能绕过 Fail2ban,直接通过公网 IP + 宝塔端口(如 8888)访问——因为安全组规则是独立于系统防火墙的,且优先级更高。
实操建议:
- 立即登录云厂商控制台(如阿里云 ECS 控制台 → 安全组 → 配置规则)
- 检查入方向规则中,是否开放了
8888、22等端口给0.0.0.0/0(即所有 IP) - 改为仅允许你自己的固定公网 IP 访问这些端口;若无固定 IP,至少限制为常用地区段(如国内 CIDR)
- 宝塔面板本身也支持「IP 访问限制」(面板设置 → 安全 → IP 访问限制),但该功能依赖面板进程,不如安全组底层可靠,只能作为第二道防线
为什么 fail2ban-client status sshd 显示 0 个被封,但日志里明明有大量失败记录?
最常见原因是日志格式不匹配。Fail2ban 依赖正则表达式从日志中提取“认证失败”事件,而不同系统发行版的 /var/log/secure 或 /var/log/auth.log 输出格式略有差异。例如 CentOS 7 日志含 Failed password,但某些精简版镜像或自定义 syslog 配置可能输出 Invalid user 或 Connection closed,而默认 filter 没覆盖。
实操建议:
- 先确认日志里真实存在的失败关键词:
grep -i "fail\|invalid\|closed" /var/log/secure | tail -20 - 查看当前 filter 规则:
cat /www/server/fail2ban/etc/filter.d/sshd.conf | grep -A5 "failregex" - 若关键词不在
failregex中,可临时追加一行,比如:failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure.*$ - 更稳妥的做法是启用宝塔内置的「日志分析」功能(安全 → 日志审计),它能可视化识别高频失败 IP,可作为 Fail2ban 的补充校验手段
sshd 监控开关这两个最容易被跳过的动作。

















