WAF防护
Cdnfly v6 的 WAF(Web 应用防火墙)在节点上通过 OpenResty + 自研检测引擎实现,可防御 SQL 注入、XSS、命令注入、文件上传等常见 Web 攻击,并支持自定义规则库和在线订阅更新。
WAF 相关的配置分三处:
| 功能 | 入口 |
|---|---|
| 网站级 WAF 防护 | 网站管理 → 网站列表 → 管理 → "WAF防护"选项卡 |
| 全局 WAF 规则库 | 网站管理 → WAF规则 |
| WAF 全局配置(开关与资源上限) | 全局配置 → 防火墙配置 → "WAF全局配置"选项卡 |
拦截日志在"统计分析 → WAF日志"查看;拦截页面可在"全局配置 → 错误页面"中自定义"WAF拦截页面"。
网站级 WAF 防护
在网站编辑的"WAF防护"选项卡中配置,实际执行顺序为:放行规则 → 规则库防护 → 内置模块防护。
- 站点 WAF 总开关 - 关闭后该站点跳过放行规则、规则库防护和内置模块防护,配置保留。开启需要网站所用套餐具有 WAF 防护权限,否则提示"当前网站使用的套餐没有WAF防护权限"
- WAF 攻击自动封禁 - 统计内置模块、自定义规则和 N-day 规则的实际拦截,同一 IP 在统计窗口(默认 60 秒)内达到命中阈值(默认 20 次)后,自动临时封禁该 IP(默认 600 秒)
- 内置模块防护 - 10 个检测模块,每个可单独设为 禁用 / 仅观察 / 防护(默认全部防护,可批量配置): SQL 注入检测、XSS 检测、文件上传检测、文件包含检测、命令注入检测、JAVA 代码注入检测、JAVA 反序列化检测、PHP 代码注入检测、PHP 反序列化检测、SSTI 模板注入检测。 "仅观察"只记录不拦截,可用于先观察误报情况再决定是否开启防护
规则库防护与放行规则
"WAF防护"选项卡下方是规则库防护和放行规则两个区域:
- 规则库防护 - 把"WAF规则"页创建的规则库应用到本站。左侧"可添加规则库"选择规则库点"应用",右侧"当前生效规则库"显示已生效的规则库,可添加多个并拖动调整顺序,靠前的先执行
- 放行规则 - 命中后跳过后续所有 WAF 检测(内置模块和规则库都不再检查),用于处理业务误报。放行规则的条件写法与自定义规则相同,例如大文件上传接口可按"路径URI 前缀匹配 /upload/"放行
典型用法:先在"WAF规则"页建好规则库(如下文的"拦截后台路径"),再到各网站的"规则库防护"中按需应用,实现一处维护、多站复用。
全局 WAF 规则库
进入"网站管理 → WAF规则",管理可复用的规则库。如图:
点击"新增规则库"创建规则库:
- 名称 / 备注 - 规则库名称与说明
- 范围 - "用户"仅指定用户可用;"全局"(仅管理员可建)所有用户可用
- 订阅更新 - 全局规则库可开启订阅:填写订阅地址(返回 JSON 格式的规则,最大 8 MB)和更新间隔(5–10080 分钟,默认 360 分钟),系统按周期自动拉取更新;也可在列表页点"立即更新订阅"手动触发
- 系统预置规则库 - 安装时自带"已知漏洞防护"(N-day)规则库,默认从官方源在线更新,无需手工维护
规则库内每条规则的组成:
- 执行动作 - 直接放行 / 观察记录 / 防护处理;防护处理可自定义响应:返回 403、返回 404、返回 444 或 301/302/307 跳转
- 匹配条件组 - 同一条件组内的条件为"且"关系,不同条件组之间为"或"关系
- 匹配项 - 支持客户端IP、Host、请求协议、请求方法、完整URI、路径URI、请求头、请求参数、Cookie、请求Body、国家/地区码、省份、城市、运营商、ASN、TLS指纹、日期、时间、星期等
- 操作符 - 等于/不等于、包含/不包含、前缀/后缀匹配、正则匹配/正则不匹配、存在/不存在、大于/小于、在列表中、在IP段等(按字段类型不同)
- 转换 - 匹配前可对取值做 小写、URL解码、长度计算 等转换
数量限制:手动规则每库最多 50 条,订阅规则最多 5000 条;每条规则最多 10 个条件组、每组最多 10 个条件。
规则编辑器
在规则库中新增/编辑规则时打开规则编辑器,依次设置规则名称、执行动作和匹配条件组:
执行动作三选一:
| 动作 | 行为 |
|---|---|
| 直接放行 | 命中后不再执行后续 WAF 检测,请求正常通过 |
| 观察记录 | 只写入 WAF 日志(动作标记为"观察"),不拦截,用于上线前验证规则命中率 |
| 防护处理 | 拦截并返回自定义响应:403、404、444(直接断开)或 301/302/307 跳转到指定地址 |
条件按"组"组织:同一条件组内多个条件为"且"关系,不同条件组之间为"或"关系。每条匹配条件由四部分组成:
- 匹配项 - 分三类:
- 请求类:Host、请求协议、请求方法、完整URI、路径URI、请求头、请求参数、Cookie、请求Body
- 客户端类:客户端IP、国家/地区码、省份、城市、运营商、ASN、TLS指纹
- 时间类:日期、时间、星期(按节点本地时间匹配,适合"工作时间才允许访问后台"这类场景)
- 操作符 - 等于/不等于、包含/不包含、前缀匹配、后缀匹配、正则匹配/正则不匹配、存在/不存在、大于/小于、在列表中、在IP段等(按匹配项类型提供)
- 转换 - 匹配前对取值做预处理:小写、URL解码、长度计算。例如匹配 Body 前先"URL解码",可避免攻击者用编码绕过
- 匹配值 - 期望值;请求头/请求参数/Cookie 类匹配项还需填写字段名(如请求头
User-Agent)
实用示例
示例一:拦截直接访问后台路径
新增规则,执行动作选"防护处理 → 返回 403",条件:
| 匹配项 | 操作符 | 转换 | 匹配值 |
|---|---|---|---|
| 路径URI | 前缀匹配 | 小写 | /admin |
如需放行公司出口 IP,可在同一规则中再加一个条件组(组间为"或"):第一组保持上述条件,再建一条"直接放行"规则置于其上,条件为"客户端IP 在IP段 203.0.113.0/24"。
示例二:放行 API 接口避免误拦
JSON API 的复杂参数容易被 SQL 注入模块误判。到网站编辑 → WAF防护 → 放行规则,新增放行规则:
| 匹配项 | 操作符 | 匹配值 |
|---|---|---|
| 路径URI | 前缀匹配 | /api/ |
命中后该接口完全跳过 WAF 检测。
订阅规则格式
订阅地址需返回如下 JSON(可参考官方 N-day 库):
{
"version": "20260809",
"generated_at": "2026-08-09T09:00:00+08:00",
"rules": [
{
"id": "cve-2017-5638-struts-s2-045",
"name": "CVE-2017-5638 Apache Struts S2-045",
"enable": 1,
"action": "protect",
"action_config": {"status": "403"},
"matcher_groups": [
{"matcher": [
{"field": "header", "key": "Content-Type", "op": "contain", "value": "%{", "transform": "lower"}
]}
]
}
]
}
要点:action 取值 pass(放行)/observe(观察)/protect(防护);matcher_groups 数组内各组为"或",组内 matcher 数组各条件为"且";整个响应不能超过 8 MB、规则不超过 5000 条。
WAF 全局配置
进入"全局配置 → 防火墙配置 → WAF全局配置"选项卡:
- WAF 防护开关 - 全局默认状态,"区域及节点配置"选项卡可按区域或节点单独反向覆盖
- 单次请求处理上限 - 控制 WAF 检查单个请求的范围,避免复杂或恶意请求占用过多节点资源;请求超过任一限制会被直接拦截(返回 403)。数值越大能处理的请求越复杂,但 CPU 和内存消耗也越高。可点"恢复推荐值"还原:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 单个参数检查数量 | 1024 | 一个参数解码后最多拆分出多少项交给 WAF 检查 |
| 单次请求检查数量 | 4096 | 一次请求中所有参数合计最多检查多少项 |
| 最多检测次数 | 8192 | 一次请求最多允许 WAF 执行多少次检测 |
| JSON 字段和值数量 | 512 | 单个 JSON 参数最多读取多少个字段和值 |
| JSON 结构总数 | 8192 | 一次请求最多处理多少个 JSON 对象、数组和值 |
| JSON 嵌套层数 | 64 | JSON 对象和数组最多允许嵌套多少层 |
| JSON 单项文本大小 | 256 KB | 单个 JSON 文本值最多允许多大 |
| JSON 请求体大小 | 1024 KB | 一次请求最多完整解析多大的 JSON 内容 |
| 表单字段和文件数量 | 128 | 一次表单上传最多包含多少个字段和文件 |
| 单次请求扫描大小 | 16 MB | WAF 最多检查多大的请求内容(含上传文件和解压后的内容) |
注意:开启 WAF 后,网站"高级设置"里的上传大小限制仍受"单次请求扫描大小"约束,大文件接口请到"WAF防护 → 放行规则"按请求路径单独放行。
区域及节点覆盖
"防火墙配置 → 区域及节点配置"选项卡可按区域或单个节点覆盖全局 CC/WAF 运行参数:
点"新增设置"选择覆盖范围(某区域或某节点),再勾选要覆盖的配置项(如 WAF 防护开关、单次请求处理上限)并填入新值。典型场景:
- 个别节点配置较低,调小"单次请求扫描大小"等资源上限,避免 WAF 占用过多 CPU
- 某区域需要临时关闭 WAF 排查问题,只对该区域覆盖关闭,不影响其他区域
未覆盖的配置项仍跟随全局配置。
套餐权限
套餐中有"WAF防护"权限开关(套餐管理 → 编辑套餐)。网站开启 WAF 总开关或攻击自动封禁时校验该权限;套餐关闭 WAF 权限时,系统会自动关闭该套餐下用户站点的 WAF 总开关。
拦截与日志
- 内置模块或自动封禁拦截:返回 403,展示"WAF拦截页面"
- 自定义规则拦截:按规则配置返回 403/404/444 或跳转
自定义拦截页面
进入"全局配置 → 错误页面",在"错误页面选择"中点"WAF拦截页面",可修改拦截时展示给访客的 HTML(留空则使用默认页面):
默认页面已包含拦截原因提示和请求标识,可在其基础上加公司品牌信息或申诉联系方式。同一页面的"区域及节点配置"选项卡也可按区域/节点使用不同的拦截页面。
WAF 日志
进入"统计分析 → WAF日志"。"安全概览"展示攻击总数、拦截次数、观察次数、自动封禁次数、独立客户端 IP 数,以及攻击趋势图和攻击类型分布:
"日志明细"列出每条拦截/观察记录,可按域名查询,也可点"高级搜索"按客户端 IP、URI、攻击类型等组合过滤:
日志明细字段说明:
| 字段 | 说明 |
|---|---|
| 时间 | 拦截发生时间(节点本地时间) |
| 域名 | 被攻击的网站域名 |
| 动作 | 拦截 / 观察;观察表示规则为"仅观察"或"观察记录",实际未拦截 |
| 模块 | 命中的检测模块(如 SQL 注入检测)或规则库名称 |
| 攻击类型 | 攻击分类(如 SQL 注入、XSS、N-day 漏洞利用) |
| URI | 被攻击的请求地址 |
| 客户端IP | 攻击来源 IP |
| 命中位置 | 攻击载荷所在位置(如请求参数、请求Body、User-Agent) |
| 命中内容 | 实际命中的内容片段,判断误报时主要看这一项 |
误报处理流程
业务正常请求被拦(如富文本提交、大文件上传)时,按以下步骤处理,避免直接关闭 WAF:
- 到"统计分析 → WAF日志 → 日志明细"按域名和时间找到该条记录,确认"模块"和"命中内容",判断是哪个模块/规则误判了什么内容
- 若命中的是自定义规则库,把对应规则改为"观察记录"或调整条件;若命中的是内置模块,可在网站编辑 → WAF防护 把该模块临时改为"仅观察"验证
- 确认无误后,优先用"放行规则"按最小范围放行(如只放行特定路径),而不是整站关闭模块;确属模块误判且影响面大的,再考虑将该模块长期设为"仅观察"
验证 WAF 是否生效
把内置模块保持默认"防护",对站点发起一个带 SQL 注入特征的测试请求:
curl -I "https://你的域名/?id=1'%20union%20select%201,2,3--"
WAF 正常工作时返回 403 并展示拦截页面,同时"WAF日志 → 日志明细"新增一条模块为"SQL 注入检测"的拦截记录;返回 200 则说明 WAF 未开启或该路径已被放行。
常见问题
开启 WAF 后大文件上传被拦(403) 上传内容会占用"单次请求扫描大小"(默认 16 MB),超限直接 403。处理方式:到网站编辑 → WAF防护 → 放行规则,按路径放行上传接口(推荐);或在"防火墙配置 → WAF全局配置"调大"单次请求扫描大小"(会增加节点 CPU/内存消耗)。
全站所有请求都返回 403 依次检查:网站编辑 → WAF防护 的总开关与放行规则是否配置错误(如放行条件写反);是否触发了"攻击自动封禁"(用其他 IP 访问对比);"WAF全局配置"的资源上限是否被调得过小导致正常请求超限。
订阅规则库没有更新 在"WAF规则"列表点该规则库的"立即更新订阅"手动触发并观察提示;检查节点到订阅地址的网络连通性(响应需为上述 JSON 格式、不超过 8 MB);更新间隔最短 5 分钟,频繁修改间隔不会立即生效。
套餐调整 WAF 权限后站点表现异常 套餐关闭"WAF防护"权限时,系统会自动关闭该套餐下所有站点的 WAF 总开关,重新开启权限后需要到各站点手动打开。