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