你的 VPS 日志里,大概率每天都有成千上万条失败的 SSH 登录尝试。攻击者用脚本疯狂猜密码、扫端口,这就是暴力破解。光靠设个强密码还不够——人家是拿字典和脚本反复试的。Fail2ban 能自动盯住这些失败记录:一旦某个 IP 在短时间内失败太多次,就自动把它拉进防火墙黑名单封禁一段时间。这篇文章让你把 Fail2ban 配成服务器的"自动门卫"。
一、Fail2ban 是做什么的
Fail2ban 的核心逻辑是:读日志 → 找规律 → 封 IP。
- 监控指定日志文件(如 SSH 登录日志)
- 用正则匹配"失败/登录失败/暴力"等特征
- 同一 IP 在一段时间内触发多次失败,就调用防火墙(iptables/nftables/firewalld)封禁它一段时间
- 到期后自动解封
它对 SSH、Nginx、Apache、vsftpd、Postfix 等都内置了现成规则,开箱即用。
二、安装 Fail2ban
Ubuntu / Debian:
apt update
apt install -y fail2ban
CentOS / AlmaLinux:
yum install -y fail2ban
启动并设置开机自启:
systemctl enable fail2ban
systemctl start fail2ban
三、基本配置(推荐用 .local 文件)
Fail2ban 的主配置在 /etc/fail2ban/jail.conf。官方建议不要直接改它,而是新建 /etc/fail2ban/jail.local,覆盖自定义项(以后升级不会被覆盖)。
先启用 SSH 防护:
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h # 封禁时长:1 小时(可按需,如 86400 封一天)
findtime = 10m # 在 10 分钟内统计失败次数
maxretry = 3 # 失败 3 次就触发封禁
[sshd]
enabled = true
bantime:封多久findtime:统计窗口maxretry:窗口内失败多少次触发
保存后重启:
systemctl restart fail2ban
四、验证是否生效
# 查看有哪些 jail 在运行
fail2ban-client status
# 查看 sshd jail 的状态和已封 IP
fail2ban-client status sshd
第一次跑,Currently banned 可能为 0,属正常。出现这种日志即生效:[sshd] Found 1.2.3.4。
查看被禁止的 IP 列表:
fail2ban-client set sshd banip 1.2.3.4 # 手动封
fail2ban-client set sshd unbanip 1.2.3.4 # 手动解封
五、屏蔽 Nginx 暴力请求 / 防 CC
Fail2ban 也能防网站被刷。Nginx 访问日志里异常请求(大量 404、402、连续 POST)可触发封禁。在 jail.local 里加一个 nginx 规则(需要对应 filter):
# 简单示例:盯日志里出现带恶意特征的访问
[nginx-cc]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
不同系统 Nginx 日志路径可能不同(宝塔在 /www/wwwlogs/)。更精确的 CC 防护建议用本站的 Nginx 限流限速 教程从接入层控制,Fail2ban 作为兜底一起用。
六、结合防火墙使用说明
Fail2ban 通过防火墙规则封 IP。不同系统底层不同:
- Debian/Ubuntu 用 iptables/nftables
- CentOS 8+ 用 firewalld
安装后默认自动适配,一般无需额外配置。若防火墙版本差异导致封不了,可装对应后端插件(python3-pyfwa 等)。
七、避免误伤:白名单设置
家庭/办公宽带可能动态换 IP,把自己封了会很尴尬。在 jail.local 里加白名单:
[DEFAULT]
ignoreip = 127.0.0.1/8 你自己家的公网IP
把自己的 IP 写进去,Fail2ban 不会封它。其他家宽用户偶尔被误封,把 maxretry 或 bantime 调宽松些,或加白名单。
八、查看封禁日志与排查
日志位置因发行版而异,通常看:
journalctl -u fail2ban -n 50 # systemd 日志
# 或
cat /var/log/fail2ban.log
重点看有没有 Found ...(命中失败)、Ban ...(封禁)、Unban ...(解封)记录。
若规则不生效,先确认:
- jail 的 enabled = true 写对了没
- logpath 指向的日志文件真实存在、有内容
- 重启过 fail2ban
九、与 SSH 加固配合
Fail2ban 是"事后拦截",最好先做 SSH 本身的加固:改用密钥登录、关闭 root 直接登录、必要时改端口(参考本站 SSH 安全加固教程)。密钥登录几乎无法被爆破,Fail2ban 主要在那些还用密码/遇到其他服务的场景兜底,两者是黄金组合。
十、常见问题
Q1:封不住,日志一直报错?
多半是 logpath 指向的文件不存在,或 /var/log/auth.log 等文件权限/路径不对。用 ls -l /var/log/ 确认,改对路径后重启 fail2ban。
Q2:想封久一点?
把 bantime 调大,如 bantime = 86400(秒=24 小时)或 bantime = 7d。也可以配合 pulls 让同一 IP 二次触发直接封更久。
Q3:把自己封了进不去服务器?
用云厂商的 VNC/控制台/noVNC 进服务器,fail2ban-client unbanip 你的IP 解封自己再连。这也是为什么建议先设白名单。
Q4:改了配置不生效?
改 jail.local 后必须 systemctl restart fail2ban。且每次改完用 fail2ban-client status sshd 确认状态没异常。
Q5:服务器 CPU 被 fail2ban 拖累?
正常情况 fail2ban 占用极低。若日志量极大(被疯狂刷),先配合 Nginx 限流、iptables 在前面挡,减少进入 fail2ban 的流量。
总结
Fail2ban 是服务器防暴力破解的标配:读日志 → 匹配失败特征 → 自动封 IP,异常流量到不了你面前就被挡在防火墙外面。核心配置就 bantime / findtime / maxretry 三个参数,先启好 sshd 和 nginx 两个 jail,再设好白名单防误伤。配合 SSH 密钥加固和 Nginx 限流一起用,暴力破解基本就失效了。
