用 Fail2ban 防御密码暴力破解
如何安装和配置 Fail2ban:拦截 SSH 和 Web 表单暴力破解,将自己的地址加入白名单,检查是否生效,以及如何为自己解封。
更新于 2026年8月23日
Fail2ban 会读取日志,统计来自同一地址的失败登录尝试次数,并通过防火墙规则临时封禁该地址。它不能替代密钥登录,但能挡掉大部分后台暴力破解流量,减轻日志负担。
安装与基本配置
apt install -y fail2ban
请使用您自己的文件 /etc/fail2ban/jail.local——对 jail.conf 的修改会在更新时被覆盖:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 203.0.113.5
banaction = ufw
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 24h
systemctl enable --now fail2ban
fail2ban-client status
fail2ban-client status sshd
把您的家庭或办公地址填入 ignoreip——这是防止把自己封禁的保险。如果您的地址发生变化,面板中 /hosting/vds/m/<id> 的控制台仍是您的安全网:它不受网络和规则影响,始终可用。
banaction 必须与您的防火墙匹配:ufw 使用 ufw,nftables 使用 nftables-multiport。
在哪里查看结果
fail2ban-client status sshd
tail -f /var/log/fail2ban.log
journalctl -u fail2ban -n 50
状态中会显示失败尝试次数和被封禁地址列表。对于公网地址,每天数百次属于正常现象,并不代表遭受了针对性攻击。
解封某个地址(包括您自己的):
fail2ban-client set sshd unbanip 203.0.113.5
SSH 之外的防护
Fail2ban 可以处理任何记录失败尝试的日志。
[nginx-http-auth]
enabled = true
[nginx-limit-req]
enabled = true
logpath = /var/log/nginx/error.log
[postfix-sasl]
enabled = true
对于您自己的应用,需要编写一个过滤器——即 /etc/fail2ban/filter.d/ 目录下的文件,其中包含一个正则表达式,并将地址标记为 <HOST>:
[Definition]
failregex = ^.*login failed.*ip=<HOST>.*$
ignoreregex =
用真实日志测试该表达式:
fail2ban-regex /var/log/myapp.log /etc/fail2ban/filter.d/myapp.conf
此命令会显示匹配的行数。匹配数为零说明规则有误——而默默失效的防护比没有防护更糟。
常见错误
| 错误 | 后果 | 解决方法 |
|---|---|---|
修改 jail.conf | 更新后丢失 | 写入 jail.local |
您的地址不在 ignoreip 中 | 总有一天会把自己封禁 | 添加该地址,或通过面板控制台连接 |
banaction 与您的防火墙不匹配 | 封禁不会生效 | 与 ufw 或 nftables 保持一致 |
| 过滤器与日志格式不匹配 | 防护静默失效 | 用 fail2ban-regex 检查 |
| 服务无法读取 systemd 日志 | 状态为空 | 设置 backend = systemd |
实际测试一下:从外部地址故意输错密码达到规定次数,确认该地址出现在封禁列表中。未配置好的 fail2ban 会带来虚假的安全感。
再配合防火墙本身的连接速率限制——ufw limit 22/tcp——即可完善防护。