我见过一个最离谱的案例:一个做了30多个站的团队,每个站都装了宝塔面板,也买了付费防火墙插件。但每个站的防火墙规则完全不一样——有的开了CC防护,有的没开;有的封了海外IP,有的敞着门;有的SQL注入拦截开着,有的连基础规则都没导入。问他们为什么,回答是"每次装完站还要配防火墙太麻烦了,有时候做着做着就忘了"。
然后这批站被批量挂马了。不是一个个被攻破的,是脚本自动扫的——一个站有漏洞,相邻IP段的站全部中招。事后复盘,被黑的全部是防火墙规则不完整的那几个。这个事让我意识到一个问题:站群安全最大的漏洞不在防火墙本身,在配置的一致性。你有一个再好的WAF,只要不是每个站都配到位,它就是形同虚设。
手动配置站群防火墙的三个死穴
| 1 | 遗漏率高:超过5个站就记不清哪些配了哪些没配,少开一个规则就是多一个入口 |
| 2 | 不一致性:同一批站有的拦截SQL注入有的放行,黑客扫一遍就能找到突破口 |
| 3 | 更新滞后:新发现一个攻击特征要逐个站去加规则,加完最后一个站已经过去两小时了 |
一、站群防火墙到底要配哪些东西
先说一个基本认知:防火墙不是装上去就完事了。一个完整的站群WAF配置,至少要覆盖三个层面:网络层(IP/端口/地区)、应用层(SQL注入/XSS/文件上传)、业务层(CC攻击/爬虫/接口滥用)。三个层面缺一不可,而且不同层面的配置方式和工具有区别。
网络层
系统防火墙(iptables/firewalld)、安全组规则。控制哪些IP能访问22/3306等端口,封锁恶意IP段。这层做不好,数据库直接暴露在公网上。
应用层
WAF(Web应用防火墙)。拦截SQL注入、XSS跨站脚本、文件包含、命令执行等OWASP Top 10攻击。这是主战场。
业务层
CC防护、速率限制、爬虫识别、验证码策略。防的不是入侵,是资源耗尽和恶意采集。CC攻击成本极低,不配这层很容易被打到宕机。
如果你只有一两个站,登录面板一个一个配没问题。但站群场景下,这三层配置每多一个站就多一套重复操作。算一笔账:一个站配完这三层大概要20到30分钟(系统防火墙10分钟 + WAF规则15分钟 + 速率限制5分钟),30个站就是10到15个小时。这还是顺利的情况,如果中间有站点需要特殊的白名单规则,时间还要翻倍。
二、Cloudflare的WAF规则批量同步方案

如果你的站群接入了Cloudflare(绝大多数做海外站的都会接入),批量配置WAF有两条路可以走。第一条是用Cloudflare官方的WAF Rulesets API,第二条是用社区开发的批量同步工具。两条路都能实现"配一次规则,全站生效"。
先说API这条路。Cloudflare的WAF自定义规则本质上是绑定在Zone级别的资源,每个Zone有一个唯一的Zone ID。批量配置的逻辑就是:先在一个Zone上把规则调好,然后通过API把这个Zone的规则集导出,再批量写入其他Zone。
# 获取某个Zone的所有WAF自定义规则curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/rulesets/phases/http_request_firewall_custom/entrypoint" \-H "Authorization: Bearer {api_token}" \-H "Content-Type: application/json"# 将规则写入另一个Zone(先获取目标Zone的ruleset_id,再PUT更新)curl -X PUT "https://api.cloudflare.com/client/v4/zones/{target_zone_id}/rulesets/{ruleset_id}" \-H "Authorization: Bearer {api_token}" \-H "Content-Type: application/json" \-d '{"rules": [...]}'手写API脚本的问题是边界情况多:规则超过20条时要处理分页、不同Zone的Ruleset ID不同、API频率限制(每分钟1200次但瞬时并发有限制)、规则中的条件表达式需要转义等。一个更省事的选择是用社区已有的批量同步工具,比如开源的Cloudflare WAF Batch Creator(GitHub可搜到),它做了几件很有用的事:
· 一致性检查:部署前先读取云端现有规则和本地配置对比,没差异就跳过,有差异才更新,减少不必要的API调用
· 表达式折叠:把多个IP/CIDR合并为 ip.src in {ip1, ip2, ...} 格式,避免单条规则超过4096字符上限
· 自适应批处理:规则少于20条逐条操作,超过阈值自动切换为一次性PUT覆盖,避免触发API频率限制
· 零依赖运行:用Nuitka编译为exe单文件,不用装Python环境就能跑
Cloudflare方案适合的场景很明确:域名已经全部接入了Cloudflare CDN,WAF规则在边缘节点执行。优势是不消耗源站性能,所有拦截在CDN层完成。但如果你用的是国内服务器且没套CDN,或者部分站点走的直连模式,这个方案就不适用。
三、宝塔面板环境下的批量WAF配置
国内服务器用得最多的面板就是宝塔,宝塔的WAF配置分两条线:一条是内置的Nginx防火墙(免费但入口被隐藏了),一条是付费的Nginx防火墙插件。两条线的批量管理思路不同。
先说免费的Nginx防火墙。宝塔从6.x版本开始隐藏了免费防火墙入口,但底层的ngx_lua_waf模块还在。你可以直接编辑配置文件来批量管理:
# 宝塔免费WAF配置文件路径/www/server/nginx/waf/config.lua# 关键配置项(统一修改后对所有使用该Nginx的站点生效)Config["ccrate"] = "120/60" -- 60秒内120次请求触发CC拦截Config["ccdeny"] = "1" -- 开启CC拦截Config["SQLinject"] = "1" -- 开启SQL注入拦截Config["xssCheck"] = "1" -- 开启XSS拦截Config["cookieMatch"] = "on" -- 开启Cookie防护Config["postMatch"] = "on" -- 开启POST参数检测Config["whiteUrl"] = {} -- URL白名单Config["whiteip"] = {} -- IP白名单这个方案的好处是改一个config.lua文件,所有共用这个Nginx实例的站点全部生效。但局限也很明显:如果不同的站点需要不同的白名单或CC阈值(比如高流量站和低流量站不能用同一个CC触发频率),就没法做到精细化。所以免费方案适合站点类型相似、流量规模接近的站群。
再说付费的Nginx防火墙插件。宝塔付费防火墙的配置文件是按站点独立存储的,每个站点一个目录,批量配置的核心是用脚本遍历站点目录统一修改配置文件:
#!/bin/bash# 批量同步宝塔付费防火墙规则BT_WAF_DIR="/www/server/btwaf"SITES=$(ls /www/server/panel/vhost/nginx/)for site in $SITES; do# 每个站点的WAF配置文件SITE_CONF="$BT_WAF_DIR/site/$site/config.json"if [ -f "$SITE_CONF" ]; then# 统一设置CC防护:单IP 60秒内超过100次请求触发拦截sed -i 's/"cc_rate":.*/"cc_rate": "100\/60",/' "$SITE_CONF"# 统一开启SQL注入、XSS、文件上传拦截sed -i 's/"sql_inject":.*/"sql_inject": true,/' "$SITE_CONF"sed -i 's/"xss":.*/"xss": true,/' "$SITE_CONF"sed -i 's/"upload_check":.*/"upload_check": true,/' "$SITE_CONF"echo "Updated: $site"fidone# 重载Nginx使配置生效/etc/init.d/nginx reload这个脚本跑一遍,几十个站的防火墙规则就同步了。比手动一个个点快几十倍。不过要注意:改完配置文件后必须重载Nginx才能生效,而且最好先在测试站上验证一下规则不会误拦正常流量。
四、系统防火墙的批量管理
很多人只关注WAF,忽略了系统防火墙。实际上系统防火墙是更底层的一关:WAF拦截的是HTTP请求中的攻击payload,但如果你22端口开着且没限制访问IP,攻击者根本不需要走HTTP层——直接SSH爆破进来什么WAF都拦不住。

系统防火墙的批量管理比WAF简单,因为它是服务器级别的,一台服务器上的所有站点共享同一套iptables/firewalld规则。但如果站群分布在多台服务器上,就需要每台都配一遍。
系统防火墙最低限度要配的三条规则
1. SSH端口(22)只允许指定办公IP或跳板机IP访问,禁止全量开放
2. 数据库端口(3306/5432/27017等)禁止公网访问,只允许127.0.0.1和服务器内网
3. 除了80/443端口外,其他所有端口默认DROP,按需逐个开放
批量管理多台服务器的系统防火墙,最实用的工具是Ansible。写一个playbook,定义好iptables规则模板,然后对所有服务器批量执行:
# ansible playbook 批量配置iptables- hosts: all_serverstasks:- name: 安装iptables-persistentapt: name=iptables-persistent state=present- name: 清空现有规则并设置默认策略iptables:chain: "{{ item.chain }}"policy: "{{ item.policy }}"loop:- { chain: INPUT, policy: DROP }- { chain: FORWARD, policy: DROP }- { chain: OUTPUT, policy: ACCEPT }- name: 放行已建立的连接和回环接口iptables:chain: INPUTmatch: conntrackctstate: ESTABLISHED,RELATEDjump: ACCEPT- name: 只允许办公IP访问SSHiptables:chain: INPUTprotocol: tcpdestination_port: 22source: "{{ office_ip }}"jump: ACCEPT如果没有用Ansible,也可以用简单的SSH批量执行脚本:把所有服务器的IP列表写进一个txt文件,循环SSH登录执行防火墙命令。比手动一台台登进去改快得多。
五、四种主流WAF方案在站群场景下的批量管理能力对比
把目前市面上用得最多的四种WAF方案放在站群场景下对比,看看各自批量管理的能力差异。
| WAF方案 | 批量管理方式 | 同步效率 | 精细化程度 | 适用场景 |
|---|---|---|---|---|
| Cloudflare WAF | API批量同步 / 社区批量工具 | 50个域名3分钟内同步完成 | 高(可每个Zone独立配置) | 海外站群、已接入CF的站点 |
| 宝塔免费WAF | 修改Nginx共享config.lua | 改一个文件全站生效 | 低(所有站点共用一套规则) | 流量规模接近的同类型站点 |
| 宝塔付费防火墙 | 脚本遍历站点目录改配置文件 | 50个站约1分钟 | 高(每个站点独立配置文件) | 国内服务器、需要差异化配置 |
| 第三方WAF(安全狗/护卫神等) | 通常不支持批量,需逐站点操作 | 50个站约2-4小时 | 取决于产品 | 少量站点,不需要批量 |
从表里能看出来,Cloudflare和宝塔付费版是站群场景下批量管理能力最强的两个方案。但它们的覆盖场景互补:Cloudflare管海外流量、在CDN层拦截;宝塔管国内服务器、在Nginx层拦截。如果你的站群同时有国内和海外流量,两个方案可能要搭配使用。
六、最容易漏配的三条规则
批量配置的好处是速度快,坏处是一旦配置模板本身有问题,所有站一起出问题。所以配之前要想清楚哪些规则是通用的,哪些需要按站定制。以下三条是实际运维中最容易被忽略但又影响很大的规则:
XML-RPC拦截
WordPress站群的必配项。xmlrpc.php是暴力破解和DDoS反射攻击的常见入口。很多WAF默认不拦截这个路径,需要手动加规则拦截或直接关闭xmlrpc功能。
搜索引擎爬虫白名单
CC防护规则设得太严容易误伤百度蜘蛛和Googlebot。必须在速率限制规则中把主流搜索引擎的爬虫IP段加入白名单,否则爬虫被误拦直接掉收录。
后台路径访问限制
wp-admin/wp-login.php等后台入口必须限制访问IP或增加二次验证。站群中只要有一个站的后台被爆破,攻击者就能拿到服务器上的其他站点信息。
还有一个很多人忽略的点:防火墙日志。批量配完之后一定要确认每个站的WAF日志都在正常记录。没有日志的WAF等于盲人开车——你知道有攻击但不知道是什么攻击、从哪里来、有没有拦住。Cloudflare的WAF日志在Dashboard里可以看到聚合视图,宝塔付费防火墙有独立的攻击日志页面。免费方案通常需要自己配置日志输出。
七、把防火墙配置纳入站群上线流程

前面说了这么多工具和方法,但真正的问题不在技术上,在流程上。为什么很多站群的防火墙配不齐?因为防火墙配置不在上线checklist里。大家建站的流程通常是:买域名→解析→装面板→装CMS→装插件→发内容。防火墙往往不在这个标准流程里,想到了就配一下,忘了就算了。
把防火墙配置固化为上线流程的一个必选步骤,比任何工具都管用。建议的流程是:
新站上线安全配置检查清单
☑ 系统防火墙:SSH限制来源IP、数据库端口仅本地访问、非必要端口全部关闭
☑ WAF基础规则:SQL注入、XSS、文件包含、命令执行四类拦截全部开启
☑ CC防护:按站点预估流量设置合理的速率阈值,加入搜索引擎爬虫白名单
☑ 后台保护:wp-admin等路径限制访问IP或开启二次验证
☑ XML-RPC:WordPress站关闭xmlrpc.php或加WAF拦截规则
☑ 日志确认:验证WAF日志正常记录,确认攻击拦截功能实际生效
如果站群数量在10个以上,建议用UC建站系统的多站看板来统一监控安全状态。UC的多站管理后台能把所有站点的WAF拦截日志、CC攻击次数、异常访问IP等信息汇总到一个视图里,不用逐个站登录查看。哪天某个站突然被高频扫描,看板上立马能看到,比等网站挂掉了才发现快得多。
八、几个站群防火墙配置的反面案例
最后说几个实际运维中遇到的坑,都是真事(隐去具体信息)。
案例一:CC防护阈值全站统一,高流量站被误拦
有个站群批量配CC防护时,把阈值统一设成了"60秒内100次请求触发拦截"。结果其中一个流量较大的站(日均UV过万)正常用户访问就被误拦了——用户浏览页面多翻几页就触发CC规则,页面直接跳出验证码。最后只能把这个站的阈值单独调高。批量配置一定要给高流量站留独立调整的空间。
案例二:搜索引擎爬虫被误封,三天收录掉一半
另一个团队批量配了严格的地区封锁规则,把所有非中国大陆IP的请求都加了JS质询。结果百度蜘蛛的抓取节点有部分在海外,被质询后直接放弃抓取。三天后站长发现site语法查收录掉了将近一半,查了日志才发现蜘蛛被误拦。恢复白名单后过了一周收录才慢慢回来。
案例三:数据库端口全量开放,整个服务器数据被拖走
最离谱的一个:WAF配得严严实实,SQL注入、XSS、文件上传全拦截。但系统防火墙3306端口是开着的,而且MySQL root密码是弱口令。攻击者根本没走HTTP层,直接连数据库把几个站的数据全拖走了。WAF再强也拦不住数据库端口裸奔。
这三个案例归结起来就一句话:防火墙配置的一致性、完整性和差异化是三个要同时满足的条件。一致性保证没有遗漏,完整性保证覆盖所有层面,差异化保证高流量站不会被通用规则误伤。三者缺一,防火墙就是个摆设。
如果你的站群还没开始做防火墙的批量管理,建议从今天开始,哪怕只是用最简单的Shell脚本把基础WAF规则同步一遍,也比什么都不做强。等哪天被挂马了再补,代价不是一个量级的。
