🌐 第06章 · 防暴力破解
fail2ban 配置与排查
防暴力破解¶
公网服务器只要开着 22 端口,就会不断被人脚本化地爆破用户名密码。fail2ban 通过分析日志,把尝试次数超限的 IP 自动封禁,是防暴力破解的标配。这一章讲它的工作原理、本机配置与排查方法。
为什么要防暴力破解¶
fail2ban 是一个日志驱动的防护工具:它持续读取服务的日志文件,一旦发现某个 IP 在指定时间内认证失败的次数超过阈值,就用防火墙规则临时封禁那个 IP。本机当前只开了 sshd 一个 jail。
fail2ban-client status # 查看所有 jail
fail2ban-client status sshd # 查看 sshd jail 状态
Status for the jail: sshd
|- Filter
| `- Currently failed: 0
| `- Total failed: 3
| `- File list: /var/log/auth.log
`- Actions
`- Currently banned: 0
`- Total banned: 0
提示 从输出能看到
fail2ban的关键三要素:监控哪个日志(File list)、匹配哪种失败(Filter)、做什么动作(Actions,即封禁)。三者一组合就构成一个 jail。
工作原理三步曲¶
日志匹配:/var/log/auth.log 出现 "Failed password for ..." → 触发 Filter
计数判定:60s 内同 IP 失败 N 次 → 超过 maxretry
执行动作:调用 ufw/iptables 封禁该 IP → bantime 后自动解封
| 概念 | 含义 | 本机参考 |
|---|---|---|
jail |
一套"日志+规则+封禁"的组合 | sshd |
filter |
用正则从日志里挑"失败"事件 | sshd.conf |
btime / maxretry / findtime |
封多久 / 失败几次才封 / 多长窗口 | 常见 600s / 5次 / 10m |
action |
封禁时执行的命令 | 调用 ufw 或 iptables |
ignoreip |
永不封禁的 IP(比如你自己) | 务必加管理员 IP |
配置 jails:jail.local¶
不改原始 jail.conf,而是用 /etc/fail2ban/jail.local 覆盖,这样升级不会丢配置。
# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 你的管理员IP/32 # 白名单,千万别把自己封了
bantime = 1h # 封禁1小时
findtime = 10m # 10 分钟窗口
maxretry = 5 # 窗口内失败 5 次即封
backend = auto
destemail = admin@bangdream.xyz
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
易错点
ignoreip一定要填上你自己的固定 IP,否则 fail2ban 可能在你输错一次密码后把你自己也封掉,导致远程失联。生产服务器务必先加白名单再启用。
起停与重载¶
systemctl enable --now fail2ban # 开机自启并立即启动
systemctl restart fail2ban # 修改配置后重启(注意:这会重新加载全部 jail)
systemctl reload fail2ban # 优先 reload,只重配不中断
fail2ban-client reload sshd # 只重载单个 jail
提示 改完
jail.local用fail2ban-client reload即可,不必restart整个服务,减少中断。systemctl restart fail2ban会清空当前已封列表,慎用于生产。
手动管理封禁¶
有些时候需要手动封一个 IP、或解封自己,直接命令操作:
fail2ban-client status sshd # 看当前封禁情况
fail2ban-client set sshd banip 1.2.3.4 # 手动封禁某 IP
fail2ban-client set sshd unbanip 1.2.3.4 # 手动解封某 IP
fail2ban-client get sshd banip # 列出被封 IP
tail -f /var/log/fail2ban.log # 实时看封禁日志
排查封禁问题¶
封禁不生效或误杀,从这几处看:
journalctl -u fail2ban -n 50 # 看服务本身有无报错
tail -n 20 /var/log/fail2ban.log # 看封禁/解封日志
ss -tlnp | grep 22 # 确认端口正常
ufw status # 确认与 ufw 联动正常(见第3章)
查看 /etc/fail2ban/jail.local 与 /etc/fail2ban/jail.d/ 目录,确认没有多个配置文件互相覆盖。常见问题:
| 现象 | 原因 | 处理 |
|---|---|---|
| fail2ban 不封 | 日志路径/正则不对 | 检查 logpath 与 auth.log 是否存在 |
| 自己被封 | ignoreip 没配 |
加上本机与管理 IP,再 unbanip |
| 误封正常用户 | maxretry 设太小 |
适当调大,或加白名单 |
| 封了但没生效 | 后端不匹配(uew vs iptables) | 确认 fail2ban 用哪个 action |
| 解封失败 | 手动 ban 与自动封混用 | 用 fail2ban-client unbanip |
与 ufw 联动¶
fail2ban 默认封装了一套 action(iptables / ufw 两种)。如果本机用 ufw,在 action 相关配置里指定 ufw 后端,封禁就会写入 ufw 规则。注意 fail2ban 的封禁和 ufw/云安全组是互为补充的三层防线(见第 8 章)。
易错点
maxretry别设太激进(比如 2 次),容易把你的运维同事、自动发错误的脚本误封。常用值是5–10。生产上建议bantime长一些(几十分钟到几小时),让爆破成本更高。
易错点¶
- 先配
ignoreip白名单再启用:否则易把自己封掉失联。 - 改配置用
reload不用restart:restart 会清空已封列表且中断服务。 - 日志路径必须存在且可读:
logpath写错,sefsor 匹配不到任何失败,永远不封。 - 别只靠 fail2ban:它防的是"弱密码被爆破";密钥登录 + 禁用密码才是根本(见第 5 章)。
- 公开 22 端口就装 fail2ban + 白名单:这是公网服务器最低成本的自我保护。
相关命令¶
fail2ban-client、fail2ban-regex(调试正则)、journalctl、tail、ufw。配置文件:/etc/fail2ban/jail.local、/etc/fail2ban/filter.d/*.conf、/etc/fail2ban/action.d/。