使用 Fail2ban 自动封禁 SSH 爆破攻击怎么配置正则?

文章导读
大多数场景下不需要手写正则,Fail2ban 自带的 sshd 监狱已经覆盖了主流发行版的日志格式,优先调整封禁阈值和时长比修改正则更稳妥。但如果默认规则无法匹配你的系统日志(如修改了 SSH 端口或日志格式),则需自定义正则。
📋 目录
  1. A 安装与基础配置
  2. B 配置 jail.local
  3. C 如何编写自定义正则
  4. D 测试正则匹配
  5. E 重启与验证
  6. F 常见坑
A A

大多数场景下不需要手写正则,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 的关键占位符,必须保留。修改后务必测试。

测试正则匹配

在重启服务前,务必使用内置工具测试正是否能匹配日志:

使用 Fail2ban 自动封禁 SSH 爆破攻击怎么配置正则?
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 扩展。