用 fail2ban 给 WordPress 加道防护墙

2025.6.21 杂七杂八 1246
33BLOG智能摘要
fail2ban 是一个 Linux 入侵防御工具,通过监控日志、发现异常登录行为并封禁 IP,适用于 WordPress 登录防护。文章作者分享了在 Ubuntu/Debian 系统上安装和配置 fail2ban 的实战经验,重点在于为 WordPress 设定正则表达式过滤器,监控 wp-login.php 和 xmlrpc.php 的 POST 请求。配置完成后需测试并调整 ignoreip 以避免误封。作者结合 Cloudflare API 封禁 IP 并设置邮件通知,实现了自动拦截 1,200+ 暴力破解尝试,降低服务器负载。建议定期检查日志,结合其他安全插件提升防护效果。
— 此摘要由33BLOG基于AI分析文章内容生成,仅供参考。

用 fail2ban 给 WordPress 加道防护墙:我的实战踩坑指南

用 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 列表,否则自己测试时会被封!

进阶优化

经过一段时间运行后,我又做了这些优化:

  1. 添加邮件通知:在 jail.local 中设置 destemail 和 sender
  2. 针对 xmlrpc.php 的单独规则:这个接口经常被滥用
  3. 结合 Cloudflare API:直接通过 API 封禁而不仅是服务器层面

特别是 Cloudflare 集成效果很好,因为很多攻击都是通过 Cloudflare 的 IP 发起的。配置方法是在 action 中引用 cloudflare.conf。

效果与总结

部署三个月以来,fail2ban 已经自动封禁了 1,200+ 个 IP,服务器负载明显下降。最重要的是,我不再需要每天手动检查暴力破解日志了。

最后给几个建议:

  • 一定要定期检查 /var/log/fail2ban.log
  • 新规则上线后观察几天再调严
  • 考虑配合其他安全插件如 Wordfence

如果你也遇到过 WordPress 暴力破解的问题,不妨试试 fail2ban 这个方案。有什么问题欢迎在评论区交流!

评论

  • 感谢分享!刚好最近也在研究服务器安全,这个配置很实用 👍

  • 想问下这个方案和Wordfence插件有什么区别吗?感觉两个都是防暴力破解的

  • 我之前就被暴力破解过,气得要死,现在终于找到解决方法了!

  • 博主写得真详细,连测试方法都说了,收藏备用🤔