文档 配置 子规则

子规则

把满足特定条件的流量送入一套独立的子规则列表,走完子规则还没匹配到就自动回退主规则继续判断,适合给某一类连接单独定制一套分流逻辑。

基本写法

config.yaml YAML
rules:
  - SUB-RULE,(NETWORK,tcp),rule1
  - SUB-RULE,(NETWORK,udp),sub-rule2
  - MATCH,DIRECT

sub-rules:
  rule1:
    - DOMAIN-SUFFIX,google.com,ss1
    - DOMAIN-SUFFIX,baidu.com,DIRECT
  sub-rule2:
    - IP-CIDR,1.1.1.1/32,REJECT
    - IP-CIDR,8.8.8.8/32,ss1
    - DOMAIN,dns.alidns.com,REJECT

主规则里用 SUB-RULE,(条件),子规则名 命中条件后,流量会被送进对应的 sub-rules 列表继续匹配;如果在子规则列表里全部没匹配到,就退回主规则、从 SUB-RULE 那一行的下一条开始继续判断。

示例走一遍

以上面的配置为例:

  • 一个访问 google.com 的 TCP 请求命中第一条 SUB-RULE,(NETWORK,tcp),rule1,进入 rule1,匹配到 DOMAIN-SUFFIX,google.com,ss1,走 ss1 出站
  • 一个访问 youtube.com 的 UDP(QUIC)请求命中第二条 SUB-RULE,(NETWORK,udp),sub-rule2,进入 sub-rule2,但 sub-rule2 里没有能匹配 youtube.com 的规则,于是回退主规则,落到 MATCH,DIRECT

配合入站使用

每个 listener 都可以单独指定一个 rule 字段,让该入站的流量默认直接进入某个子规则,而不是从主规则最上面开始匹配:

config.yaml YAML
listeners:
  - name: socks5-in-1
    type: socks
    port: 10808
    rule: rule1 # 找不到该 sub-rule 时会直接回退使用 rules