サブルール
特定の条件を満たすトラフィックを独立したサブルールのリストに送り、サブルールをすべて処理してもマッチしなかった場合は自動的にメインルールにフォールバックして判定を続けます。特定の種類の接続に専用のルーティングロジックを構築したい場合に適しています。
基本的な書き方
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 リストに送られてマッチングが続きます。サブルールのリスト内で1つもマッチしなかった場合は、メインルールに戻り、SUB-RULE の行の次から判定を続けます。
例を追ってみる
上記の設定を例にすると:
- google.com にアクセスする TCP リクエスト最初の
SUB-RULE,(NETWORK,tcp),rule1にヒットし、rule1 に入り、DOMAIN-SUFFIX,google.com,ss1にマッチして ss1 経由で出口 - youtube.com にアクセスする UDP(QUIC)リクエスト2番目の
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 にフォールバックします