核心摘要:在 2026 年,单纯靠修改 SSH 端口已经挡不住全球泛滥的自动化扫描脚本了。本文将手把手教你部署基于日志的入侵防御系统 Fail2Ban。从底层逻辑、核心防御参数拆解,到精准拦截 SSH 暴力破解、Nginx CC 攻击与 WordPress 恶意扫描,帮你彻底把服务器武装到牙齿。
老实说,很多站长刚买完机器,系统一装完,域名解析到公网 IP 的那一刻,你的机器就已经被全球数以万计的自动化脚本盯上了。
如果你去查一下 /var/log/auth.log,满屏幕绝对都是来自全球各地的爆破登录尝试。哪怕你禁用了密码登录,这些恶意的并发请求依然会疯狂消耗你服务器的 CPU 和网络连接数。
为了防止你的建站“传家宝”被扫描器打瘫甚至变成肉鸡,今天我们不废话,直接上硬核防御方案:Fail2Ban 安装与配置详解。
这套方案不仅能精准拦截 SSH 暴力破解,还能深度结合 Nginx 防御恶意的 CC 攻击和 WordPress 爆破。我们将直接给出明确结论、硬核数据以及可落地的配置文件,帮你彻底解决服务器最头疼的恶意扫描问题。
认知打破:Fail2Ban 的底层逻辑
在公网环境中,恶意扫描通常分为两种:
- 端口扫描与 SSH 爆破: 机器人 24 小时不断尝试 22 等端口,使用弱口令字典暴力破解。
- Web 漏洞与 CC 扫描: 针对 WordPress 等程序,疯狂扫描
wp-login.php、敏感插件目录,或者发起高频 CC 请求耗尽数据库资源。
Fail2Ban 的底层逻辑非常优雅:它本质上是一个基于日志的入侵防御系统 (IPS)。它会实时监控系统的各类日志文件(如 SSH、Nginx、系统日志),一旦发现某个 IP 在设定的时间(findtime)内,触发了超过规定次数(maxretry)的恶意行为,Fail2Ban 就会直接调用系统的防火墙(iptables、ufw 或 firewalld),将该 IP 在网络层直接丢弃(Drop),关进“小黑屋”一段时间(bantime)。
极速安装与底层读取逻辑修正
无论你的 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] 区块,设置你的全局安全基线:

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 的指令。它们是完美的上下游共存关系。