Shadowrocketに自分の設定を読み込み、特定のドメインの接続先を調整したい方向けの記事です。ルールが上から評価される仕組み、よく使う3種類のポリシー、FINALによるフォールバックを、確認可能な例とともに解説します。ルールが想定どおりに動かない場合の確認手順も紹介します。
まずルールモードを確認:Configと逐次判定
HomeでGlobal Routingを確認します。Configを選ぶと、現在の設定ファイルにあるルールに従って接続が処理されます。ProxyまたはDirectを選んだ場合は、それぞれ対応する全体ルーティングが適用されるため、個別のカスタムルールの振り分け確認には適しません。Sceneはシーンに応じてルーティングを選ぶ別の方式で、Configでのルール単位のテストとは分けて考えます。確認を始める前に、使用中の設定ファイルと選択中のプロキシを控えておきましょう。編集したファイルとテスト対象のファイルが異なる事態を防げます。
ルールは、リストの先頭から各行の条件にリクエストが一致するかを確認します。一致した時点で、その行に指定されたポリシーが適用され、以降のルールは評価されません。ドメインのサフィックス、接続先IPのネットワーク範囲、地理的位置はそれぞれ異なる判定条件です。ファイル内の名前だけで優先順位を推測しないでください。同じリクエストが複数の行に一致する可能性がある場合は、先に並んでいる行が結果を決めます。
ルールの書き方:条件・対象・ポリシー
一般的なルールでは、各項目を半角カンマで区切ります。DOMAIN-SUFFIX,example.com,PROXYは、ドメインがexample.com、または.example.comで終わる場合にPROXYを適用することを示します。GEOIP,CN,DIRECTは、対象IPが地理的位置の条件に一致した場合にDIRECTを適用する設定です。ここでのexample.comは説明用のドメインであり、読み込むサービスの接続先を示すものではありません。編集時はキーワード、カンマ、ポリシー名を英語表記のままにし、日本語の句読点をルールに混ぜないでください。
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-SUFFIX,ads.example.com,REJECT
IP-CIDR,192.0.2.0/24,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY
上の5行はルールの構成を示す例であり、既存の設定をそのまま置き換えるためのものではありません。192.0.2.0/24は説明用のネットワーク範囲です。IP-CIDRのスラッシュ以降の数字はプレフィックス長を表します。実際に編集する場合は、照合したい対象のネットワーク範囲を指定してください。REJECTは条件に一致したリクエストを拒否します。DIRECTは選択中のプロキシを経由せず直接接続し、PROXYは現在の設定で指定されているプロキシ経路を使います。DIRECTで接続できるかどうかは、現在のネットワークと接続先に到達できるかによって異なります。
ドメインとアドレスの条件
- DOMAIN-SUFFIX
- 指定したドメインとそのサブドメインに一致
- IP-CIDR
- 指定した接続先IPのネットワーク範囲に一致
- GEOIP
- 接続先IPの地理的位置を条件に判定
ドメイン条件とIP条件では確認対象が異なります。変更前に、リクエストが実際にアクセスする接続先を確認してください。
ポリシーとフォールバック
- PROXY
- 選択中のプロキシ経路を使用
- DIRECT
- 接続先に直接接続
- REJECT
- リクエストを拒否
- FINAL
- それまでに一致しなかったリクエストにポリシーを指定
ポリシーは条件の後に記述します。FINALにはドメインやネットワーク範囲を指定する必要はありません。
個別ルールを先に、広い条件を後に
たとえば、ads.example.comをREJECTにし、それ以外のexample.comドメインをPROXYにする場合は、対象を絞ったサブドメインのルールを、より広いサフィックスルールより前に置く必要があります。直前のコード例の順序では、ads.example.comへのリクエストは1行目のDOMAIN-SUFFIX,example.com,PROXYに先に一致するため、2行目のREJECTは評価されません。ルール名がより具体的に見えても、後ろのルールが自動的に優先されることはありません。
- Configで現在使用中の設定ファイルを開き、変更するルールの箇所を探します。比較できるよう、編集前のルールテキストを控えておきましょう。
ads.example.comだけを対象にするルールを、example.comのサフィックスルールより上に移動します。保存後、リストの順序をもう一度確認してください。- Global RoutingをConfigのままにして対象への新しいリクエストを送り、アプリ内の接続記録で接続先と適用されたポリシーを確認します。
DOMAIN-SUFFIX,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
同じ考え方はネットワーク範囲にも当てはまります。小さいIP-CIDRの範囲をDIRECTにし、それを含む大きな範囲をPROXYにする場合は、小さい範囲を先に置きます。順序を変えるときは、実際に範囲が重なるルールだけを移動し、特定のドメインの問題を解決するために設定全体を大幅に並べ替えるのは避けてください。テストには新しく開始したリクエストを使いましょう。すでに確立した接続では、保存後のルール順序を正しく確認できません。
判定の順序:最初に一致する可能性のある行を探す
結果が想定と異なる場合は、リストの先頭から、対象にも一致しうるルールを探します。まずそのルールと対象ルールの順序を見直し、その後でポリシーの変更を検討してください。
FINALを最後に置く理由
FINAL,PROXYは、それまでのルールに一致しなかったリクエストにPROXYを指定します。FINALは処理の締めくくりに使うもので、PROXYの優先順位を上げるためのものではありません。特定のドメインやネットワーク範囲を限定しないため、確認が必要な個別ルールより前に置くと、後続のルールが一致する機会を失います。未分類のリクエストを直接接続したい場合は、設定の目的に応じてFINAL,DIRECTを使えます。ネットワーク環境を問わずどちらが優れているということはなく、未一致の通信をどこへ送るかを明確にすることが重要です。
- 個別の対象:個別に処理するドメインまたはIP-CIDRを先に列挙します。重複する範囲を明確にすると、順序を確認しやすくなります。
- 広い範囲:続けて、汎用的なドメインサフィックスやGEOIPなどの条件を置き、個別ルールより先に対象を拾っていないか確認します。
- 最後の行:残りのリクエストをFINALで処理します。フォールバックのポリシーを変更した場合は、専用ルールのない接続先も含めて再テストしてください。
リストがDOMAIN-SUFFIX,example.com,DIRECTとFINAL,PROXYの2行だけの場合、このサフィックスに一致するリクエストはDIRECT、それ以外の未一致リクエストはPROXYになります。2行の間にGEOIP,CN,DIRECTを追加すると、ドメインルールに先に一致せず、かつこの条件に合うリクエストだけがGEOIPの行で処理されます。「中国本土の通信は直接接続、その他はプロキシ」とだけ説明するより、このように行ごとの結果を確認する方が正確です。リストの前方に、別の条件で一致するルールがある可能性があるためです。
ルールを保存しても想定どおりに動かない場合の確認手順
まず、「ルールが適用されていない」のか「選択した経路で接続できない」のかを切り分けます。前者ではGlobal Routing、使用中の設定ファイル、より上にあるルールを確認します。後者では、選択中のプロキシまたは直接接続の経路が使えるかを確認してください。Shadowrocketはルールに従って通信を処理しますが、ルールによって到達できない接続先にアクセスできるようになるわけではありません。すでに利用しているサービスやサブスクリプションがある場合は、現在使用中の設定と接続情報が、テスト対象に合っていることも確認します。確認のためにサブスクリプションの提供元を変更する必要はありません。
- Homeに戻り、Global RoutingがConfigになっていることと、編集中の設定ファイルが現在使用中のものと同じであることを確認します。
- リストの先頭から、対象に一致する可能性のある条件を探します。特に、広い範囲を対象にするDOMAIN-SUFFIX、IP-CIDR、FINALが対象ルールより前にないか確認してください。
- リクエストの実際のドメインまたは接続先IPを確認します。ウェブページは複数のドメインにリクエストを送ることがあります。テストページに異常があっても、ページのメインドメインに対応するルールが一致していないとは限りません。
- 変更を保存してから新しい接続を開始し、アプリ内の記録を確認します。PROXYに一致してもアクセスできない場合は、選択中のプロキシと接続先への到達性をそれぞれ確認してください。
REJECTを設定したのに、リクエストがPROXYを使うのはなぜ?
リストの先頭から、対象を含むDOMAIN-SUFFIXやFINALが先にないか確認してください。個別のREJECTルールを広い範囲のルールより前に移動して保存し、新しいリクエストで再テストします。
FINALを変更しても、特定のドメインの接続先が変わらないのはなぜ?
FINALが処理するのは、それ以前のルールに一致しなかったリクエストだけです。まず、そのドメインがFINALより前に最初に一致する行を探します。接続先を変えるには、その行のポリシーまたは位置を確認してください。
GEOIP,CN,DIRECTを設定したのに、一部のウェブページでPROXYが使われるのはなぜ?
まず、その接続の接続先と、それより前にあるルールを確認します。GEOIPが判定するのは接続先IPの条件であり、ウェブページの表示言語ではありません。リクエストが先にドメインルールに一致すると、GEOIPは評価されません。
Proxyに切り替えた後、設定したルールをどう確認できますか?
まずHomeのGlobal RoutingをConfigに戻し、使用中の設定ファイルを確認してから、新しいリクエストを送ります。Proxyの全体ルーティングでの接続結果では、Config内の特定のルールが一致したことを確認できません。
サブスクリプションによって追加されたルールを確認する場合は、ローカルで編集した場所と、サブスクリプション更新後の設定内容を把握してください。更新によって使用中のルールテキストが変わることがあります。再テストの前に、対象の行が残っているか、順序が正しいかを確認しましょう。PROXYポリシーの場合は、ルールへの一致とプロキシの接続状態を分けて確認します。一致はリクエストがその経路に割り当てられたことを示すだけで、その経路がその時点で利用可能であることを保証するものではありません。