基本寫法
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