· ルールと振り分け · 約9分

Shadowrocket ルール構文入門:DOMAIN・DOMAIN-SUFFIX・GEOIP・FINALのマッチ範囲

DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINALのマッチ範囲や記述形式、上から順に判定される仕組みを例とともに解説します。

この記事の要点

Shadowrocketのルールによる振り分けは、Global RoutingでConfigを選択していることが前提です。利用者自身が用意した接続情報を持ち、設定を編集する方向けに、ルールの項目、ドメインとIPのマッチ方法、順番に沿った判定の確認方法を解説します。例に使うドメインやアドレスは構文の説明用で、接続情報として利用できるものではありません。編集前に現在の設定を保存してください。

1. ルールの適用条件と判定順

まず結論として、ルールは設定内の上から順に確認され、該当したルールのポリシーが適用されます。後ろに「より具体的な」ルールがあっても、自動で選び直されることはありません。例外を先に、対象範囲の広いルールを後に置き、残りのリクエストはFINALで処理します。編集する前に、現在使用中の設定ファイルを確認してください。

Home → Global RoutingでConfigを選ぶと、現在の設定に基づいて振り分けられます。ProxyとDirectは全体に適用するルーティングモードのため、この記事のルール順を検証する用途には使えません。Sceneはシーンごとの設定に従うため、確認時にはシーンに対応するルーティングもチェックしてください。ルールファイル単体をテストするときはConfigを選び、ルーティングモードによる結果を構文の問題と取り違えないようにします。

リクエストを送信 対象を特定 順番に照合 ポリシーを選択 接続を確立

このフローはルール判定の仕組みを示したもので、すべてのリクエストで必ず最初にDNS問い合わせが行われるという意味ではありません。ドメインルールは判明している対象ドメインを、IPルールは対象アドレスを使います。ドメインを取得できるか、名前解決が必要か、設定のDNS項目がどうなっているかによって、照合に使える情報は変わります。PROXYにマッチしても、プロキシポリシーが選ばれたことを示すだけで、その後の接続成功を保証するものではありません。

2. ルール行の書式:キーワード・条件・ポリシー

一般的なルール行では、各項目を半角カンマで区切ります。DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDRにはマッチ条件とポリシーが必要です。FINALにはマッチ条件を付けず、ポリシーだけを指定します。ルールは設定の[Rule]セクションに記述し、[General]や[Host]には書かないでください。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT

上記の設定では、login.example.comを先行する例外とし、それ以外のexample.comの範囲にPROXYを適用しています。キーワードルールはより広い範囲を対象にする書式例です。実際の設定ですべての種類を同時に記述する必要はありません。PROXYとDIRECTはポリシーであり、プロトコル名ではありません。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuardなどのプロトコル接続情報は、既存の接続設定で確認し、ルール行のポリシー欄には入力しないでください。

条件にはルールに必要な情報だけを記述します。ドメインルールにはドメインを指定し、https://、パス、クエリパラメータ、:443は付けません。たとえばhttps://example.com/accountのドメイン条件はexample.comです。この6種類のルールでは、URLのパスを使って同じWebサイト内のページを区別できません。

3. DOMAIN・DOMAIN-SUFFIX・DOMAIN-KEYWORD

DOMAINは完全一致する1つのドメイン、DOMAIN-SUFFIXは指定したドメインとそのサブドメイン、DOMAIN-KEYWORDはドメインに指定文字列が含まれるかどうかを判定します。マッチ範囲はそれぞれ異なり、「exampleを含む」と一括りにはできません。特にDOMAIN-SUFFIXはドメインの境界を考慮しますが、DOMAIN-KEYWORDはサフィックス境界を判定しません。

ルール条件マッチする例マッチしない例
DOMAIN,example.comexample.comwww.example.com
DOMAIN-SUFFIX,example.comexample.com、api.example.comnotexample.com、example.com.other.test
DOMAIN-KEYWORD,exampleexample.com、myexample.testsample.test

特定のホスト名だけを指定する場合はDOMAIN、親ドメインと複数階層のサブドメインを対象にする場合はDOMAIN-SUFFIXを使います。DOMAIN-KEYWORDは文字列による広いマッチが必要な場合に適していますが、関係のないドメインまで含むことがあるため、行数を減らす目的だけでサフィックスルールの代わりに使うのは避けましょう。DOMAIN-SUFFIXの条件に*.example.comと書く必要はなく、example.comと記述します。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

この例では、api.example.comは先にDOMAINにマッチするためDIRECT、www.example.comは2行目にマッチするためPROXYになります。最初の2行を入れ替えると、先にサフィックスルールがapi.example.comを処理するため、完全一致ルールを例外として適用できません。Webページでは画像、ログイン、APIなど別のドメインへのリクエストが発生することもあります。アドレスバーのドメインだけでページ全体の通信を判断せず、それぞれのリクエストを確認してください。

4. GEOIPとIP-CIDR:宛先IPによるマッチ

GEOIPは、アプリが使用する地理情報データベース上での宛先IPの地域判定に基づいてマッチします。例:GEOIP,CN,DIRECT。ここでのCNは国コードであり、ドメイン末尾やコンテンツの対象地域を表すものではありません。データベースによる判定は物理的な位置をリアルタイムに証明するものでもないため、ページが日本語で表示されることだけを理由にCNへマッチすると考えないでください。

IP-CIDRは、宛先のIPv4アドレスが指定したネットワーク範囲に含まれるかを判定します。192.168.0.0/16は192.168.0.0から192.168.255.255までの範囲を表し、/32は単一のIPv4アドレスを表します。以下のアドレスは構文の説明用であり、サーバーアドレスとして推奨するものではありません。

IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,203.0.113.7/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

例の最終行はFINAL,PROXYで、FINAL,DIRECTとは目的が異なります。マッチしなかったリクエストをプロキシ経由にする設定です。どちらのフォールバックを使うかは、実現したい振り分け方に応じて選びます。実際に検証する際は、リクエストのドメイン、宛先アドレス、最終ポリシーを記録し、DNSが別のアドレスを返した現象をCIDRの記述ミスと混同しないようにしてください。

5. FINALによるフォールバックと設定の確認手順

FINALは、それまでのルールにマッチしなかったリクエストを処理するため、ルール末尾に置きます。「優先度が最も低いデフォルトルール」として自動適用される設定ではなく、順番に並ぶルールの1つです。前方に置くと、後続ルールがリクエストを処理する機会はありません。指定したドメインだけをプロキシ経由にする場合はドメインルールとFINAL,DIRECTを、その他のリクエストもプロキシ経由にする場合はFINAL,PROXYを使えます。

  1. 元の設定を保存

    Configを開き、現在有効なファイルを確認してから、変更前のコピーを保存します。既存の例外ルールをテスト用ルールだけで置き換えて失わないよう、元の[Rule]の順番を記録してください。

  2. テスト用ルールを記述

    この設定の編集画面を開き、[Rule]に必要なルールを追加します。DOMAINの例外をDOMAIN-SUFFIXより前に置き、最後に目的に合ったFINALを記述して保存します。

  3. ルーティングを確認

    Home → Global Routing → Configに戻り、Configで選択中のファイルを確認します。Homeでは、プロキシポリシーに自分が用意した接続可能なサーバーが設定されていることを確認してください。

  4. 新しいリクエストを送信

    接続を再確立してからテスト対象にアクセスし、変更前に確立した長時間接続を使い続けないようにします。アプリのリクエスト記録で対象と実際のポリシーを確認してください。キャッシュ済みのWebページでは、新ルールの適用を確認できません。

  5. フォールバックを確認

    ドメインリストにない対象にもアクセスし、FINALで指定したポリシーが適用されるか確認します。結果が異なる場合は、先行ルール、対象IP、現在の設定の順に確認し、すぐに対象範囲の広いキーワードルールを追加しないでください。

第3節の3行の例では、api.example.comにDIRECT、www.example.comにPROXY、その他の未マッチ対象にDIRECTが適用される想定です。これはルールから導かれる結果であり、例示したドメインへの実通信テストの報告ではありません。自分の設定に使う実際のドメインに置き換えたうえで、リクエスト記録から確認してください。単独のレイテンシテストで確認できるのは接続性であり、特定のWebページがどのルールにマッチしたかは分かりません。

6. ルール未適用と接続エラーを切り分ける

まず問題を2種類に分けます。リクエストに誤ったポリシーが適用された場合は、ルーティングモード、設定の選択、ルール条件や順番を確認します。想定どおりのポリシーが適用されているのに接続できない場合は、接続先サービスと既存サーバーの接続情報を確認します。ルールが決めるのはリクエストの処理方法であり、サーバーのポート誤りや到達不能を解消するものではありません。

エラー:Connection refused

原因と対処:接続先で拒否されたときに返されることがあるエラーで、通常は対象ポートで待ち受けていないか、明示的に接続を拒否しています。まずリクエストに実際に適用されたポリシーを確認してください。PROXYの場合は、利用中のサービス情報でサーバーアドレスとPortを確認します。情報に443と明記されている場合は、一般的なポート番号を推測して入力せず、443を設定してください。

エラー:Operation timed out

原因と対処:処理が待機時間内に完了しなかった場合に返されることがあるエラーで、ルール構文の誤りとは限りません。まずHomeで既存の接続をテストし、次にリクエストの対象とポリシーを確認します。現在のネットワーク、接続先への到達性、サーバーの稼働状況をそれぞれ確認してください。アプリの記録に表示される詳細な文言は、エラーの発生元によって異なる場合があります。

DOMAIN-SUFFIXを書いたのに、なぜDIRECTになる?

まずHome → Global RoutingでConfigを選び、Configで有効になっているのが保存したばかりのファイルか確認します。次に[Rule]の先頭から、先にマッチするDIRECTやFINALがないかを確認してください。条件にはドメインだけを記述し、プロトコル、パス、ポートは含めません。

特定のサブドメインだけをDIRECTにして、ほかに影響させない方法は?

DOMAIN,api.example.com,DIRECTをDOMAIN-SUFFIX,example.com,PROXYより前に記述します。保存後に新しいリクエストを送り、api.example.comと別のサブドメインそれぞれのポリシーを確認してください。片方だけのテストでは不十分です。

Webページは開くのに、一部の画像が読み込まれないのはなぜ?

ページのアドレスだけでなく、失敗したリクエストの実際のドメインを確認します。画像が別のドメインから配信されている場合もあれば、PROXYにマッチした後の接続に失敗している場合もあります。リクエスト記録を確認してからDOMAINやDOMAIN-SUFFIXを追加するか判断し、関係のない対象まで含みやすいDOMAIN-KEYWORDでまとめて指定するのは避けてください。

サブスクリプションを更新すると、自分で書いたルールも変わる?

まずHomeの接続情報のサブスクリプションと、Configのルールファイル更新を区別します。既存の接続サブスクリプションを更新しても、現在の[Rule]が編集されるとは限りません。現在の設定ファイル自体がリモート更新される場合は、更新後にファイルの内容を再確認し、カスタマイズした内容は管理できるコピーに保存してください。

トラブルシューティングでは、一度に変更する条件を1つに絞り、変更前後のルール行とリクエスト結果を記録してください。「現在の設定、Global Routing、マッチ順、ドメインまたはIP、接続情報」の順に確認すると、振り分けの判定とネットワーク接続の問題を切り分けられます。設定画面の詳しい手順は、サイト内の使い方ガイドをご覧ください。プロトコル情報の確認場所については、プロトコルリファレンスをご覧ください。

ShadowrocketをApp Storeでダウンロード