Set up Fail2Ban for Nginx on a VPS

任何暴露在互联网上的 VPS 都在不断被机器人扫描和探测,尤其是运行 Nginx 的网站。Fail2Ban 会自动屏蔽这些 IP。本指南逐步为 Ubuntu 上的 Nginx 配置 Fail2Ban。

什么是 Fail2Ban

Fail2Ban 是一个安全工具,它监视 SSH、Nginx 和邮件等服务的日志。当它看到某个 IP 行为异常时 — 多次登录失败或异常高的请求速率 — 它告诉防火墙 (iptables/nftables) 临时禁止该 IP。这可以自动阻止暴力攻击,而无需您手动监控。

步骤 1 — 安装 Fail2Ban

sudo apt update sudo apt install fail2ban -y sudo systemctl enable --now fail2ban

步骤 2 — 创建 jail.local

不要直接编辑 jail.conf。改为创建 jail.local,这样您的设置在更新时不会被覆盖:

[DEFAULT] bantime = 1h findtime = 10m maxretry = 5 ignoreip = 127.0.0.1/8 ::1 YOUR_TRUSTED_IP

步骤 3 — 为 Nginx 启用监狱

在同一文件中添加 Nginx 监狱,以覆盖 HTTP 认证猜测和机器人文件扫描:

[nginx-http-auth] enabled = true port = http,https logpath = /var/log/nginx/error.log [nginx-botsearch] enabled = true port = http,https logpath = /var/log/nginx/access.log maxretry = 2

步骤 4 — 重启并检查

sudo systemctl restart fail2ban sudo fail2ban-client status nginx-http-auth

这显示有多少个 IP 被禁止以及正在监视哪些日志。

提示: 始终将您的办公室或家庭 IP 添加到 ignoreip,这样在误输密码后您就不会被锁定。

解除 IP 禁令

要释放被错误禁止的 IP,请运行:

sudo fail2ban-client set nginx-http-auth unbanip 1.2.3.4

添加速率限制监狱 (nginx-req-limit)

除了内置的监狱外,您还可以防御触发 Nginx 自己的 limit_req 指令的请求洪泛。在 /etc/fail2ban/filter.d/nginx-req-limit.conf 创建自定义过滤器:

[Definition] failregex = limiting requests, excess:.* by zone .*, client: <HOST> ignoreregex =

然后将监狱添加到 jail.local:

[nginx-req-limit] enabled = true port = http,https filter = nginx-req-limit logpath = /var/log/nginx/error.log maxretry = 10 bantime = 30m

该监狱将阻止在 findtime 窗口内超过 Nginx 速率限制 10 次以上的任何 IP — 提供针对应用层洪泛攻击的额外保护层。

实时监控 Fail2Ban

定期监控让您可以确认 Fail2Ban 正常工作并查看当前禁止的 IP。

列出所有活跃的监狱

sudo fail2ban-client status

检查特定监狱

sudo fail2ban-client status nginx-http-auth sudo fail2ban-client status nginx-botsearch

实时流式传输日志

sudo tail -f /var/log/fail2ban.log

日志显示每个 Ban 和 Unban 事件及相应的监狱和 IP 地址,便于分析最常见的攻击模式。

专业提示: 运行 sudo iptables -L f2b-nginx-http-auth -n --line-numbers 直接查询 iptables 链,查看当前被阻止的 IP,无需等待日志更新。

递增禁止时间

Fail2Ban 支持递增禁止时间,每次同一 IP 被再次禁止时都会增长,阻止重复攻击者。

[DEFAULT] bantime.increment = true bantime.factor = 1 bantime.formula = ban * (1 << (ban - 1)) * banFactor bantime.maxtime = 24h bantime.overalljails = true
禁令 # 持续时间 备注
1 1 小时 基础禁止时间值
2 2 小时 增量开始
3 4 小时 指数增长
4+ 最长 24 小时 受 bantime.maxtime 限制

新禁令的电子邮件警报

Fail2Ban 可以在禁止新 IP 时发送电子邮件警报,使用内置的 sendmail-whois 操作。将这些设置添加到 jail.local 的 DEFAULT 部分:

[DEFAULT] destemail = [email protected] sender = [email protected] mta = sendmail action = %(action_mwl)s

action_mwl (带日志的邮件) 操作发送一封带有相关日志行的电子邮件,这样您可以立即追踪攻击来源。如果未安装 sendmail,请使用 mailutils 作为替代品:

sudo apt install mailutils -y

VPS 安全检查清单

Fail2Ban 是 VPS 安全的一个重要层,但加固的服务器需要多重防御协同工作。设置 Fail2Ban 后,请通过此检查清单。

安全是一个持续过程。至少每季度重新审视您的配置,并关注您 VPS 上运行的软件的 CVE 公告,以领先于新发现的漏洞。

常见问题

什么是 Fail2Ban?

Fail2Ban 是一个 Linux 安全工具,它读取日志文件,检测重复失败登录或攻击的 IP,并自动告诉防火墙临时阻止它们。它可以大大减少暴力和机器人攻击。

Fail2Ban 与 UFW 防火墙有何不同?

UFW 是一个具有打开或关闭端口静态规则的防火墙。Fail2Ban 动态工作:它监视日志并在一段时间内禁止可疑 IP。这两者相互补充,通常一起使用。

如果我自己被阻止了怎么办?

运行 fail2ban-client set unbanip 解除您自己 IP 的禁令,并将可信 IP 添加到 ignoreip,这样它们永远不会被禁止。

具有完全根访问权限的 VPS 以自行加强安全性

AsiaGB VPS 为您提供完整的根访问权限以安装 Fail2Ban 并自由调整,起价为 ฿500/月。

查看 VPS 方案