WordPress 防火墙与 WAF 配置
挡住机器,别挡住客户
防火墙配置容易走两个极端:一种完全不设,几万次撞库请求照单全收;另一种规则开得太狠,把 Googlebot、支付回调、自家出口 IP 一并封掉,业务先挂。这一页讲分层思路:哪一层挡什么、日志怎么读、规则怎么写、上线后怎么验证没误伤真实访客。
被扫的五个信号
日志比监控更早发现问题
WordPress 站被自动化工具扫描是常态。区别只在于有没有被挡住、有没有被拖慢。下面这些迹象在访问日志里都能直接看到。
wp-login.php 被反复 POST
日志里同一 IP 每分钟几十次 POST /wp-login.php,状态码多为 200 或 302。这是撞库,密码弱的站几小时内就被进。用 grep -c "POST /wp-login.php" access.log 数一天的次数,正常是几十,被盯上的能到几万。
xmlrpc.php 被当放大器
POST /xmlrpc.php 加上 system.multicall,一次请求能试上百个密码,还能做 pingback 反射攻击。多数企业站用不到这个接口,关掉损失很小。
插件与配置文件被探测
连续请求 /wp-content/plugins/xxx/readme.txt、/wp-config.php.bak、/.env、/backup.zip,是在按已知漏洞清单逐个试。数量大、单个成本低,是 WAF 最适合拦的一层。
404 数量突然翻十倍
带宽和 CPU 未必立刻报警,404 比例会先跳起来。超过总请求的 20% 基本可确定在被扫,这类流量会拖慢正常请求,尤其在小机器上。
带宽或连接数异常
监控里带宽曲线在凌晨出现尖峰,或 netstat 里同一 IP 上百个连接。这是 CC 类请求,每个都「合法」,只是量太大,靠规则拦不住,要用限速。
四层防护各管什么
越靠前越省资源
很多站只在 WordPress 里装一个安全插件,等于把门卫放在客厅:请求跑完 PHP 与数据库才被判定为恶意,资源早已消耗。防护应该尽量前置。
第一层:CDN 与云 WAF
请求在到达源站前被过滤,是成本最低的一层。能挡 CC、按地域拦、识别常见扫描器指纹。缺点是规则由服务商维护,细粒度有限,且要正确配置回源,否则真实 IP 会暴露。
- 适合:有稳定流量、怕被打的站
- 配置要点:回源只允许 CDN 节点 IP
第二层:Web 服务器
Nginx 的 deny、limit_req、limit_conn 三件套,加上 fail2ban 读日志封 IP。这一层不消耗 PHP 资源,适合拦固定路径与限制登录频率。
第三层:应用层插件
Wordfence 这类插件能识别 WordPress 特有的攻击模式:伪造的 REST 请求、恶意上传、插件漏洞利用特征。代价是每个请求都要过一遍 PHP,规则库大时会拖慢站点。
第四层:代码与权限
不是拦截,而是让攻击进来后也拿不到东西:数据库用户降权、上传目录禁执行 PHP、DISALLOW_FILE_EDIT 关掉在线编辑、密钥定期轮换。不产生误封,但要一次配到位。
先读日志再写规则
四条命令看清攻击面
不读日志就套用网上的规则集,是误封的主要来源。先花十分钟看清自己站被怎么打,再决定拦什么。
找出请求量最大的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20。正常站的前几名应该是自己的监控、搜索引擎、少量真实访客。如果某个陌生 IP 一天几万次,基本可以确定是扫描器或采集。
看谁在打登录页
grep "POST /wp-login.php" access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head。结果里 IP 分布很散、每个只试几十次,说明是分布式撞库,封单个 IP 意义不大,要按频率限速。
统计被探测的路径
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -30。出现大量 .env、wp-config.php.bak、readme.html,就可以把这些路径一次性 deny 掉,成本极低。
分 User-Agent 看
扫描器的 UA 往往是空的,或者写着 python-requests、curl、Go-http-client。空 UA 的请求可以直接拒绝,正常浏览器不会这样发。注意别把搜索引擎的 UA 一并拦了,Googlebot 的 UA 是明确声明且可反向验证的。
读日志前先确认日志里有真实 IP。套了 CDN 或反向代理的站,$remote_addr 会是代理地址,要在 Nginx 里配 set_real_ip_from 与 real_ip_header X-Forwarded-For,否则所有请求看起来都来自同一个 IP,一封就是全站。
服务器层的三条规则
改完先 test,再 reload
下面三条覆盖了大部分企业站的实际需求,规则短、易维护、误伤面小。写入站点配置文件后执行 nginx -t 确认语法,再 systemctl reload nginx。
封掉不该被访问的路径
对 wp-config.php、.env、readme.html、license.txt 这类文件直接返回 403。这些文件要么含敏感信息,要么暴露版本号。规则写成精确匹配,不要用宽泛通配,避免误伤正常的 PHP 文件。
- 先备份站点配置再改
- 改完访问一次确认返回 403 而非 500
限制登录频率
定义 limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;,再在 location = /wp-login.php 里挂上 limit_req zone=login burst=3 nodelay;。含义是同一 IP 每分钟最多 5 次,允许 3 次突发。人为登录完全够用,脚本会被挡在门外。
关掉 xmlrpc
企业站基本不用这个接口,直接 location = /xmlrpc.php { deny all; }。如果用了手机客户端发文,或者 Jetpack 这类依赖 xmlrpc 的服务,就不能一刀切,改成只允许特定 IP 访问。
fail2ban 把「反复失败」的 IP 自动拉黑,适合撞库与暴力破解。典型配置是监控登录失败日志,同一 IP 十分钟失败 5 次封 1 小时。注意两点:封禁别设成永久,动态 IP 用户会被误伤;白名单务必加公司出口 IP、监控节点与搜索引擎。
四层工具对照表
管什么、不管什么
同一件事往往能在多层做,选哪层取决于流量规模与运维能力。最后一列是实际踩过的误伤场景。
| 层级 | 常用工具 | 擅长拦截 | 误伤风险 |
|---|---|---|---|
| CDN / 云 WAF | Cloudflare、云厂商 WAF | CC 攻击、地域封锁、扫描器指纹 | 回源 IP 未锁,攻击者可绕过直连源站 |
| Web 服务器 | Nginx deny / limit_req、Apache 规则 | 固定路径探测、登录暴力破解 | 通配写太宽会拦掉正常接口 |
| 自动封禁 | fail2ban、云防火墙 | 反复失败的同一 IP | 封禁过久会误伤动态 IP 用户 |
| 应用层插件 | Wordfence 等安全插件 | 插件漏洞利用、恶意上传、REST 滥用 | 规则库大时拖慢每个请求 |
| 代码与权限 | DISALLOW_FILE_EDIT、目录禁执行 | 拿到后台后的进一步破坏 | 几乎无误伤,但需一次配置到位 |
表格的顺序也是建议的上线顺序:先做代码层静态加固,再加服务器规则,最后才考虑云 WAF。反过来先上云 WAF,容易在没搞清流量特征时把正常请求拦掉。接入细节见CDN 加速配置。
上线后怎么确认没封错人
三件事必做
规则上线当天必须验证,别等客户打电话说打不开才发现。重点是「该通的通、该拦的拦」。
白名单先落地
公司出口 IP、客服与运营的网络、监控探针、支付与物流回调 IP、搜索引擎,全部加进白名单。白名单写在规则最前面,否则会被后面的 deny 覆盖。
用真实设备走一遍
手机 4G 与公司 WiFi 各测一次:首页、内页、搜索、表单提交、后台登录。4G 走运营商 NAT,最容易暴露「按 IP 限速过严」。
- 重点测表单与支付回调
- 测完看日志里有没有被拦的记录
留一条回滚路径
改配置前备份原文件,规则用注释分段,出问题能整段注释掉再 reload。云 WAF 侧保留「关闭当前规则集」的入口,别把开关藏在自己也找不到的地方。
规则要跟着业务变:上新站、换 CDN、加支付通道、做展会推广,都可能要调白名单。建议每季度看一次拦截日志,清掉长期没命中的规则,补进新特征。防护到位后,剩余风险主要在账号与插件漏洞,处置见WordPress 安全加固与木马清理与WordPress 安全插件。
防火墙与 WAF 常见五问
需要,两者管的不是同一段。插件在 PHP 里跑,请求已消耗进程与内存;服务器规则在进入 PHP 前就拒绝,成本低得多。被 CC 时插件本身也会被打挂。合理组合是服务器层拦路径与频率,插件层识别 WordPress 特有的攻击特征。
先确认是不是把爬虫拦了:查拦截日志里有没有 Googlebot、Bingbot、Baiduspider 的 UA。有的话把搜索引擎 IP 段加白名单,不要只按 UA 放行,UA 可以伪造。同时确认 robots.txt 没被改动。
多数扫描来自代理池,IP 每天换。这类要按行为特征拦:限制登录频率、拒绝空 UA、拦截特定路径组合,而不是依赖 IP 黑名单。另一种情况是源站 IP 已暴露,攻击者绕过 CDN 直连,那就要把源站设为只允许 CDN 节点访问。
登录页可以设得很严,每分钟 5 次对人工操作完全够用。全站限速要保守,先只记录不拦截,观察一周的正常峰值,再按两倍设阈值。直接套「每秒 1 次」,遇到页面加载几十个静态资源就会误伤。
至少做完服务器层与代码层:封敏感路径、关 xmlrpc、限制登录频率、上传目录禁执行、关掉在线文件编辑。这五项配一次长期有效,几乎不产生误封。流量不大又没被攻击过的站,云 WAF 可以暂缓;出现带宽异常或收到 abuse 通知再补。HTTPS 配置见SSL 证书与 HTTPS 配置。
日志里全是扫描请求
先看流量特征,再决定拦在哪一层
提供一段时间的访问日志与服务器类型,我们先做只读分析:攻击来源分布、被探测的路径、是否有绕过 CDN 的直连,再给分层规则建议,上线后陪跑一遍,确认没误伤询盘与支付。
电话/微信 13280692153 邮箱 web@wordpressx.com 地址 山东省淄博市张店区电子产业创新园 B 座