Clash 自作ルールの書き方:DOMAIN・IP-CIDR 構文とマッチ優先順位を解説
Clash ルールでよく使う種類と書式を体系的に整理し、上から順に評価される優先順位の仕組み、GEOIP と MATCH の配置ポイントをわかりやすく解説。そのまま使える並び順のコツも紹介します。
Clash ルールでよく使う種類と書式を体系的に整理し、上から順に評価される優先順位の仕組み、GEOIP と MATCH の配置ポイントをわかりやすく解説。そのまま使える並び順のコツも紹介します。
Clash の振り分け機能は一つひとつのルールの上に成り立っています。設定ファイルの rules: 項目に並ぶ各行が、独立したルールになります。ルールの共通フォーマットは3段構成で、それぞれをカンマで区切ります:
TYPE,ARGUMENT,POLICY
TYPE はマッチ判定の種類を示し、ドメイン・IP セグメント・プロセス名などが該当します。ARGUMENT は具体的なマッチ値です。POLICY はマッチ後に適用するポリシーで、プロキシノード名やポリシーグループ名のほか、組み込みの DIRECT(直接接続)や REJECT(拒否)も指定できます。一部のルールタイプは4番目の任意パラメータにも対応しており、最も一般的なのが no-resolve です。これは IP 系ルールをマッチさせる際に事前の DNS 解決を行わないよう指示するもので、不要な問い合わせによる遅延やプライバシー漏洩を避けられます。完全なルール例は以下の通りです:
DOMAIN-SUFFIX,example.com,Proxy
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
この3段構成(および任意の4段目)を理解しておくことが、後述するすべてのルールタイプを読み解く前提になります。
Clash コア(Clash Meta / mihomo 系も含む)が対応するルールタイプは多数ありますが、日常的な設定でよく登場するのは以下の数種類に集中しています。マッチ対象別に、ドメイン系・IP 系・地理位置系・プロセス/ポート系の4グループに分けて見ていきます。
DOMAIN:完全なドメイン名を厳密にマッチさせます。例えば DOMAIN,www.example.com,Proxy はこのドメインのみに適用され、サブドメインや他のプレフィックスにはマッチしません。DOMAIN-SUFFIX:ドメインの末尾(サフィックス)でマッチします。書き方は DOMAIN-SUFFIX,example.com,Proxy で、example.com 本体だけでなく www.example.com、api.example.com などの任意のサブドメインにもマッチします。最も使用頻度の高いドメイン系ルールです。DOMAIN-KEYWORD:ドメインに指定キーワードが含まれていればマッチします。例えば DOMAIN-KEYWORD,google,Proxy は "google" という文字列を含むあらゆるドメインにマッチします。マッチ範囲が広いため、同じ文字列を含む別ドメインを誤って引っかけないよう注意が必要です。DOMAIN-REGEX:正規表現でドメインをマッチさせます。細かい制御が必要で、かつ1件ずつ列挙したくない場面に向いていますが、記述・デバッグのコストが高いため、上記3種類で対応できない場合にのみ使うのがおすすめです。IP-CIDR:IPv4 の CIDR セグメントでマッチします。例えば IP-CIDR,10.0.0.0/8,DIRECT は、このプライベートセグメント全体を直接接続にします。IP-CIDR6:構文は IP-CIDR と同じで、IPv6 セグメント専用です。IP-SUFFIX:IP アドレスの末尾セグメントでマッチします。用途はやや限定的で、特定の内部ネットワーク分割で使われることが多いです。SRC-IP-CIDR:リクエストの送信元 IP セグメントでマッチします。宛先ではなく、LAN 内の特定デバイスだけに専用ポリシーを割り当てたい場合によく使われます。IP 系ルールは no-resolve パラメータと組み合わせて使うことが多く、特に直接接続用ルールでは、直接接続する通信に余計な名前解決のコストをかけないために有効です。
GEOIP:宛先 IP が属する国や地域によって判定します。例えば GEOIP,CN,DIRECT は、中国本土の IP と判定された通信を直接接続にします。この種のルールは IP 地理情報データベースに依存しており、判定精度はデータベースの更新状況に左右されます。SRC-GEOIP:GEOIP と似ていますが、判定根拠がリクエスト送信元の地理位置である点が異なります。PROCESS-NAME:通信を発生させたプロセス名でマッチします。例えば PROCESS-NAME,com.example.app,Proxy のように、特定アプリだけに個別のポリシーを設定するのに向いており、モバイル環境の設定でよく見られます。PROCESS-PATH:プロセスの実行ファイルのフルパスでマッチします。PROCESS-NAME より精度は高いものの、設定はより煩雑になります。DST-PORT / SRC-PORT:宛先ポートまたは送信元ポートでマッチします。メールやゲーム専用ポートなど、特定のポートを固定のルートに通したい場合によく使われます。RULE-SET:外部のルールセットファイルを参照し、同種のルールを大量にまとめて管理します。サブスクリプション形式で更新できるため、何百・何千行もの細かいルールを手動で保守する手間を省けます。MATCH:兜底(フォールバック)ルールで、パラメータは不要です。それまでのどのルールにもマッチしなかった通信は、最終的にこのルールで処理されます。書式は MATCH,POLICY です。DOMAIN-KEYWORD と DOMAIN-REGEX はマッチ範囲が広いため、上位に配置するとキーワードが重複した際に本来マッチさせるべきでない通信を先取りしてしまいがちです。厳密マッチ系のルールより後ろに置くことを検討してください。
Clash のルールを理解するうえで最も重要なのは、rules: リストの上から下への順序で1行ずつ厳密に評価され、どこかのルールにマッチした瞬間にそのルールのポリシーが適用され、それ以降のルールはチェックされないという点です。つまりルールの記述順そのものが優先順位を決めており、ルールタイプ自体に本来的な優劣はありません。DOMAIN であれ GEOIP であれ、先に評価されてマッチしたものが先に効きます。
陥りやすい例を一つ挙げます:
GEOIP,CN,DIRECT
DOMAIN-SUFFIX,example.com,Proxy
example.com が置かれているサーバーの IP が、たまたま地理情報データベース上で中国本土の IP と判定されている場合、上記の設定では最初の GEOIP ルールの時点で通信が直接接続に振られてしまい、その下にあるこのドメイン向けのプロキシルールは永遠に実行されません。特定のドメインを常にプロキシ経由にしたいなら、そのドメインルールを GEOIP より前に置く必要があります:
DOMAIN-SUFFIX,example.com,Proxy
GEOIP,CN,DIRECT
この順序の問題は、ルール項目が多い設定でとても起こりやすいものです。「プロキシを設定したはずのサイトがなぜかプロキシを通らない」という場合、まず確認すべきは、それより前に位置する範囲の広いルールに先取りされていないかという点です。
GEOIP ルールと MATCH 兜底ルールの位置は、ルール一覧全体の中でも特に強調すべき2つのポイントです。
GEOIP は宛先 IP が属する国・地域を判定するもので、カバー範囲がかなり広く、GEOIP,CN,DIRECT の1行だけで何千という個別ドメインをカバーしてしまう可能性があります。これをリストの上位に置くと、本来プロキシ経由にすべき特定サービスまで一緒に直接接続にされてしまいがちです。安全なやり方は、厳密に制御したいドメイン・アプリ・ポートのルールを先に書き、GEOIP 系ルールはそれらの細分化ルールより後ろ、兜底ルールより前に置くことです。こうすることで GEOIP は「特に指定されていない大多数のローカル通信を直接接続にする」という役割に絞られます。
MATCH は兜底ルールで、その名の通り、それまでのすべてのルールで処理されなかった通信を受け止める役割を持ちます。パラメータは不要で、書式は必ず MATCH,POLICY という形になり、サイトの振り分け方針によって MATCH,Proxy や MATCH,DIRECT がよく使われます。このルールが最後尾になければ、その後ろに来るはずの細かいルールで処理されるべき通信が、先に兜底ポリシーへ吸い取られてしまい、以降に書いたすべての細分化ルールが実質無効になります。MATCH が出現した時点で、それ以降のルールは絶対に実行されないと考えれば、これが最終行にしかなり得ない、そして必ず最終行にしなければならない理由がわかります。
ルール一覧を書き終えたら、上から下まで一度読み通し、「範囲が広いルール」が「範囲は狭いが個別対応が必要なルール」より前に来ていないかを確認し、最後に MATCH が単独で最終行にあることを確認してください。
以上の仕組みを踏まえると、整理された構成のルール一覧は「先に厳密、後で広範囲、最後に兜底」という並び順に従うのが基本で、おおよそ5段階に分けられます:
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve のように、内部ネットワークの通信がプロキシを経由しないようにします。PROCESS-NAME や DST-PORT ルールなど。DOMAIN-SUFFIX や DOMAIN ルールで、プロキシか直接接続かを明確に指定します。RULE-SET で参照する大量のルール群、および GEOIP によるローカル通信の兜底処理。MATCH の1行で、マッチしなかったすべての通信のデフォルトの行き先を決めます。簡潔な設定例はおおよそ次のようになります:
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
PROCESS-NAME,com.example.updater,DIRECT
DOMAIN-SUFFIX,example.com,Proxy
DOMAIN-KEYWORD,ads,REJECT
RULE-SET,proxy-list,Proxy
GEOIP,CN,DIRECT
MATCH,Proxy
補足すると、ルールセット(RULE-SET)自体も内部の項目順に沿ってマッチ評価が行われます。リスト内での挿入位置も「前段でより厳密なルールが処理済みで、後段でようやくこのルールセットの番になる」という原則に従います。複数のルールセットを同時に参照する場合も、範囲が狭く優先的に効かせたいルールセットを、範囲の広いルールセットより前に置くことをおすすめします。
実際の運用では、ルールが効かない原因のほとんどは構文ミスではなく、順序の問題です。特によく見られるケースを整理します:
GEOIP,CN,DIRECT をすべてのドメインルールより前に書いてしまい、中国本土の IP セグメントに該当する対象サービスがすべて直接接続で止められてしまう。DOMAIN-KEYWORD のキーワードが広すぎるうえ上位に置かれていて、本来プロキシを通すべき他のドメインまで誤って引っかけてしまう。MATCH の後ろにさらにルールを追加してしまい、それらのルールが永遠に実行されない無効な設定になっている。こうした問題を調べる際は、1行ずつ構文の正しさを繰り返し確認するより、rules: リスト全体を印刷または表示して、上から順にマッチの流れを頭の中でシミュレーションする方が効率的です。多くの場合、どの上位ルールが先取りしているのかすぐに特定できます。