跳到主要内容
版本:v6.x

WAF防护

Cdnfly v6 的 WAF(Web 应用防火墙)在节点上通过 OpenResty + 自研检测引擎实现,可防御 SQL 注入、XSS、命令注入、文件上传等常见 Web 攻击,并支持自定义规则库和在线订阅更新。

WAF 相关的配置分三处:

功能入口
网站级 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规则",管理可复用的规则库。如图:

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 检测,请求正常通过
观察记录只写入 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 防护开关 - 全局默认状态,"区域及节点配置"选项卡可按区域或节点单独反向覆盖
  • 单次请求处理上限 - 控制 WAF 检查单个请求的范围,避免复杂或恶意请求占用过多节点资源;请求超过任一限制会被直接拦截(返回 403)。数值越大能处理的请求越复杂,但 CPU 和内存消耗也越高。可点"恢复推荐值"还原:
配置项推荐值说明
单个参数检查数量1024一个参数解码后最多拆分出多少项交给 WAF 检查
单次请求检查数量4096一次请求中所有参数合计最多检查多少项
最多检测次数8192一次请求最多允许 WAF 执行多少次检测
JSON 字段和值数量512单个 JSON 参数最多读取多少个字段和值
JSON 结构总数8192一次请求最多处理多少个 JSON 对象、数组和值
JSON 嵌套层数64JSON 对象和数组最多允许嵌套多少层
JSON 单项文本大小256 KB单个 JSON 文本值最多允许多大
JSON 请求体大小1024 KB一次请求最多完整解析多大的 JSON 内容
表单字段和文件数量128一次表单上传最多包含多少个字段和文件
单次请求扫描大小16 MBWAF 最多检查多大的请求内容(含上传文件和解压后的内容)

注意:开启 WAF 后,网站"高级设置"里的上传大小限制仍受"单次请求扫描大小"约束,大文件接口请到"WAF防护 → 放行规则"按请求路径单独放行。

区域及节点覆盖

"防火墙配置 → 区域及节点配置"选项卡可按区域或单个节点覆盖全局 CC/WAF 运行参数:

防火墙配置 - 区域及节点配置

点"新增设置"选择覆盖范围(某区域或某节点),再勾选要覆盖的配置项(如 WAF 防护开关、单次请求处理上限)并填入新值。典型场景:

  • 个别节点配置较低,调小"单次请求扫描大小"等资源上限,避免 WAF 占用过多 CPU
  • 某区域需要临时关闭 WAF 排查问题,只对该区域覆盖关闭,不影响其他区域

未覆盖的配置项仍跟随全局配置。

套餐权限

套餐中有"WAF防护"权限开关(套餐管理 → 编辑套餐)。网站开启 WAF 总开关或攻击自动封禁时校验该权限;套餐关闭 WAF 权限时,系统会自动关闭该套餐下用户站点的 WAF 总开关。

拦截与日志

  • 内置模块或自动封禁拦截:返回 403,展示"WAF拦截页面"
  • 自定义规则拦截:按规则配置返回 403/404/444 或跳转

自定义拦截页面

进入"全局配置 → 错误页面",在"错误页面选择"中点"WAF拦截页面",可修改拦截时展示给访客的 HTML(留空则使用默认页面):

错误页面 - WAF拦截页面

默认页面已包含拦截原因提示和请求标识,可在其基础上加公司品牌信息或申诉联系方式。同一页面的"区域及节点配置"选项卡也可按区域/节点使用不同的拦截页面。

WAF 日志

进入"统计分析 → WAF日志"。"安全概览"展示攻击总数、拦截次数、观察次数、自动封禁次数、独立客户端 IP 数,以及攻击趋势图和攻击类型分布:

统计分析 - WAF日志安全概览

"日志明细"列出每条拦截/观察记录,可按域名查询,也可点"高级搜索"按客户端 IP、URI、攻击类型等组合过滤:

统计分析 - WAF日志明细

日志明细字段说明:

字段说明
时间拦截发生时间(节点本地时间)
域名被攻击的网站域名
动作拦截 / 观察;观察表示规则为"仅观察"或"观察记录",实际未拦截
模块命中的检测模块(如 SQL 注入检测)或规则库名称
攻击类型攻击分类(如 SQL 注入、XSS、N-day 漏洞利用)
URI被攻击的请求地址
客户端IP攻击来源 IP
命中位置攻击载荷所在位置(如请求参数、请求Body、User-Agent)
命中内容实际命中的内容片段,判断误报时主要看这一项

误报处理流程

业务正常请求被拦(如富文本提交、大文件上传)时,按以下步骤处理,避免直接关闭 WAF:

  1. 到"统计分析 → WAF日志 → 日志明细"按域名和时间找到该条记录,确认"模块"和"命中内容",判断是哪个模块/规则误判了什么内容
  2. 若命中的是自定义规则库,把对应规则改为"观察记录"或调整条件;若命中的是内置模块,可在网站编辑 → WAF防护 把该模块临时改为"仅观察"验证
  3. 确认无误后,优先用"放行规则"按最小范围放行(如只放行特定路径),而不是整站关闭模块;确属模块误判且影响面大的,再考虑将该模块长期设为"仅观察"

验证 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 总开关,重新开启权限后需要到各站点手动打开。