Shadowrocketのルールは「条件が具体的なものほど自動的に優先される」わけではありません。現在有効なConfigを上から確認し、最初に一致したルールが適用されます。利用中のサービスと購読設定があり、通信の振り分けを変更したい方向けに、Global Routing、ルールの並べ方、3つのポリシー、FINALの使い方を解説します。設定例と確認手順も紹介します。
まずGlobal RoutingがConfigになっているか確認
カスタムルールを通信の振り分けに使うには、Home → Global Routing → Configを選びます。Configのルールだけを変更しても、Global RoutingがProxyまたはDirectのままでは、ルールが適用されるか確認できません。ルールは「どの経路を使うか」を決め、登録済みのサービス情報はその経路で接続できるかを左右します。それぞれ分けて確認してください。
Config
おすすめ現在有効なConfigのルールに基づいてポリシーを選択します。直接接続、プロキシ接続、拒否のいずれになるかは、一致したルールによって決まり、地域で一律に決まるわけではありません。
用途:日常的なルール分岐、カスタムルールの動作確認。
Proxy
Shadowrocketが処理する通信を現在のプロキシ経路に送ります。Configのルールを一つずつ照合してポリシーを選ぶことはありません。
用途:登録済みのプロキシ経路で対象に接続できるか、一時的に確認する場合。
Direct
Shadowrocketが処理する通信を対象へ直接送ります。Configのプロキシ振り分け結果は使用しません。
用途:現在のネットワークから対象へ直接接続した場合の状態を比較する場合。
Global RoutingのSceneは、シーンごとに動作を設定する機能で、Configと同じ意味ではありません。問題の切り分けで変数を減らすため、この記事ではConfigを使用します。Settings → On Demandでは、オンデマンド接続を開始する条件を管理します。ルール一覧の優先順位を設定する機能ではありません。ルールの順序を調べる際は、接続状態と現在のネットワークを変えずに確認してください。
上から順に照合:個別の例外を広範囲のルールより前に配置
通常のルール一覧は先頭から照合され、一致したルールのポリシーが適用されると、後続のルールは確認されません。「より具体的な」ルールを探し続けることもありません。そのため、すでに対象を含むDOMAIN-SUFFIXより後ろに、個別のDOMAINルールを置いても適用されない場合があります。優先順位を決めるのは文字列の長さではなく、ルールの並び順です。
[Rule]
DOMAIN,metrics.example.com,REJECT
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
以下は構文の例です。example.comとそのサブドメインは照合方法を説明するためのもので、接続サービスや接続テスト用のアドレスではありません。1行目はmetrics.example.comのみ、2行目はlogin.example.comへの直接接続の例外、3行目はexample.comとそのサブドメインを対象にします。いずれにも一致しない通信はGEOIPを照合し、最後にFINALへ進みます。
| リクエスト先のドメイン | 最初に一致するルール | ポリシー |
|---|---|---|
metrics.example.com | 1行目のDOMAIN | REJECT |
login.example.com | 2行目のDOMAIN | DIRECT |
docs.example.com | 3行目のDOMAIN-SUFFIX | PROXY |
DOMAIN-SUFFIX,example.com,PROXYを先頭に移すと、表にある3つのドメインすべてが先にこのルールに一致し、後ろにある拒否や直接接続の例外は適用されません。明示的にブロックまたは許可する対象は前に置き、より広い範囲を対象とするサフィックス、IPアドレス範囲、地域ルールを続け、最後にフォールバックルールを配置します。
PROXY・DIRECT・REJECTとルールキーワードの違い
ルールは通常、「照合条件」と「処理ポリシー」で構成されます。たとえばDOMAIN-SUFFIX,example.com,PROXYでは、DOMAIN-SUFFIXがルールタイプ、example.comが照合対象、PROXYが一致後の処理方法です。プロトコル名とポリシーは別の概念です。既存の接続でShadowsocksやVLESSを使っていても、DOMAIN-SUFFIXの照合順序は変わりません。
確認方法:条件と接続経路を分けて調べる
まず想定したルールに一致しているか確認し、次にそのポリシーが指定する経路を利用できるか確認します。「プロキシに接続できた」ことを「ルールが正しく適用された」証拠にしないでください。
| ポリシー | 動作 | 確認するポイント |
|---|---|---|
PROXY | プロキシ経路を使用します。 | 現在選択しているプロキシを確認します。ポリシーグループを使っている場合は、グループ内の選択肢も確認してください。 |
DIRECT | 対象へ直接接続します。 | 現在のネットワークから対象へ直接接続できるか確認します。 |
REJECT | 一致した通信を拒否します。 | 対象を本当にブロックする必要があるか、必要な通信まで誤って遮断していないか確認します。 |
Configで任意の名前を付けたポリシーグループを定義している場合は、実際の設定でグループ名と選択内容を確認してください。不明な名前を組み込みポリシーとして扱わないようにします。REJECTは接続に失敗したときに自動で再試行するポリシーではありません。一致すると、失敗しても後続のPROXYを試すことはありません。
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP-CIDRは宛先IPが属するアドレス範囲で照合します。192.0.2.0/24はドキュメント用のアドレス範囲です。no-resolveは、このIPルールのためだけに追加のドメイン解決を行わない指定であり、すべてのDNSを無効にするものではありません。宛先IPがすでに分かっている場合は、その情報が照合に使われることがあります。GEOIP,CN,DIRECTはIPの位置情報データベースに基づいて判定します。ドメインの末尾や運営主体では判断しないため、直接接続したいサイトすべてに適用されるとは限りません。
FINALのフォールバック:前のルールに一致しなかった通信だけを処理
FINALにドメインやアドレスのパラメーターは不要です。一般的な記述方法はFINAL,PROXYまたはFINAL,DIRECTです。条件を問わないフォールバックのため、通常はルール一覧の末尾に置きます。前に置くと、後続のルールが残りの通信を処理できません。FINALを2行記述しても、1行目が失敗したときに2行目を試す仕組みにはなりません。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
- FINAL,PROXYを選ぶ:前のルールで明示的に処理されなかった通信を、プロキシ経路に送ります。登録済みのプロキシが利用できることと、その通信がプロキシ経路を通ることを確認してください。
- FINAL,DIRECTを選ぶ:ルールに一致しなかった通信を直接接続します。プロキシを使う対象を明示的に列挙し、それ以外を直接接続したい場合に適しています。
- ポリシーの記述を省略しない:FINALだけでは、この記事で使うルールの形式として不完全です。保存前にカンマとポリシー名を確認してください。
- 日本語の句読点を混ぜない:設定例では半角カンマを使います。説明文がルールのパラメーターに混ざらないようにしてください。
FINALが処理するのは「前のルールに一つも一致しなかった場合」であり、「前のルールに一致した後、接続に失敗した場合」ではありません。DIRECTルールに一致した通信は、直接接続がタイムアウトしても、末尾のFINAL,PROXYに自動で引き継がれません。その場合は、先に照合条件が広すぎないか確認し、ルールの順序を変えるかポリシーを変更してください。
変更と確認:一度に変更するルールは1つだけ
作業を始める前に現在のConfigのコピーを保存し、使用中のConfig名を記録してください。Homeの購読は登録済みのサービス情報を管理し、Configのルールは通信を振り分けます。Subscribeを更新しても、ルールが変更されるわけではありません。リモートConfigの更新で編集内容が置き換わることもあるため、「既存の購読情報の更新」と「ルールConfigの更新」を区別し、操作後に有効なファイルを確認してください。
-
ルーティング設定を確認
Home → Global Routing → Configを開きます。登録済みの接続が利用できる状態を保ち、現在選択しているプロキシまたはポリシーグループを記録してください。テスト中に接続経路を同時に変更しないようにします。
-
現在のConfigをバックアップ
Configを開き、現在使用中のConfigを確認します。先にコピーを保存してから、そのConfigの編集画面を開いてください。テキストで編集する場合は、[Rule]セクションを探します。
-
個別のルールを追加
確認したいDOMAINまたはDOMAIN-SUFFIXを、対象を含む広範囲のルールより前に配置します。末尾にFINALを1行だけ残し、保存後に変更したConfigが使われていることを確認してください。
-
テスト用リクエストを再実行
対象アプリで進行中の古いリクエストを停止してから、もう一度アクセスします。必要に応じてConfigの保存後にShadowrocketを再接続してください。変更前に確立した長時間接続を、新しいルールのテスト結果と取り違えないようにします。
-
ルールの一致結果を確認
リクエスト記録に表示される宛先ドメイン、宛先IP、ポリシーを確認します。一度に変更する項目は1つにして、変更前後の結果を記録してください。想定したルールに一致しない場合は、プロトコルをすぐに変えず、まず順序を確認します。
Webページは通常、メインページ、ログイン、画像、APIなど複数のドメインへリクエストを送ります。メインページがPROXYに一致しても、すべてのリソースが同じルールに一致するとは限りません。「トップページは開くがログインできない」場合は、ブラウザーのアドレス欄にあるドメインだけに例外を追加するのではなく、失敗したリクエストの実際のドメインを確認してください。
ルールが適用されたかどうかは、新しいリクエストの照合結果とポリシーで判断します。遅延テストで分かるのは特定のテスト経路の応答状況であり、Webページのリクエストが指定したルールに一致したことの証明にはなりません。
よくある質問:ルールが効かないときの確認方法
DIRECTを設定したのに、なぜプロキシ経由になる?
まずHome → Global RoutingでConfigが選択されていることを確認します。次に、DIRECTルールより前に、同じドメインを含むDOMAIN-SUFFIXなどの広範囲なルールがないか調べてください。個別の例外を対象範囲の広いルールより前に移し、保存後にリクエストを再実行します。
FINALを変更しても、対象に接続できないのはなぜ?
まず、リクエストが実際にFINALまで到達しているか確認してください。先行するREJECTまたはDIRECTに一致している場合、FINALを変更しても影響しません。FINAL,PROXYに一致していることを確認できたら、使用中のプロキシ経路、対象サービス、DNSの名前解決結果を調べます。
ルールにドメインを設定しても、IPアドレスへのアクセスが一致しないのはなぜ?
DOMAINとDOMAIN-SUFFIXは、利用可能なドメイン情報に基づいて照合します。IPアドレスへの直接アクセスは、同じドメインへのアクセスとは異なります。IPアドレスで照合する必要がある場合は、適切な範囲のIP-CIDRを追加してください。1つの対象を解決するために、範囲が広すぎるアドレスを追加しないようにします。
更新後、追加したルールが消えたのはなぜ?
Configで現在のファイルと内容を確認し、別のConfigに切り替わっていないか、リモートConfigが更新されていないか調べてください。バックアップと[Rule]セクションを照合し、必要な例外を戻してFINALの位置を確認します。Homeにある既存の購読情報を更新したことは、ルールが保存された証拠にはなりません。
最後に、内容を説明できる最小限のルール一覧を残します。個別の例外を先頭に、範囲ルールを中ほどに、FINALを末尾に配置してください。問題が起きたら、まずGlobal Routingと現在のConfigを確認し、該当するリクエストを追います。ルールの順序、接続経路の到達性、DNSの問題を切り分けられるため、ルールを重複して追加し続けて原因の特定が難しくなるのを防げます。