
任何暴露在互联网上的 VPS 都在不断被机器人扫描和探测,尤其是运行 Nginx 的网站。Fail2Ban 会自动屏蔽这些 IP。本指南逐步为 Ubuntu 上的 Nginx 配置 Fail2Ban。
什么是 Fail2Ban
Fail2Ban 是一个安全工具,它监视 SSH、Nginx 和邮件等服务的日志。当它看到某个 IP 行为异常时 — 多次登录失败或异常高的请求速率 — 它告诉防火墙 (iptables/nftables) 临时禁止该 IP。这可以自动阻止暴力攻击,而无需您手动监控。
步骤 1 — 安装 Fail2Ban
步骤 2 — 创建 jail.local
不要直接编辑 jail.conf。改为创建 jail.local,这样您的设置在更新时不会被覆盖:
步骤 3 — 为 Nginx 启用监狱
在同一文件中添加 Nginx 监狱,以覆盖 HTTP 认证猜测和机器人文件扫描:
步骤 4 — 重启并检查
这显示有多少个 IP 被禁止以及正在监视哪些日志。
提示: 始终将您的办公室或家庭 IP 添加到 ignoreip,这样在误输密码后您就不会被锁定。
解除 IP 禁令
要释放被错误禁止的 IP,请运行:
添加速率限制监狱 (nginx-req-limit)
除了内置的监狱外,您还可以防御触发 Nginx 自己的 limit_req 指令的请求洪泛。在 /etc/fail2ban/filter.d/nginx-req-limit.conf 创建自定义过滤器:
然后将监狱添加到 jail.local:
该监狱将阻止在 findtime 窗口内超过 Nginx 速率限制 10 次以上的任何 IP — 提供针对应用层洪泛攻击的额外保护层。
实时监控 Fail2Ban
定期监控让您可以确认 Fail2Ban 正常工作并查看当前禁止的 IP。
列出所有活跃的监狱
检查特定监狱
实时流式传输日志
日志显示每个 Ban 和 Unban 事件及相应的监狱和 IP 地址,便于分析最常见的攻击模式。
专业提示: 运行 sudo iptables -L f2b-nginx-http-auth -n --line-numbers 直接查询 iptables 链,查看当前被阻止的 IP,无需等待日志更新。
递增禁止时间
Fail2Ban 支持递增禁止时间,每次同一 IP 被再次禁止时都会增长,阻止重复攻击者。
| 禁令 # | 持续时间 | 备注 |
|---|---|---|
| 1 | 1 小时 | 基础禁止时间值 |
| 2 | 2 小时 | 增量开始 |
| 3 | 4 小时 | 指数增长 |
| 4+ | 最长 24 小时 | 受 bantime.maxtime 限制 |
新禁令的电子邮件警报
Fail2Ban 可以在禁止新 IP 时发送电子邮件警报,使用内置的 sendmail-whois 操作。将这些设置添加到 jail.local 的 DEFAULT 部分:
action_mwl (带日志的邮件) 操作发送一封带有相关日志行的电子邮件,这样您可以立即追踪攻击来源。如果未安装 sendmail,请使用 mailutils 作为替代品:
VPS 安全检查清单
Fail2Ban 是 VPS 安全的一个重要层,但加固的服务器需要多重防御协同工作。设置 Fail2Ban 后,请通过此检查清单。
- UFW 防火墙: 默认只允许端口 22、80 和 443。拒绝所有其他。
- 禁用 SSH 密码认证: 在
/etc/ssh/sshd_config中设置PasswordAuthentication no并仅使用 SSH 密钥对。 - 更改默认 SSH 端口(可选): 将 SSH 从端口 22 移到非标准端口可显著减少自动机器人扫描噪音。
- 保持软件包更新: 每周运行
sudo apt update && sudo apt upgrade -y或配置 unattended-upgrades 以获取安全补丁。 - Nginx 速率限制: 在 Nginx 配置中使用
limit_req_zone在 Fail2Ban 作用之前在 Web 服务器级别限制请求。 - 定期日志审查: 至少每周检查一次
/var/log/fail2ban.log和/var/log/nginx/error.log以尽早发现异常模式。
安全是一个持续过程。至少每季度重新审视您的配置,并关注您 VPS 上运行的软件的 CVE 公告,以领先于新发现的漏洞。
常见问题
Fail2Ban 是一个 Linux 安全工具,它读取日志文件,检测重复失败登录或攻击的 IP,并自动告诉防火墙临时阻止它们。它可以大大减少暴力和机器人攻击。
UFW 是一个具有打开或关闭端口静态规则的防火墙。Fail2Ban 动态工作:它监视日志并在一段时间内禁止可疑 IP。这两者相互补充,通常一起使用。
运行 fail2ban-client set