Skip to content

[Rule] 流量分流策略 ​

本节用于配置网络流量分流策略,按自上而下的顺序依次匹配网络请求,并将其分发至指定目标动作或出口(直连、丢弃、代理服务器或调度组)。

匹配流程 ​

text
网络请求流入
    │
    ▼
┌─────────────────────────┐
│ DNS 前置阻断匹配         │  ──(命中 pre-matching & REJECT)──► 依据 dns-reject-behavior 返回拒绝响应
│ (pre-matching)          │
└───────────┬─────────────┘
            │ 未命中
            ▼
┌─────────────────────────┐
│ 逐行线性规则匹配         │
│ (自上而下,首命中即退出) │
            └───────────┬─────────────┘
            ├─────────────────────────────────────────────────┐
            ▼                                                 ▼
      命中域名/端口/协议等规则                            遇到 IP 规则 (IP-CIDR / GEOIP 等)
            │                                                 │
            │                                           ┌─────┴─────────────────┐
            │                                           │ 是否包含 no-resolve ? │
            │                                           └─────┬─────────────────┘
            │                                      是 (跳过匹配)│   │ 否 (发起 DNS 解析)
            │                                           ┌─────┘   ▼
            │                                           │    获得真实目标 IP
            │                                           │         │
            │                                           │    命中目标 IP 网段
            │                                           │         │
            ▼                                           ▼         ▼
      执行对应 target 目标动作 ◄──────────────────────────────────────┘
            │
            ▼ (所有规则均未命中)
      执行 FINAL 兜底分流策略
  1. 自上而下匹配与首命中退出(First-Match-Wins) 规则表自第一行开始顺序匹配。流量命中某条规则后,立即分发至该规则指定的 target 目标动作,并终止后续规则的评估。若全部规则均未命中,流量由 FINAL 兜底策略处理。
  2. DNS 阶段前置阻断(pre-matching) 带有 pre-matching 标志且目标为 REJECT 的域名规则在 DNS 解析阶段优先匹配。命中后直接依据 [General] 的 dns-reject-behavior 返回拦截响应(如黑洞地址或空响应),不建立网络连接。
  3. 域名解析与 IP 规则协作(no-resolve 选项) 基于 IP 的规则(如 IP-CIDR、GEOIP)在匹配域名请求时通常会先发起 DNS 解析获取 IP。附加 no-resolve 选项后,若当前请求尚未获得解析 IP,系统直接跳过该规则,不发起 DNS 查询。

语法声明 ​

[Rule] 规则行分为标准规则、复合逻辑规则与兜底规则三种形式:

ini
# 标准规则
TYPE, match_value, target, [options...]

# 复合逻辑规则
AND|OR, ((sub-rule-1), (sub-rule-2), ...), target, [options...]
NOT, ((sub-rule)), target, [options...]

# 兜底规则
FINAL, target, [options...]

语法要素说明 ​

  • TYPE:规则匹配类型,采用英文字母大写,例如 DOMAIN-SUFFIX、IP-CIDR 等。
  • match_value:规则判定条件值。根据类型不同,可为域名、IP 网段、端口号、国家代码或外部资源 URL 等。
  • sub-rule:复合逻辑规则中的子规则定义。子规则采用 (TYPE, match_value, [options...]) 格式书写,子规则内部不包含 target。
  • target:流量命中规则后的分流目标。支持填写在 Proxy 中定义的基本策略(如 DIRECT、REJECT)或代理服务器名称,以及在 Proxy Group 中定义的服务器调度组名称。
  • options:可选参数列表,多个参数以英文逗号分隔,支持键值对格式与独立开关标志。

规则类型详解 ​

域名规则 ​

  • DOMAIN(匹配值:完整域名字符串,如 example.com) 域名完整精准匹配。
  • DOMAIN-SUFFIX(匹配值:域名后缀字符串,如 apple.com) 匹配该域名本身及其所有下级子域名(如 api.apple.com)。
  • DOMAIN-KEYWORD(匹配值:关键词子串,如 google) 域名任意部分包含该关键词即命中。
  • DOMAIN-WILDCARD(匹配值:通配符模式,如 *.cdn.*.com) 支持 *(匹配零个或多个字符)与 ?(匹配单个字符)通配模式。
  • DOMAIN-SET(匹配值:本地文件路径或 HTTP/HTTPS URL) 引入外部纯文本域名列表,每行一个域名规则。

IP 与地理位置规则 ​

  • IP-CIDR(匹配值:IPv4 或 IPv6 CIDR 网段,如 192.168.1.0/24) 匹配目标服务器 IP 地址是否属于该网段。
  • IP-CIDR6(匹配值:IPv6 CIDR 网段,如 2001:db8::/32) 专门匹配 IPv6 目标地址网段。
  • SRC-IP-CIDR(匹配值:IPv4 或 IPv6 CIDR 网段,如 10.0.0.0/8) 匹配发起连接的来源客户端 IP 地址网段。
  • GEOIP(匹配值:两个字母的 ISO 国家/地区代码,如 CN、US) 依据内置或下载的 GeoIP 数据库判断目标 IP 归属地。
  • IP-ASN(匹配值:正整数 ASN 编号,如 15169) 匹配目标 IP 所在的自治系统编号(Autonomous System Number)。

端口与传输层协议规则 ​

  • DEST-PORT(匹配值:整数 1–65535) 匹配目标连接端口号。
  • SRC-PORT(匹配值:整数 1–65535) 匹配发起连接的本地来源端口号。
  • NETWORK(匹配值:TCP 或 UDP) 匹配连接的传输层协议类型。

应用层 HTTP 规则 ​

应用层规则依赖 HTTP 请求明文内容。对于非 HTTP 流量或未经 MITM 解密的 HTTPS 流量,此类规则将自动跳过并由后续规则继续匹配。

  • URL-REGEX(匹配值:正则表达式) 匹配 HTTP 请求的完整 URL 地址(包含路径与参数)。
  • USER-AGENT(匹配值:模式字符串,支持通配符) 匹配 HTTP 请求报文头中的 User-Agent 字段。

脚本规则 ​

  • SCRIPT(匹配值:同一配置的 [Script] 中声明的 type=rule 脚本名称) 语法为 SCRIPT,name,policy[,requires-resolve]。脚本读取 $request 并调用 $done({matched: true}) 或 $done({matched: false}) 返回条件结果;命中后的出站策略取自规则中的 policy,脚本不决定策略名称。规则脚本默认使用 QuickJS,环境字段与可用 API 见 Script。

    同一次路由请求内,重复引用同名脚本复用首次执行结果;不同请求分别执行。未设置 requires-resolve 时不会为该脚本主动解析域名;设置后先解析目标地址,并通过 $request.dnsResult 提供 IPv4 与 IPv6 地址列表。规则脚本禁止启用 pre-matching。

    主配置及插件合并后的 SCRIPT 引用必须存在且指向 type=rule,否则配置校验失败。外部规则资源在运行期加载;其中引用缺失、脚本资源不可用、执行异常或超时均将该脚本条件视为 false,记录日志后继续匹配。SCRIPT 可嵌套在 AND、OR、NOT 内,遵循普通布尔组合语义;因此 NOT(SCRIPT) 会反转异常时的 false 结果,使用时应考虑这一行为。

外部策略文件 ​

  • RULE-SET(匹配值:本地文件路径或 HTTP/HTTPS URL) 引入外部完整分流策略文件,每行包含完整的规则定义。
  • AUTO-SET(匹配值:本地文件路径或 HTTP/HTTPS URL) 自动识别并载入规则或域名集合。

复合逻辑规则 ​

复合逻辑规则用于实现多维度的联合匹配判定。子规则必须放置于双层括号 ((...)) 内,子规则之间用英文逗号分隔:

  • AND(语法:AND, ((sub_rule_1), (sub_rule_2), ...), target) 当所有包含的子规则均判定命中时,该规则命中。
  • OR(语法:OR, ((sub_rule_1), (sub_rule_2), ...), target) 只要包含的任一子规则判定命中,该规则命中。
  • NOT(语法:NOT, ((sub_rule)), target) 仅包含单个子规则,当该子规则不命中时,该规则命中。

兜底与系统规则 ​

  • FINAL(匹配值:无,直接填写目标) 匹配所有未能被前置规则捕获的剩余流量,作为规则表最终出口。当通过插件或外部配置对规则列表执行追加(%APPEND%)时,新规则将始终插入在 FINAL 规则之前。
  • PROCESS-NAME(匹配值:进程名称字符串) 预留配置项,当前版本作为占位保留。

规则选项 ​

各规则行可在目标字段后附加可选配置项:

  • no-resolve(布尔值或独立标志,默认未设置/等同于 false) 仅适用于基于 IP 的规则(IP-CIDR、GEOIP、IP-ASN 等)。设置为 true(或仅书写 no-resolve)时,若目标为域名且尚未解析为 IP,则跳过此规则,不执行 DNS 域名解析。
  • requires-resolve(布尔值或独立标志,默认值 false) 仅用于 SCRIPT。执行前解析域名并提供 $request.dnsResult;目标已经是 IP 地址时使用该原始地址。组合规则或外部资源包含需要解析的子规则时,沿用同一次请求的 DNS 解析结果。重复引用同名脚本仍复用首次执行结果,不因选项不同而重复执行。
  • pre-matching(布尔值或独立标志,默认值 false) 适用于域名类规则(DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、DOMAIN-WILDCARD、DOMAIN-SET)且目标必须为内置 REJECT。启用后将该规则纳入 DNS 前置拦截表,在域名解析阶段直接阻断。
  • refresh-interval(整数,单位:秒,未设置) 适用于外部引用资源规则(DOMAIN-SET、RULE-SET、AUTO-SET)。指定后台定时更新资源的间隔时长。

DNS 前置阻断机制 ​

带 pre-matching 选项的域名规则(且目标为 REJECT)在 DNS 解析阶段执行前置匹配:

  1. 执行时机:每次 DNS 查询先执行带有 pre-matching 标志的规则匹配,再复用或分配 Fake-IP,或发起上游 DNS 查询。已有和持久化恢复的映射不会绕过前置匹配;DOMAIN-SET 更新后,下次查询按当前内容判断。前置拦截优先于全局直连或全局代理模式生效。
  2. 响应行为:命中拦截后直接在 DNS 阶段终止解析并返回响应,具体的拦截响应格式由 General 中的 dns-reject-behavior 配置项控制。

配置示例 ​

基础配置 ​

ini
[General]
dns-reject-behavior = blackhole

[Proxy]
ProxyNode = socks, 198.51.100.1, 1080
DirectOut = direct

[Proxy Group]
AutoProxy = url-test, ProxyNode, DirectOut, check-interval=300
Streaming = select, ProxyNode, DirectOut

[Rule]
# 1. DNS 前置拦截规则
DOMAIN-SUFFIX,ad.example.com,REJECT,pre-matching
DOMAIN-KEYWORD,telemetry,REJECT,pre-matching
DOMAIN-SET,https://rules.example.com/ad-domains.txt,REJECT,pre-matching,refresh-interval=86400

# 2. 本地与局域网直连规则
DOMAIN-SUFFIX,local,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,127.0.0.0/8,DIRECT,no-resolve

# 3. 指定服务走专用调度组
DOMAIN-SUFFIX,media.example.com,Streaming
DOMAIN-SUFFIX,video.example.com,Streaming

# 4. 复合逻辑规则
AND,((DOMAIN-SUFFIX,internal.example.com),(DEST-PORT,443)),DIRECT

# 5. 外部策略文件引用
RULE-SET,./rules/custom.list,AutoProxy,refresh-interval=43200

# 6. 地理位置与兜底策略
GEOIP,CN,DIRECT
FINAL,AutoProxy