大多数场景下不需要手写正则,Fail2ban 自带的 sshd 监狱已经覆盖了主流发行版的日志格式,优先调整封禁阈值和时长比修改正则更稳妥。但如果默认规则无法匹配你的系统日志(如修改了 SSH 端口或日志格式),则需自定义正则。
先说结论:除非默认规则无法匹配你的系统日志,否则不建议自定义正则,优先配置 jail.local 中的参数。若必须修改,请务必使用 fail2ban-regex 测试。
- 先判断:确认系统日志路径和 SSH 日志格式是否标准
- 优先做:使用 fail2ban-regex 工具测试匹配效果
- 再验证:查看封禁状态和日志确认动作生效
安装与基础配置
如果你使用的是 Debian/Ubuntu 系统,可以直接执行以下命令安装并启用默认 SSH 防护:
sudo apt update && sudo apt install fail2ban sudo systemctl enable fail2ban && sudo systemctl start fail2ban
CentOS/RHEL 系统则使用 yum 或 dnf 安装,日志路径通常为 /var/log/secure,配置逻辑相同。
配置 jail.local
不要直接修改 jail.conf,而是创建或编辑 /etc/fail2ban/jail.local,这样升级时不会覆盖配置:
[sshd] enabled = true port = ssh logpath = %(sshd_log)s maxretry = 5 bantime = 3600
如果默认日志路径不对,需要手动指定 logpath 为上面确认的实际路径。
如何编写自定义正则
如果默认 filter 无法匹配日志,需要自定义正则。不要直接修改 filter.d/sshd.conf,而是创建本地覆盖文件:
sudo cp /etc/fail2ban/filter.d/sshd.conf /etc/fail2ban/filter.d/sshd.local
编辑 sshd.local,在 [Definition] 段添加或修改 failregex。例如匹配特定的失败日志:
[Definition] failregex = ^.*Failed password for .* from <HOST>.*$
注意:<HOST> 是 Fail2ban 识别 IP 的关键占位符,必须保留。修改后务必测试。
测试正则匹配
在重启服务前,务必使用内置工具测试正是否能匹配日志:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.local
观察输出中的 Matched 行数,如果有数据说明正则生效,如果为 0 则需要检查日志格式或 filter 配置。
重启与验证
配置确认无误后重启 Fail2ban:
sudo systemctl restart fail2ban
查看监狱状态,确认当前是否有被禁 IP:
sudo fail2ban-client status sshd
输出中 Should be banned 或 Currently banned 如果有数字,说明已经触发过封禁。根据不同防火墙后端,验证命令如下:
- iptables: sudo iptables -nL | grep fail2ban
- firewalld: sudo firewall-cmd `--list-all` | grep fail2ban
- nftables: sudo nft list ruleset | grep fail2ban
如果在列表中看到对应的 IP 段,说明封禁动作已执行。
常见坑
1. 日志轮转导致失效
如果日志被 logrotate 切割,Fail2ban 可能无法继续读取旧文件,确保配置中启用了 findmode 或系统日志服务正常。
2. 把自己封禁
测试时不要在自己的 IP 上频繁输错密码,一旦被封禁,解封需要等待 bantime 过期或通过命令行手动 unban。
3. systemd 与 syslog 差异
较新的系统使用 systemd-journald 记录日志,路径可能不是传统文件,此时需要配置 journalmatch 而不是 logpath,具体需参考系统文档。
4. 正则性能问题
自定义正则如果过于复杂(如大量回溯),在高并发日志写入时会消耗大量 CPU,优先使用官方提供的 filter 扩展。