[Rule] 流量分流策略
本节用于配置网络流量分流策略,按自上而下的顺序依次匹配网络请求,并将其分发至指定目标动作或出口(直连、丢弃、代理服务器或调度组)。
匹配流程
网络请求流入
│
▼
┌─────────────────────────┐
│ DNS 前置阻断匹配 │ ──(命中 pre-matching & REJECT)──► 依据 dns-reject-behavior 返回拒绝响应
│ (pre-matching) │
└───────────┬─────────────┘
│ 未命中
▼
┌─────────────────────────┐
│ 逐行线性规则匹配 │
│ (自上而下,首命中即退出) │
└───────────┬─────────────┘
├─────────────────────────────────────────────────┐
▼ ▼
命中域名/端口/协议等规则 遇到 IP 规则 (IP-CIDR / GEOIP 等)
│ │
│ ┌─────┴─────────────────┐
│ │ 是否包含 no-resolve ? │
│ └─────┬─────────────────┘
│ 是 (跳过匹配)│ │ 否 (发起 DNS 解析)
│ ┌─────┘ ▼
│ │ 获得真实目标 IP
│ │ │
│ │ 命中目标 IP 网段
│ │ │
▼ ▼ ▼
执行对应 target 目标动作 ◄──────────────────────────────────────┘
│
▼ (所有规则均未命中)
执行 FINAL 兜底分流策略- 自上而下匹配与首命中退出(First-Match-Wins) 规则表自第一行开始顺序匹配。流量命中某条规则后,立即分发至该规则指定的
target目标动作,并终止后续规则的评估。若全部规则均未命中,流量由FINAL兜底策略处理。 - DNS 阶段前置阻断(
pre-matching) 带有pre-matching标志且目标为REJECT的域名规则在 DNS 解析阶段优先匹配。命中后直接依据[General]的dns-reject-behavior返回拦截响应(如黑洞地址或空响应),不建立网络连接。 - 域名解析与 IP 规则协作(
no-resolve选项) 基于 IP 的规则(如IP-CIDR、GEOIP)在匹配域名请求时通常会先发起 DNS 解析获取 IP。附加no-resolve选项后,若当前请求尚未获得解析 IP,系统直接跳过该规则,不发起 DNS 查询。
语法声明
[Rule] 规则行分为标准规则、复合逻辑规则与兜底规则三种形式:
# 标准规则
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 解析阶段执行前置匹配:
- 执行时机:每次 DNS 查询先执行带有
pre-matching标志的规则匹配,再复用或分配 Fake-IP,或发起上游 DNS 查询。已有和持久化恢复的映射不会绕过前置匹配;DOMAIN-SET 更新后,下次查询按当前内容判断。前置拦截优先于全局直连或全局代理模式生效。 - 响应行为:命中拦截后直接在 DNS 阶段终止解析并返回响应,具体的拦截响应格式由 General 中的
dns-reject-behavior配置项控制。
配置示例
基础配置
[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