规则是使用 Cloudflare 规则语言(一种旨在模仿 Wireshark 语义的域特定语言 (DSL))编写的。有关更多信息,请参阅 Rules 语言文档。
从一个简单的示例开始,请在下方查看您如何匹配源 IP。在此表达式中,ip.src 指的是传入数据包的源 IP 地址,而 == 表示“等于”:
ip.src == 192.0.2.0通过逻辑运算符(&& 表示与 (AND),|| 表示或 (OR))连接多个子句,表达式可以更复杂。以下表达式匹配来自 192.0.2.1 且设置了 TCP push 或 reset 标志的数据包:
ip.src == 192.0.2.1 && (tcp.flags.push || tcp.flags.reset)您可以使用 Cloudflare Network Firewall 根据源或目的 IP、源或目的端口、协议、数据包长度或位字段匹配来跳过或阻止数据包。
表达式引擎支持 CIDR 表示法(例如 192.0.2.0/24 的 IP 地址范围),但仅在花括号集合中。裸比较将无法按预期工作:
ip.src == 192.0.2.0/24 # bad
ip.src in { 192.0.2.0/24 } # good表达式具有复杂度限制,当表达式中包含许多连接或嵌套的子句时,很容易达到该限制。以下是一个示例:
(tcp.dstport == 1000 || tcp.dstport == 1001) && (tcp.dstport == 1002 || tcp.dstport == 1003) && (tcp.dstport == 1004 || tcp.dstport == 1005) && (tcp.dstport == 1006 || tcp.dstport == 1007) && (tcp.dstport == 1008 || tcp.dstport == 1009) && (tcp.dstport == 1010 || tcp.dstport == 1011) && (tcp.dstport == 1012 || tcp.dstport == 1013) && (tcp.dstport == 1014 || tcp.dstport == 1015) && (tcp.dstport == 1016 || tcp.dstport == 1017)如果达到限制,响应将返回 400 状态码和 ruleset exceeds complexity constraints 错误消息。请将表达式拆分为多个规则,然后重试。每条规则可以处理条件的一个子集,防火墙会按顺序对它们进行评估。