Clash 規則分流設定実践:国内外サイト自動振り分け

国内外サイトの振り分けを例に、ルールセットとポリシーグループで自動分流を構築する方法を解説します。国内サイトは直接接続、海外サービスはプロキシ経由、広告・トラッキングドメインは拒否する構成です。記法はすべて mihomo(Clash Meta)コアに準拠します。

一、分流(ルーティング)で解決したい課題

通信を区別しない場合、Clash の動作は大きく2種類しかありません。グローバルプロキシ(global)では全通信がノード経由になるため、国内サイトも海外を迂回して遅延が増え、リージョン制限のある動画・音楽サービスは海外 IP を拒否し、銀行や行政系サイトは海外からのログインをリスクとして検知します。逆にグローバル直接接続(direct)では海外サービスに一切アクセスできません。

規則分流(rule)は第三の方式です。コアは設定ファイル内の rules リストに従い、新規接続の宛先アドレスを1件ずつ順番に判定します。国内ドメイン・IP は直接接続、海外サービスはプロキシノード経由、既知の広告・トラッキングドメインは拒否——という振り分けを一度設定すれば、日常使用でモードを手動切り替えする必要がなくなります。本記事ではそのまま流用できる設定例を用いて、構築の全工程を解説します。

二、ルールマッチングの基本原理

rules は順序付きリストです。新規接続がコアに入ると、先頭のルールから順に照合され、最初に条件を満たしたルールがヒットしてその出口処理が適用されます。すべて未ヒットの場合はリスト末尾の MATCH ルールが受け止めます。ここから次の2点が導かれます。

  • 順序=優先度。より具体的で優先判定が必要なルールほど前に、GEOIP,CN のような広範囲をカバーするルールは後ろに、MATCH は必ず最後に置きます。
  • ドメインルールは IP ルールより先に評価される。接続がドメインを伴う場合、コアはまず DOMAIN、DOMAIN-SUFFIX、RULE-SET などのドメイン系ルールで照合し、すべて未ヒットの時のみ IP を解決し、続けて IP-CIDR、GEOIP と照合します。IP 系ルールに no-resolve パラメータを付けると、未解決の段階でそのルールをスキップでき、判定のためだけの不要な DNS クエリを避けられます。

よく使うルールタイプは以下の通りです。

ルールタイプ記法例説明
DOMAINDOMAIN,www.example.com,節点選択単一ドメインの完全一致
DOMAIN-SUFFIXDOMAIN-SUFFIX,google.com,節点選択該当ドメインとすべてのサブドメインに一致
DOMAIN-KEYWORDDOMAIN-KEYWORD,google,節点選択ドメインにキーワードを含めばヒット
RULE-SETRULE-SET,proxy,節点選択rule-providers で宣言したルールセットを参照
GEOSITEGEOSITE,cn,DIRECTドメイン分類データベースによる照合(mihomo 専用)
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolveIP レンジに一致
GEOIPGEOIP,CN,DIRECTIP の所属地域で照合
MATCHMATCH,節点選択フォールバック。残りすべての接続に一致
補足

RULE-SET と rule-providers の記法は無印 Clash Premium でも同様に有効です。GEOSITE は mihomo 専用のため、無印コアを使う場合は RULE-SET のルールセットで代替する必要があります。

三、ポリシーグループの設計

分流構成では、各接続の行き先は「直接接続 DIRECT」「拒否 REJECT」「いずれかのプロキシノード」の3種類のみです。プロキシ側は通常、次の3つのポリシーグループで構成します。

  • 節点選択(select タイプ):利用可能な全ノードを列挙し、出口を手動で指定します。ほとんどのルールのデフォルト出口として使われます。
  • 自動選択(url-test タイプ):グループ内ノードを定期的に測定し、最も低遅延のノードへ自動切り替えます。「節点選択」の候補に組み込んでおけば、必要な時にワンクリックで切り替え可能です。
  • 広告拦截(select タイプ):候補は REJECT と DIRECT のみ。デフォルトは REJECT。「特定サイトが開かないのは誤検知か」を調べる際は、一時的に DIRECT に切り替えて突き合わせ確認できます。
proxy-groups:
  - name: 節点選択
    type: select
    proxies:
      - 自動選択
      - 香港ノード
      - 日本ノード
      - DIRECT

  - name: 自動選択
    type: url-test
    proxies:
      - 香港ノード
      - 日本ノード
    url: http://www.gstatic.com/generate_204
    interval: 300

  - name: 広告拦截
    type: select
    proxies:
      - REJECT
      - DIRECT

ポリシーグループの名前は rules 内にそのまま出現します。名前を変更する際は両方を同時に更新しないと、ルールが存在しない出口を指してしまいます。

四、ルールセットの導入

カバーすべきドメインは数万件に及ぶため、手書きでのルール作成は現実的ではありません。コミュニティが用途別に整理・維護しているルールセット——広告ドメイン、国内サイト、海外主要サービス、国内 IP レンジなど——を、コアが定期的にダウンロードしてローカルにキャッシュします。宣言方法は、設定のトップレベルに rule-providers を追加することです。

rule-providers:
  reject:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400

各フィールドの意味は以下の通りです。

  • type:http はリモートアドレスからダウンロードすることを示し、file はローカルファイルを読み込むことを示します。
  • behavior:classical は従来型のルール(DOMAIN、DOMAIN-SUFFIX など)で構成されたリスト、domain は純粋なドメインリスト、ipcidr は純粋な IP レンジのリストを示します。ダウンロード元がどの形式かに合わせて指定してください。誤った値を指定するとルールセットの読み込みに失敗します。
  • path:ローカルキャッシュのパスです。
  • interval:更新間隔(秒)。86400 は1日1回の更新を意味します。

宣言後は、rules 内で RULE-SET,<名前>,<出口> の形式で参照します。mihomo ユーザーにはもう一つの選択肢があります。コアには GEOSITE と GEOIP のデータベースが内蔵されており、GEOSITE,cnGEOSITE,category-ads-allGEOIP,CN といった記法を rule-providers なしで使えます。代わりに分類の粒度はデータベース管理者に依存します。

本記事の例では Loyalsoldier/clash-rules プロジェクトのリリースファイルを使用しています。同プロジェクトは用途別に reject(広告)、direct(国内)、proxy(海外)、cncidr(国内 IP レンジ)などのリストに分けており、更新頻度と利用実績の高さで知られています。信頼できる別のソースに置き換えても記法は変わりません。

五、完全な設定例

上記のパーツを組み合わせると、次のような完全な国内外振り分け設定になります。

# 基本設定
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

# 内蔵 DNS:ドメインルール未ヒット時の解決結果を GEOIP 判定に使用
dns:
  enable: true
  ipv6: false
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query

# ポリシーグループ(第三節を参照)
proxy-groups:
  - name: 節点選択
    type: select
    proxies:
      - 自動選択
      - 香港ノード
      - 日本ノード
      - DIRECT
  - name: 自動選択
    type: url-test
    proxies:
      - 香港ノード
      - 日本ノード
    url: http://www.gstatic.com/generate_204
    interval: 300
  - name: 広告拦截
    type: select
    proxies:
      - REJECT
      - DIRECT

# リモートルールセット(第四節を参照)
rule-providers:
  reject:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
  direct:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400
  proxy:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
    path: ./ruleset/proxy.yaml
    interval: 86400

# 振り分けルール:上から順に、ヒットした時点で停止
rules:
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - RULE-SET,reject,広告拦截
  - RULE-SET,direct,DIRECT
  - RULE-SET,proxy,節点選択
  - GEOIP,CN,DIRECT
  - MATCH,節点選択

ルールブロックの配列ロジックは次の通りです。

  1. ローカルおよび LAN アドレスは直接接続とし、no-resolve を付けて不要な解決を避けます。
  2. 広告・トラッキングドメインは「広告拦截」グループに渡し、デフォルトで REJECT します。最前列に置くことで、以降のルールに通過させてしまうのを防ぎます。
  3. 国内ドメインは直接接続します。
  4. 海外の主要サービスは「節点選択」経由にします。
  5. すべてのドメインルールが未ヒットだった接続は、IP を解決したうえで GEOIP により国内所属かどうかを判定し、国内であれば直接接続します。
  6. MATCH でフォールバック:残りはすべてプロキシ経由とします。少数のマイナーな国内サイトが迂回するリスクより、海外通信が直接接続に漏れてしまうリスクを避けます。

注意:proxies セクション(ノード一覧)に「香港ノード」「日本ノード」という名前のノードが実在しないと、ポリシーグループの参照先が見つからず設定の読み込みに失敗します。実際に使う際は自分の契約先のノード名に置き換えてください。

六、動作確認とよくあるミス

分流が有効かを確認する

  1. クライアントの接続パネル(または metacubexd、zashboard などの外部パネル)を開くと、各接続にヒットしたルールと出口チェーンが表示されます。例:RULE-SET(direct) → DIRECT
  2. 国内サイト、海外サイト、既知の広告ドメインをそれぞれアクセスし、パネルで期待通りの振り分け先になっているか確認します。
  3. 海外サイトにアクセスした際に出口 IP を調べ、表示されるのがノードの所在地であり、自宅の回線 IP ではないことを確認します。

よくあるミス

  • ルールの順序が逆転している。GEOIP,CN を前寄りに置くと、本来プロキシ経由にすべき海外系サブドメインを先に直接接続にしてしまいます。MATCH を中間に書くと、それ以降のルールが永遠に発動しません。
  • ルールセットのダウンロード失敗。rule-providers のアドレスが無効になった場合、対応する RULE-SET ルールは全体として機能せず、ログにエラーが記録されます。ミラーアドレスに差し替えるか、file タイプのローカルルールセットへ切り替える必要があります。
  • DNS 設定の欠落。ドメインルールがすべて未ヒットの場合、コアは解決結果に依存して GEOIP 判定を行います。システムの DNS が汚染されていると、海外ドメインが誤った IP に解決され、誤って直接接続と判定される恐れがあります。コア内蔵 DNS(設定例には含まれています)を有効にすれば回避できます。
  • ノード名の不一致。proxy-groups で参照するノード名は、proxies 内の name と一字一句一致させる必要があります。スペースや全角・半角の違いにも注意してください。
サブスクリプション利用者への注意

サブスクリプションのプロファイルには通常、あらかじめ分流ルールが組み込まれています。プロファイルを直接編集すると、次回の更新時に上書きされてしまいます。正しい方法は、クライアントのオーバーライド(Merge / Mixin)機能を使うか、サブスクリプション変換サービス経由でプロファイルにカスタムルール・ルールセットを追加することです。

Clash をダウンロード