文件 設定 子規則

子規則

把滿足特定條件的流量送入一套獨立的子規則列表,走完子規則還沒匹配到就自動回退主規則繼續判斷,適合給某一類連線單獨定制一套分流邏輯。

基本寫法

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