如何防止 VPS 被恶意扫描?Fail2Ban 安装与配置详解

核心摘要:在 2026 年,单纯靠修改 SSH 端口已经挡不住全球泛滥的自动化扫描脚本了。本文将手把手教你部署基于日志的入侵防御系统 Fail2Ban。从底层逻辑、核心防御参数拆解,到精准拦截 SSH 暴力破解、Nginx CC 攻击与 WordPress 恶意扫描,帮你彻底把服务器武装到牙齿。

老实说,很多站长刚买完机器,系统一装完,域名解析到公网 IP 的那一刻,你的机器就已经被全球数以万计的自动化脚本盯上了。

如果你去查一下 /var/log/auth.log,满屏幕绝对都是来自全球各地的爆破登录尝试。哪怕你禁用了密码登录,这些恶意的并发请求依然会疯狂消耗你服务器的 CPU 和网络连接数。

为了防止你的建站“传家宝”被扫描器打瘫甚至变成肉鸡,今天我们不废话,直接上硬核防御方案:Fail2Ban 安装与配置详解

这套方案不仅能精准拦截 SSH 暴力破解,还能深度结合 Nginx 防御恶意的 CC 攻击和 WordPress 爆破。我们将直接给出明确结论、硬核数据以及可落地的配置文件,帮你彻底解决服务器最头疼的恶意扫描问题。

认知打破:Fail2Ban 的底层逻辑

在公网环境中,恶意扫描通常分为两种:

  1. 端口扫描与 SSH 爆破: 机器人 24 小时不断尝试 22 等端口,使用弱口令字典暴力破解。
  2. Web 漏洞与 CC 扫描: 针对 WordPress 等程序,疯狂扫描 wp-login.php、敏感插件目录,或者发起高频 CC 请求耗尽数据库资源。

Fail2Ban 的底层逻辑非常优雅:它本质上是一个基于日志的入侵防御系统 (IPS)。它会实时监控系统的各类日志文件(如 SSH、Nginx、系统日志),一旦发现某个 IP 在设定的时间(findtime)内,触发了超过规定次数(maxretry)的恶意行为,Fail2Ban 就会直接调用系统的防火墙(iptables、ufw 或 firewalld),将该 IP 在网络层直接丢弃(Drop),关进“小黑屋”一段时间(bantime)。

🔥 Fail2Ban 核心防御参数一览
硬核数据
核心参数名 功能说明 单位/格式 建议安全值 实战作用
findtime 统计周期 秒 (s) / 分钟 (m) 10m (600s) 界定多长时间内的攻击才算数
maxretry 最大容错次数 纯数字 3 到 5 超过此错误次数即刻封禁
bantime 封禁时长 小时 (h) / 天 (d) 24h 或 48h 关进小黑屋的惩罚时间

极速安装与底层读取逻辑修正

无论你的 VPS 是 Debian 还是 Ubuntu,安装过程都极其简单。

1. 一键安装

sudo apt update
sudo apt install fail2ban -y

2. 配置文件的“潜规则”(千万别踩坑)

安装完成后,Fail2Ban 的配置文件存放在 /etc/fail2ban/ 目录下。这里有一个新手必踩的坑:永远不要直接修改 jail.conf 文件

正确的读取逻辑是: 系统会先加载 jail.conf 的全局默认配置,然后再读取 jail.local 的配置,并用后者的参数覆盖前者的同名设置。在未来软件升级时,jail.conf 会被无情覆盖,而你写在 jail.local 的配置会永久保留。

所以,第一步永远是复制一份本地配置文件:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

3. 编辑全局策略

使用编辑器打开 /etc/fail2ban/jail.local,找到 [DEFAULT] 区块,设置你的全局安全基线:

Fail2Ban 全局参数配置示例
  • ignoreip = 127.0.0.1/8 ::1 你的本地公网IP (防误封白名单,极其重要)。
  • bantime = 24h (惩罚时间)。
  • findtime = 10m (统计窗口)。
  • maxretry = 3 (容忍次数)。

进阶实战 1:SSH 终极防御组合拳

很多人存在一个安全误区,认为“只要禁用了密码登录,改用密钥(Key)验证,就不需要 Fail2Ban 了”。这是极其危险的逻辑。哪怕你仅允许密钥登录,恶意脚本依然会持续发起 TCP 连接尝试,auth.log 会产生大量无效日志,SSH 服务端依然会消耗资源去处理这些握手请求。

真正的终极防御组合拳是:更改 SSH 默认端口 + 禁用 Root 密码登录 + 仅允许密钥验证 + Fail2Ban 兜底防御。 前三项能从源头减少 99% 的爆破成功率,而 Fail2Ban 则在网络层直接丢弃剩余的恶意请求,最大化降低服务器的资源消耗。

jail.local 中找到 [sshd] 模块,激活它:

[sshd]
enabled = true
port    = 2222  # 如果你改了SSH端口,必须在这里对应修改
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3

进阶实战 2:WordPress 防护与预设规则

针对 WordPress 的 wp-login.php 爆破和 XML-RPC 攻击,新版的 Fail2Ban 其实已经自带了预定义的过滤规则。你完全不需要像老旧教程那样从零手写正则。

你只需要在 jail.local 最底部追加以下配置直接启用即可:

[wordpress]
enabled = true
port = http,https
filter = wordpress  # 直接调用自带的规则
logpath = /var/log/nginx/access.log # 确保路径与你的Web环境一致
maxretry = 5
findtime = 10m
bantime = 24h

(极客提示:如果你使用了极其冷门的建站面板,导致自带规则不匹配,你才需要进入 /etc/fail2ban/filter.d/wordpress.conf 去手动补充正则匹配规则。)

进阶实战 3:Nginx CC 攻击与恶意爬虫防御

这是很多基础教程会遗漏的核心地带。CC 攻击(Challenge Collapsar)会利用大量肉鸡模拟真实用户高频访问你的网站,瞬间榨干 PHP 和数据库进程。结合 Nginx 的 limit_req 模块,Fail2Ban 可以实现完美反杀。

1. 拦截高频 CC 请求

当 Nginx 的 limit_req 触发拦截时,会在 error.log 中产生日志。开启以下 Jail 将这些恶意 IP 关禁闭:

[nginx-limit-req]
enabled = true
port    = http,https
filter  = nginx-limit-req
logpath = /var/log/nginx/error.log
findtime = 1m
maxretry = 10  # 1分钟内触发10次限流,直接拉黑
bantime = 24h

2. 拦截恶意 404 漏洞扫描器

黑客经常用工具盲扫你的敏感目录(如 .env, backup.zip),这会产生大量 404 错误。开启针对恶意机器人的防御:

[nginx-botsearch]
enabled = true
port     = http,https
filter   = nginx-botsearch
logpath  = /var/log/nginx/access.log
maxretry = 3

配置完成后,输入 sudo systemctl restart fail2ban 重启服务。你可以使用 sudo fail2ban-client status nginx-limit-req 随时查看击落了多少架“敌机”。

vps1111 避坑指南与分层防御策略

配置安全防护最忌讳“用力过猛”和“逻辑断层”。作为运维老炮,最后交给你两条避坑铁律:

💡 vps1111 避坑指南:

  • 慎用永久封禁 (bantime = -1): 很多小白喜欢图痛快设置永久封禁。其实新版 Fail2Ban 配合现代多核 CPU 处理几万条 iptables 规则的性能损耗微乎其微。无脑永久封禁真正的灾难在于:导致防火墙规则链极其冗长,极大增加误封后的排查难度,且无法自动解封。 常规场景下,设置 24-48 小时的封禁时长,已足以让绝大多数自动化攻击脚本因为成本过高而放弃你的 IP。
  • 正确认知“分层防御”: Fail2Ban 是运行在系统内核的应用层软件。如果你遭受的是几百 Gbps 级别的超大规模 DDoS 攻击,单靠 Fail2Ban 是挡不住的(网卡会被直接塞满)。正确的架构策略是: 选择走优质骨干网线路(如 AS4837、AS4134)且机房自带基础 DDoS 清洗能力的机器。先在机房网络层清洗掉粗暴的大流量,再用机器内部的 Fail2Ban 实现应用层(如 CC、SSH 爆破)的精准拦截,形成完美的分层防御体系。

老兄,只要你把这套组合拳打在你的服务器上,你的网站底层安全架构就已经超越了市面上 90% 的“裸奔”同行了。

❓ 极客答疑 FAQ

Fail2Ban 会大量消耗服务器 CPU 和内存吗?

不会。Fail2Ban 是基于事件触发的轻量级 Python 脚本。在现代服务器上,监控常规的 SSH 和 Web 日志所消耗的资源微乎其微。只有在面对超大规模 CC 攻击时,频繁读取巨大体积的 access.log 或频繁调用 iptables 才可能产生极少的性能损耗。建站机器完全可以闭眼安装。

Fail2Ban 可以和 UFW 或 Firewalld 一起使用吗?

绝对可以,而且是天作之合。Fail2Ban 本身不是防火墙,它只是一个“指挥官”。当你配置了拦截规则后,Fail2Ban 会在底层直接向系统的 iptables、UFW 或 Firewalld 下达封禁 IP 的指令。它们是完美的上下游共存关系。

正文完
 0
评论(没有评论)