Cloudflare 已将现有 Firewall Rules(防火墙规则) 升级为 WAF 自定义规则。使用自定义规则可获得同等级别的防护,并获得一些新增功能。自定义规则在 Cloudflare 仪表板中的位置如下:
- 旧版仪表板:Security(安全) > WAF > Custom rules(自定义规则)。
- 新版安全中心:Security(安全) > Security rules(安全规则)。
防火墙规则与 WAF 自定义规则的主要差异如下:
- Block(拦截)动作增强响应
- 被阻断请求使用不同错误页
- 新增 Skip(跳过)动作,替代 Allow(放行)与 Bypass(绕过)
- 自定义规则按顺序评估
- 日志与事件
- 新的 API 与 Terraform 资源
在 WAF 自定义规则中,您可以自定义 Block(拦截) 动作的响应。
默认阻断响应是 Cloudflare 标准 HTML 页面。如果您需要为 Block(拦截) 动作返回自定义响应,请配置自定义规则返回固定响应:自定义响应码(默认 403)和自定义响应体(HTML、JSON、XML 或纯文本)。
防火墙规则中的 Block(拦截) 动作阻断请求时,会返回 Cloudflare 1020 错误码响应。Cloudflare 用户可在 Error Pages(错误页) > 1000 类错误(1000 class errors) 中为区域自定义该错误页。
WAF 自定义规则阻断请求时会返回其他响应:WAF 阻断响应。您可以通过以下任一方式自定义默认阻断响应:
- 在 Error Pages(错误页) ↗ > WAF 阻断(WAF block) 为整个区域定义自定义 WAF 阻断页。该错误页始终为 HTML 内容类型。
- 为被特定 WAF 自定义规则阻断的请求定义自定义响应。此自定义响应支持 HTML 之外的其他内容类型。
如果您已在 Error Pages(错误页) 中为防火墙规则的阻断请求自定义 1XXX 错误页,则需要使用上述方法之一为新规则创建新的响应页。
更多错误页信息请参阅 自定义错误(Custom Errors)。
Firewall Rules(防火墙规则)支持 Allow(放行) 和 Bypass(绕过) 动作,这两个动作经常一起使用。它们通常用于处理已知合法请求,例如来自可信 IP 地址的请求。
当请求触发 Allow(放行) 时,所有剩余防火墙规则不会被评估,相当于允许该请求继续走到下一个安全产品。Bypass(绕过) 动作用于指定该请求不应执行的安全产品(例如 WAF 受管规则、速率限制规则和 User-Agent 封禁)。
使用 Firewall Rules(防火墙规则)时,如需对单个请求停止所有安全产品,您通常需要两条规则:
- 一条设置 Bypass(绕过) 动作并选择所有安全产品;
- 一条设置 Allow(放行) 动作用于停止其他防火墙规则。
WAF 自定义规则不再需要为该常见场景创建两条规则。请改为使用 Skip(跳过)动作,它同时覆盖 Allow(放行) 与 Bypass(绕过)。在 WAF 自定义规则中,Skip(跳过) 完全替代了不再支持的 Allow(放行) 与 Bypass(绕过)。
使用 Skip(跳过) 后可实现以下行为:
- 停止执行剩余自定义规则(相当于 Allow(放行) 动作)
- 跳过其他安全产品(相当于 Bypass(绕过) 动作)
- 以上两者的任意组合
您还可选择是否记录命中 Skip(跳过) 的自定义规则事件。在构建“正向安全模型”时,此项可避免因记录大量合法流量而造成日志噪音。
使用 优先级排序 时,防火墙规则遵循明确的优先级顺序。相比之下,自定义规则没有该顺序约束。自定义规则始终按顺序评估,且某些动作(如 Block(拦截))会停止后续规则评估。
例如:若使用优先级排序并且以下防火墙规则具有相同优先级,且都匹配一条入站请求:
- 防火墙规则 #1 — 优先级:2 / 动作:Block(拦截)
- 防火墙规则 #2 — 优先级:2 / 动作:Allow(放行)
该请求会被放行,因为在 Firewall Rules(防火墙规则)中 Allow(放行) 动作优先级高于 Block(拦截)。
若您创建两条都匹配入站请求的自定义规则:
- 自定义规则 #1 — 动作:Block(拦截)
- 自定义规则 #2 — 动作:Skip(跳过)(配置为跳过所有剩余自定义规则)
该请求会被阻断,因为自定义规则按顺序执行,且 Block(拦截) 动作会终止后续规则评估。
自定义规则记录的事件会在 Security Events(安全事件) 中显示,来源显示为 Custom Rules(自定义规则)。
在选择包含规则转换时间段的时间范围时,您仍可能在 Security Events(安全事件)中看到由 Firewall Rules(防火墙规则)产生的事件。同样,在转换过渡期同一视图中也可能同时看到 Skip(跳过) 与 Allow(放行) 动作的事件。
管理 WAF 自定义规则推荐使用 规则集 API。新规则集 API 已在 Cloudflare 大多数安全产品中用于统一 API 使用体验。更多迁移至规则集 API 的信息,请参阅 API 用户的相关变更。
自 2025-06-15 起,Firewall Rules API(防火墙规则 API)与 Filters API(筛选器 API)不再受支持。现在防火墙规则和 WAF 自定义规则共用单一规则列表,且该列表存放的是 WAF 自定义规则。得益于内部转换流程,在 API 下线日期前,Firewall Rules API 和 Filters API 返回的是由 WAF 自定义规则转换而来的 firewall rules 与 filters(防火墙规则与筛选器)。
如果您使用 Terraform,需将配置更新为使用 http_request_firewall_custom 阶段的 cloudflare_ruleset ↗ 资源来管理自定义规则。更多 Terraform 配置更新信息,请参阅 Terraform 用户的相关变更。
Cloudflare 仪表板中的 Firewall Rules(防火墙规则)页签已弃用。 防火墙规则现在在 Cloudflare 仪表板中显示为 自定义规则。
对于同时可访问两个产品页面的用户,Firewall rules(防火墙规则) 页签仅在旧版控制台的 Security(安全) > WAF 中可见。
Firewall Rules API(防火墙规则 API) 和配套 Cloudflare Filters API(筛选器 API) 现已弃用。 以上 API 自 2025-06-15 起不再受支持。您必须手动将基于 Firewall Rules API(防火墙规则 API)或 Filters API(筛选器 API)的自动化更新为 Rulesets API(规则集 API),以避免问题。由于防火墙规则与自定义规则的规则 ID 不同,可能会影响按特定 ID 运行的自动化流程。
API 下线日期前,Cloudflare 会在内部将您的 Firewall Rules API(防火墙规则 API) 与 Filters API(筛选器 API) 请求转换为对应的 Rulesets API(规则集 API) 请求。转换后的 API 调用在审计日志中显示为由 Cloudflare 生成,而非实际发起调用的用户。当前仍采用单一规则列表。
WAF 自定义规则的一些新功能(如阻断请求的自定义响应、Skip(跳过) 动作)不支持 Firewall Rules(防火墙规则)API。要使用这些能力,Cloudflare 建议您使用 Cloudflare 仪表板中的自定义规则页面或规则集 API。
请参阅 WAF 文档中的 使用规则集 API 管理 WAF 自定义规则示例。
Cloudflare Provider 中以下 Terraform 资源现已弃用:
这些资源自 2025-06-15 起不再受支持。若您通过这些资源管理 Firewall Rules(防火墙规则)配置,必须手动将 Terraform 配置更新为 cloudflare_ruleset ↗ 资源,以避免问题。
防火墙规则与 WAF 自定义规则仍使用同一规则列表。
WAF 自定义规则的一些新功能在旧版 Terraform 资源中不受支持。要使用这些能力,请使用 cloudflare_ruleset 资源。
请参阅 Terraform 文档中的使用 Terraform 配置 WAF 自定义规则示例。
您可以使用 cf-terraforming ↗ 工具生成当前 WAF 自定义规则(由 Cloudflare 从您的防火墙规则转换)的 Terraform 配置,并将新资源导入 Terraform state。
替换 Terraform 中防火墙规则(及筛选器 filter)为新的 ruleset(规则集)配置建议步骤如下:
-
运行以下命令,生成某个 zone 的所有 ruleset 配置:
cf-terraforming generate --zone <ZONE_ID> --resource-type "cloudflare_ruleset"resource "cloudflare_ruleset" "terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31" { kind = "zone" name = "default" phase = "http_request_firewall_custom" zone_id = "<ZONE_ID>" rules { [...] } [...] } -
该命令可能返回其他基于 规则引擎 的 Cloudflare 产品 ruleset 配置。因为您正在迁移防火墙规则到自定义规则,所以只保留
http_request_firewall_custom阶段的cloudflare_ruleset资源,并将其保存为.tf配置文件。下一步需要完整资源名。 -
使用
terraform import导入上一步识别到的cloudflare_ruleset资源,例如:terraform import cloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31 zone/<ZONE_ID>/3c0b456bc2aa443089c5f40f45f51b31cloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31:正在从 ID "zone/<ZONE_ID>/3c0b456bc2aa443089c5f40f45f51b31" 导入... cloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31:导入已准备! 已为导入准备 cloudflare_ruleset cloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31:正在刷新状态... [id=3c0b456bc2aa443089c5f40f45f51b31] 导入成功! 上述内容是已导入的资源,这些资源已进入 Terraform state,并由 Terraform 进行管理。 -
运行
terraform plan验证 Terraform 现在是否会在现有资源管理之外检查新的cloudflare_ruleset资源;例如:terraform plancloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31:正在刷新状态... [id=3c0b456bc2aa443089c5f40f45f51b31] [...] cloudflare_filter.my_filter:正在刷新状态... [id=14a2524fd75c419f8d273116815b6349] cloudflare_firewall_rule.my_firewall_rule:正在刷新状态... [id=0580eb5d92e344ddb2374979f74c3ddf] [...] -
从 Terraform state 中移除任何与防火墙规则和筛选器
filter相关的资源:-
运行以下命令查找所有与防火墙规则和筛选器
filter相关的资源:terraform state list | grep -E '^cloudflare_(filter|firewall_rule)\.'cloudflare_filter.my_filter cloudflare_firewall_rule.my_firewall_rule -
先以 dry-run 模式执行
terraform state rm ...,确认移除影响而不实际变更:terraform state rm -dry-run cloudflare_filter.my_filter cloudflare_firewall_rule.my_firewall_rule将移除 cloudflare_filter.my_filter 将移除 cloudflare_firewall_rule.my_firewall_rule -
若影响符合预期,去掉
-dry-run参数再次执行,正式移除 Terraform state 中的资源:terraform state rm cloudflare_filter.my_filter cloudflare_firewall_rule.my_firewall_rule已移除 cloudflare_filter.my_filter 已移除 cloudflare_firewall_rule.my_firewall_rule 已成功移除 2 个资源实例。
-
-
从 Terraform state 中移除防火墙规则与筛选器
filter资源后,从.tf配置文件删除cloudflare_filter和cloudflare_firewall_rule资源。 -
运行
terraform plan验证已删除的配置不再出现,且没有待处理变更。terraform plancloudflare_ruleset.terraform_managed_resource_3c0b456bc2aa443089c5f40f45f51b31:正在刷新状态... [id=3c0b456bc2aa443089c5f40f45f51b31] [...] 无变更。您的基础设施与配置一致。 Terraform 已将当前基础设施与配置进行对比,未发现差异,因此无需进行变更。
关于将 Cloudflare 资源导入 Terraform 及使用 cf-terraforming 工具,参考:
所有此前未暂停但其关联 filters(筛选器) 已暂停的防火墙规则,在转换为自定义规则后会被启用。