用 fail2ban 给 WordPress 加道防护墙:我的实战踩坑指南
大家好,我是 33blog 的站长。今天想和大家分享一个我最近折腾的小项目 —— 用 fail2ban 给 WordPress 网站增加安全防护。这个方案我已经在生产环境跑了三个月,效果相当不错,拦截了上千次暴力破解尝试。
为什么需要 fail2ban?
上个月我的服务器突然 CPU 飙高,查日志发现有人在对 wp-login.php 进行暴力破解。虽然 WordPress 本身有登录限制,但面对分布式攻击还是力不从心。这时候我想到了 fail2ban —— 这个 Linux 上经典的入侵防御工具。
fail2ban 的工作原理很简单:监控日志 → 发现异常 → 封禁 IP。特别适合对付这种重复尝试的暴力破解。
安装与基础配置
在 Ubuntu/Debian 上安装很简单:
sudo apt update
sudo apt install fail2ban -y
安装完成后,我建议先复制默认配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
这样升级时就不会覆盖自定义配置了。基础配置我主要调整了这些参数:
[DEFAULT]
# 封禁时间(秒)
bantime = 86400
# 检测时间窗口(秒)
findtime = 600
# 最大失败次数
maxretry = 5
为 WordPress 定制过滤规则
这是最核心的部分。我们需要创建一个专门针对 WordPress 登录保护的过滤器。
首先创建过滤器文件:
sudo nano /etc/fail2ban/filter.d/wordpress.conf
内容如下(这是我经过多次调试后的最终版本):
[Definition]
failregex = ^<HOST>.*"POST /wp-login.php HTTP/.*" 200
^<HOST>.*"POST /xmlrpc.php HTTP/.*" 200
ignoreregex =
这个正则表达式会匹配所有对 wp-login.php 和 xmlrpc.php 的 POST 请求(返回 200 状态码的)。你可能要问为什么不是匹配 403?因为 WordPress 的登录失败也是返回 200 啊!这是我踩的第一个坑。
配置 jail 规则
接下来在 jail.local 中添加:
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 300
bantime = 86400
注意 logpath 要根据你的 Web 服务器调整。我用的是 Nginx,如果是 Apache 就是 /var/log/apache2/access.log。
测试与调试
配置完成后一定要测试!我用的方法是:
# 测试过滤器
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress.conf
# 重启服务
sudo systemctl restart fail2ban
# 查看状态
sudo fail2ban-client status wordpress
这里有个小技巧:可以先用自己的 IP 故意失败登录几次,看看是否会被封禁(记得提前把 bantime 调小)。我就是这样发现了第二个坑 —— 需要把本机 IP 加入 ignoreip 列表,否则自己测试时会被封!
进阶优化
经过一段时间运行后,我又做了这些优化:
- 添加邮件通知:在 jail.local 中设置 destemail 和 sender
- 针对 xmlrpc.php 的单独规则:这个接口经常被滥用
- 结合 Cloudflare API:直接通过 API 封禁而不仅是服务器层面
特别是 Cloudflare 集成效果很好,因为很多攻击都是通过 Cloudflare 的 IP 发起的。配置方法是在 action 中引用 cloudflare.conf。
效果与总结
部署三个月以来,fail2ban 已经自动封禁了 1,200+ 个 IP,服务器负载明显下降。最重要的是,我不再需要每天手动检查暴力破解日志了。
最后给几个建议:
- 一定要定期检查 /var/log/fail2ban.log
- 新规则上线后观察几天再调严
- 考虑配合其他安全插件如 Wordfence
如果你也遇到过 WordPress 暴力破解的问题,不妨试试 fail2ban 这个方案。有什么问题欢迎在评论区交流!
感谢分享!刚好最近也在研究服务器安全,这个配置很实用 👍
想问下这个方案和Wordfence插件有什么区别吗?感觉两个都是防暴力破解的
我之前就被暴力破解过,气得要死,现在终于找到解决方法了!
博主写得真详细,连测试方法都说了,收藏备用🤔