Skip to content
VDS · 安全

用 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——即可完善防护。