WAF 自定义规则配置与不生效排查

更新时间:
复制 MD 格式

配置边缘安全加速 ESA 的 WAF 自定义规则后,可能遇到规则不生效、误拦截正常用户、规则冲突或套餐功能受限等问题。参照以下场景化排查指南,可快速定位原因并解决。

快速定位

根据遇到的现象,快速跳转到对应场景:

现象

最可能的原因

快速跳转

设置了拦截规则但请求仍然通过

匹配条件配置错误

场景一:规则配置后未生效

正常用户或搜索引擎被 403 拦截

规则条件过于宽泛

场景二:规则误拦截了正常用户

多条规则行为与预期不符

规则优先级或执行顺序问题

场景三:多条规则冲突或优先级异常

删除规则后仍然拦截 / 新增规则未立即生效

规则缓存或生效延迟

场景四:规则增删后效果延迟或不符合预期

控制台选项灰色不可用 / 保存时报错

套餐版本不支持该功能

场景五:套餐版本功能限制

基础知识:WAF 自定义规则的工作原理

WAF 自定义规则的执行遵循以下优先级顺序(从高到低):

  1. IP 访问规则:IP 黑白名单

  2. 白名单规则:最高优先级,命中后跳过所有后续安全检查

  3. 扫描防护规则:识别扫描行为并自动拦截

  4. 托管规则:ESA 内置的安全规则集

  5. 自定义规则:用户自定义的匹配条件和执行动作

  6. 频次控制规则:基于请求频率的限制

重要

如果一个请求被白名单命中,后续的自定义规则和托管规则都不会执行。排查规则不生效时,需先确认是否有更高优先级的规则放行了该请求。

通用排查步骤

遇到 WAF 规则问题时,建议先通过事件分析确定触发规则的类型,再跳转到对应场景排查:

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择安全防护 > 事件分析

  3. 查看被拦截或放行的请求记录,识别触发规则的类型(白名单、自定义规则、托管规则等)和规则 ID。

  4. 根据规则类型跳转到对应场景:

场景一:规则配置后未生效

典型现象:设置了自定义拦截规则,但异常请求仍然能到达源站。

1.1 "等于"与"包含"混用

问题:URI 设置为"等于 /forum.php",但实际请求是 /forum.php?mod=misc&action=postreview(带查询参数),导致无法匹配。

解决:将匹配条件从等于改为包含。两种匹配方式的区别如下:

匹配方式

说明

示例

等于(精确匹配)

仅匹配完全一致的字符串,带查询参数的 URL 无法命中

/forum.php 无法匹配 /forum.php?mod=misc

包含(模糊匹配)

只要请求路径包含指定字符串就匹配

/forum.php 可以匹配 /forum.php?mod=misc

验证:修改规则后,发送测试请求并到事件分析页面确认该请求已被规则命中。

说明

除非需要精确匹配一个固定 URL(不含参数),否则建议使用包含

1.2 空 Referer 的正确匹配方式

问题:想拦截空 Referer 请求,设置了 Referer 长度小于 3,但部分空 Referer 请求仍通过。

解决:空 Referer 存在两种情况,需分别处理:

  • Referer 字段不存在(请求头未携带 Referer):选择 Referer 不存在

  • Referer 字段存在但值为空(值为空字符串或 -):选择 Referer 存在长度小于1

建议同时配置两条规则(用 OR 连接)以覆盖全部场景。

验证:分别使用不携带 Referer 和携带空 Referer 的请求测试,到事件分析页面确认两种请求均被命中。

1.3 泛域名通配符不支持

问题:设置 Referer"不等于 *.example.com"想拦截外站引用,但通配符 * 不生效。

解决:WAF 自定义规则的等于 / 不等于条件不支持泛域名通配符。将匹配方式改为不包含example.com

验证:修改规则后,到事件分析页面确认外站引用请求已被拦截。

1.4 IP"不等于"条件的理解误区

问题:设置"客户端 IP 不等于 114.x.x.x 则拦截",但 114 开头的 IP 仍被拦截。

解决:检查规则是否同时设置了主机名等其他条件。多个条件使用 AND 连接时,所有条件都需同时满足。如果主机名条件未正确匹配,整条规则不会生效。

验证:修改规则后,到事件分析页面确认目标 IP 的请求已被正确放行。

1.5 第一次访问未被自定义规则拦截

问题:设置了拦截规则,但第一次访问正常,第二次才被拦截。

解释:托管规则和频次控制规则需要先收集请求特征,第一次请求属于正常访问,第二次访问如果命中规则条件则会被拦截。自定义规则的拦截动作通常首次即生效,如果第一次未生效,请检查匹配条件是否正确。

1.6 主机名条件未设置

问题:规则配置了 URI 拦截条件,但未指定主机名,导致规则对所有域名生效或对预期域名不生效。

解决

  1. 为规则添加主机名匹配条件。

  2. 如果规则需要仅对特定域名生效,必须配置主机名匹配条件。

验证:修改规则后,到事件分析页面确认规则仅对目标域名的请求生效。

场景二:规则误拦截了正常用户

典型现象:配置 WAF 规则后,正常用户无法访问网站、图片不显示、搜索引擎无法收录、第三方服务失效。

2.1 搜索引擎爬虫被拦截(影响 SEO 收录)

现象:Googlebot、Baiduspider 等搜索引擎爬虫被 WAF 拦截,网站搜索排名下降、广告推广失效。

解决

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏选择安全防护 > WAF > 白名单规则

  3. 添加白名单条件:User Agent 包含GooglebotBaiduspider

  4. 执行动作选择跳过全部规则

验证:添加白名单后,到事件分析页面确认爬虫请求不再被拦截。

说明

基础版套餐仅支持 2 条白名单规则。如果白名单名额不够用,可将 IP 类的加白移至 IP 访问规则处理。

2.2 手机端或第三方引用图片被拦截

现象:电脑浏览器正常,手机端查看网站图片加载失败;网站图片无法被复制到微信公众号等第三方平台。

根因:配置了空 Referer 拦截规则,但手机浏览器或第三方平台请求图片时可能不携带 Referer。

解决

  1. 将引用来源域名(如 mp.weixin.qq.com)添加到白名单。

  2. 检查是否存在跨域引用(如 www.example.com 引用 img.example.com),跨域来源也需添加到 Referer 白名单。

  3. 如果需要防盗链但不影响正常引用,改为拦截 Referer 存在但不包含自己域名的请求。

验证:修改规则后,使用手机浏览器访问网站,确认图片正常加载。

2.3 API 接口被 JS 挑战拦截

现象:后端 API 调用返回了 HTML 页面(挑战页面)而非预期的 JSON 数据。

根因:JS 挑战需要浏览器环境执行 JavaScript,后端 API 请求无法完成挑战。

解决

  • 为 API 路径添加白名单,跳过安全规则:条件为 URI 路径包含/api/

  • 或将自定义规则的执行动作从 JS挑战改为拦截观察

  • 对于支付回调、Webhook 等第三方回调接口,同样需要通过白名单放行。

验证:修改规则后,调用 API 接口确认返回正常的 JSON 数据。

2.4 Google Ads 或百度推广着陆页被拦截

现象:广告平台的着陆页被 ESA 挑战页面替代,广告平台检测到异常。

解决

  1. 为广告着陆页 URL 添加白名单,配置跳过安全规则。

  2. User Agent 包含AdsBot-GoogleBaiduspider 的请求加入白名单。

验证:添加白名单后,通过广告平台的验证工具确认着陆页可正常访问。

场景三:多条规则冲突或优先级异常

典型现象:配置了多条自定义规则,实际执行结果与预期不符。

3.1 规则执行顺序

自定义规则按照从上到下的顺序依次匹配。一旦请求命中某条规则,即执行该规则的动作,不再继续匹配后续规则。

排查步骤

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏选择安全防护 > WAF > 自定义规则

  3. 检查规则列表的排列顺序。

  4. 使用拖拽功能调整规则优先级。

  5. 将更具体的规则(如特定 IP 放行)放在更宽泛的规则(如全局拦截)之前。

验证:调整顺序后,发送测试请求并到事件分析页面确认命中的是预期规则。

3.2 白名单与拦截规则的关系

问题:设置了自定义拦截规则,又设置了白名单放行,但白名单似乎没有生效。

解释:白名单规则的优先级高于所有自定义规则。如果白名单未生效,请检查白名单的匹配条件是否正确配置。

验证:通过事件分析页面确认请求是否命中了白名单规则。如果未命中,检查白名单的匹配条件。

3.3 频次控制与自定义规则的叠加

问题:同时配置了频次控制和自定义规则,请求被重复处理。

解释:频次控制和自定义规则是独立执行的。一个请求可能同时命中频次控制和自定义规则,分别执行各自的动作。建议通过白名单统一管理需要放行的请求。

场景四:规则增删后效果延迟或不符合预期

4.1 规则修改后的生效时间

问题:修改或删除了 WAF 规则,但短时间内效果未变化。

解释:WAF 规则变更通常在 1~2 分钟内全球生效。如果超过 5 分钟仍未生效:

  1. 清除浏览器缓存后重试。

  2. 确认修改的是正确的站点和规则。

  3. 检查是否有其他规则(如托管规则)仍在拦截。

验证:等待 2 分钟后,发送测试请求并到事件分析页面确认规则变更已生效。

4.2 删除规则后仍然出现 403

问题:删除了所有自定义拦截规则,但访问仍返回 403。

排查步骤

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择安全防护 > 事件分析

  3. 查看 403 响应对应的规则 ID,确认是自定义规则还是托管规则拦截的。

  4. 如果是托管规则拦截,在左侧导航栏选择安全防护 > WAF > 托管规则,调低安全等级或关闭对应规则组。

验证:调整托管规则后,重新访问目标 URL,确认不再返回 403。

4.3 缓存与 WAF 规则的交互

问题:刷新缓存后 WAF 规则行为发生变化。

解释:ESA 的缓存层位于 WAF 层之前。如果请求命中缓存(HIT),直接返回缓存内容,不经过 WAF 检查。因此:

  • 被 WAF 拦截的请求不会被缓存。

  • 已缓存的内容不受后续 WAF 规则变更影响,需要刷新缓存才能使新规则对已缓存的 URL 生效。

场景五:套餐版本功能限制

典型现象:WAF 自定义规则配置页面的部分选项灰色不可用或保存时报错。

5.1 常见版本限制

功能分类

详细功能项

免费版(0 元/月)

基础版(9.9 元/月)

标准版(375 元/月)

高级版(3600 元/月)

企业版(联系销售定制)

WAF

自定义规则

5

10

50

100

100

频次控制规则

1

1

3

5

10

频次控制-统计时长枚举

10

  • 10

  • 15分钟

  • 10

  • 1分钟

  • 15分钟

  • 10

  • 1分钟

  • 2分钟

  • 5分钟

  • 10分钟

  • 15分钟

  • 5秒钟

  • 10

  • 1分钟

  • 2分钟

  • 5分钟

  • 10分钟

  • 15分钟

  • 1小时

频次控制-持续时间枚举

10

  • 10

  • 1小时

  • 10

  • 1分钟

  • 10分钟

  • 1小时

  • 10

  • 1分钟

  • 2分钟

  • 5分钟

  • 10分钟

  • 1小时

  • 10

  • 1分钟

  • 2分钟

  • 5分钟

  • 10分钟

  • 1小时

  • 1

频次控制-特征

客户端IP

  • 主机名

  • 客户端IP

  • 主机名

  • 客户端IP

  • 标头

  • URI查询字符串

  • Cookie

  • 主机名

  • 客户端IP

  • 标头

  • URI查询字符串

  • Cookie

  • URI

  • URI路径

  • ASN编号

  • 主机名

  • 客户端IP

  • 标头

  • URI查询字符串

  • Cookie

  • URI

  • URI路径

  • ASN编号

  • URI指定查询字符串

  • HTTP版本

  • User Agent

  • X-Forwarded-For

  • MIME类型

频次控制-在缓存请求上应用

不支持

不支持

支持

支持

支持

IP访问规则

50

200 条

300 条

400 条

400 条

白名单规则

1

2

3

5

10

托管规则

支持基础规则

支持基础规则

支持全部规则

支持全部规则

支持全部规则

扫描防护规则

不支持

不支持

5

10

20

JS挑战

不支持

支持

支持

支持

支持

滑块挑战

不支持

不支持

支持

支持

支持

严格滑块

不支持

不支持

不支持

不支持

支持

定制场景策略

账号级别配额,默认规则条数上限10条。

自定义页面

自定义规则组

IP 网段 / 分组

DDoS告警

不支持

不支持

不支持

不支持

支持

四层代理(含四层DDoS防护)

不支持

不支持

不支持

不支持

支持

5.2 规则数量超限(OverQuota)

现象:保存规则时提示 Phase.HttpCustom.RulesetPerPhase.Length.OverQuota

解决

  1. 删除不再需要的规则,腾出名额。

  2. 合并多条相似规则(使用 OR 逻辑连接多个条件)。

  3. 升级套餐以获取更多规则配额。

5.3 部分匹配条件不可用

现象:自定义规则的请求方法标头等选项灰色不可选。

解决:当前套餐版本不支持该匹配条件。如需使用,请升级套餐

通过 API 批量管理 WAF 规则

如需批量管理 IP 黑白名单(如 2~3 万个 IP)或定时自动更新规则,可通过 OpenAPI 管理 WAF 规则。ESA 提供以下 OpenAPI 接口:

API

说明

ListWafRules

查询 WAF 规则列表

CreateWafRule

新增 WAF 规则

UpdateWafRule

修改 WAF 规则

DeleteWafRule

删除 WAF 规则

BatchCreateWafRules

批量创建规则

通过阿里云 CLI 调用示例:

# 查询 WAF 规则列表
# 站点 ID 可在 ESA 控制台的站点概览页获取
aliyun esa ListWafRules --SiteId <站点ID> --Phase HttpCustom

如需封禁大量 IP,建议使用 IP访问规则而非自定义规则:

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏选择安全防护 > WAF > IP访问规则

  3. 批量添加 IP 地址,或通过 API 批量操作进行拦截。

说明

IP 访问规则的 IP 黑名单和自定义规则的 IP 拦截功能等价,但 IP 访问规则不占用自定义规则名额。

配置示例

拦截敏感文件路径

以下示例拦截 .git.env 等敏感文件路径的访问请求:

条件

匹配字段

操作

条件 1

URI 路径

包含

.git

条件 2(OR)

URI 路径

包含

.env

执行动作:拦截

说明

请根据业务实际需求调整匹配条件,避免误拦截合法请求。例如拦截 .json 文件时,建议使用更精确的路径(如 package.jsoncomposer.json)而非通配所有 .json 请求。

仅允许中国内地访问

条件

匹配字段

操作

条件 1

地域

不等于

中国内地

执行动作:拦截

Referer 防盗链配置

以下示例允许空 Referer 和自身域名访问,拦截其他来源的请求:

规则

条件

执行动作

规则 1(白名单)

Referer 不存在

跳过所有安全规则

规则 2(白名单)

Referer 包含example.com

跳过所有安全规则

规则 3(拦截)

所有请求

拦截