ルールは、まずマッチ対象を決め、次に通信先のポリシーを選び、最後に順序を確認します。Shadowrocketに自分で用意したサーバーを追加し、Configを編集する方向けに、ドメインルールとIPルールの違い、FINALを含む最小構成の書き方、接続ログで想定どおりにマッチしたかを確認する方法を解説します。例示するドメインと予約済みアドレスは構文の説明用で、接続先としては利用できません。
1. ルールが有効になる条件とマッチ順
ルールは設定ファイルの[Rule]セクションに記述します。この記事で扱う通常のルールは上から順に判定され、マッチすると、そのルールで指定したポリシーが適用されます。後ろにある「より具体的な」ルールまで判定が続くことはありません。そのため、例外ルールは範囲の広いルールより前に、FINALは末尾に置きます。
テストを始める前に、Home → Global RoutingでConfigを選び、Configで現在有効になっているファイルが編集したファイルか確認してください。ProxyやDirectを選んでいる場合、この記事のルールごとの判定結果ですべてのリクエストを説明することはできません。Sceneはシーンの選択に関わるため、最小構成のルールテストには適していません。
ルールは通信の処理方法を決めるもので、サーバーの設定項目を補ったり、接続先への到達を保証したりするものではありません。PROXYにマッチしても、アドレス、ポート、認証情報が正しくなければ、自分のサーバーへの接続に失敗することがあります。テストでは「何にマッチしたか」と「接続に成功したか」を分けて記録してください。
2. DOMAIN・DOMAIN-SUFFIX・DOMAIN-KEYWORD
ドメインルールの基本形式はルールタイプ,マッチ対象,ポリシーで、半角カンマで区切ります。マッチ対象に指定するのはホスト名で、完全なURLではありません。ドメイン欄にhttps://、パス、クエリパラメータ、:443を入力しないでください。同じホスト上の異なるページパスを、この3種類のルールで区別することはできません。
| ルール | マッチ範囲 | マッチしない例 |
|---|---|---|
DOMAIN,example.com,DIRECT | 完全一致するホスト名example.comのみ | www.example.com |
DOMAIN-SUFFIX,example.com,PROXY | example.comとそのサブドメイン(例:img.example.com) | notexample.com |
DOMAIN-KEYWORD,example,REJECT | ドメイン名にexampleという文字列を含む対象 | sample.test |
DOMAIN-SUFFIXはドメインの階層に基づいてマッチします。「このドメインとすべてのサブドメイン」を指定する場合に適しています。*.example.comとは書かず、example.comをそのまま指定してください。DOMAIN-KEYWORDはより広い範囲にマッチするため、たとえばmyexample.testも対象になることがあります。関係のない接続までマッチしないか確認しましょう。
[Rule]
DOMAIN,account.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
この単独の例では、account.example.comは1行目にマッチしてDIRECTになり、img.example.comは2行目にマッチしてPROXYになります。最初の2行を入れ替えると、アカウントのサブドメインが先にサフィックスルールにマッチし、後ろの完全一致ルールは適用されません。これは「ルールの順序」の問題であり、DOMAINの優先度がDOMAIN-SUFFIXより低いという意味ではありません。
要点:例外を先に、広い範囲を後に
同じドメイン体系で異なるポリシーを適用する場合は、個別のホストを指定するDOMAINをDOMAIN-SUFFIXより前に置きます。文字列でのマッチが必要な場合に限り、DOMAIN-KEYWORDを使ってください。
3. IP-CIDR・GEOIP・no-resolve
IP-CIDRは、接続先のIPv4アドレスが属するネットワーク範囲にマッチし、Webサイト名にはマッチしません。スラッシュの後ろの数字はプレフィックス長です。/32はIPv4アドレス1個、/24は256個のアドレスを含むネットワーク範囲を表します。ここでのアドレス数にはネットワークアドレスなども含まれ、利用可能なサーバー数と同じではありません。
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR,198.51.100.0/24,REJECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
上記の192.0.2.8と198.51.100.0/24は、書式の説明に使う文書用予約アドレスです。no-resolveは、このIPルールのマッチ判定のために追加のドメイン名前解決を行わない指定です。マッチ判定時に利用できる宛先IPがすでにあれば、それに基づいて判定できます。すべてのDNSを無効にする設定でも、「ドメインとIPの両方に自動でマッチする」設定でもありません。
- IPアドレスへ直接接続する場合:接続先アドレスをそのままIPルールのマッチ判定に使えるため、先にドメイン名からアドレスを取得する必要はありません。
- ドメイン名へ接続する場合:IPルールにマッチするかどうかは、判定時に利用できるIP情報やDNSの動作、
no-resolveに左右されます。ドメインのサフィックスだけでは判断できません。 - GEOIP:
GEOIP,CN,DIRECTは、使用する地理データベースにおける接続先IPの分類に基づいてマッチします。中国語のWebサイトすべてや、.cnで終わるドメインすべてを指すものではありません。 - アドレスの変化:同じドメインでも、名前解決で異なるアドレスが返されることがあります。固定の
IP-CIDRを使う場合は、実際の接続先が引き続きその範囲に含まれるか確認してください。
特定のWebサイトに指定したポリシーを適用したい場合は、明示的なドメインルールを使うと検証しやすくなります。既知のアドレスやネットワーク範囲を管理する場合は、IPルールを使います。地理データベース上の分類とサービスの実際の配置場所が異なることもあるため、GEOIPをWebサイトの識別手段として扱わないでください。
4. PROXY・DIRECT・REJECT・FINALの違い
ルール末尾のポリシーは、「マッチした後にどう処理するか」を指定します。PROXYはプロキシ経由で通信する指定ですが、実際に使うサーバーは現在の選択内容や関連設定によって異なります。DIRECTは接続先に直接接続し、REJECTはリクエストを拒否します。これらはプロトコルではなく、サーバーのType、アドレス、ポートの代わりには使えません。
| 記述例 | 意味 | 確認ポイント |
|---|---|---|
DOMAIN,example.com,PROXY | このホストへの通信をプロキシ経由にする | ルールにマッチした後、実際に使われるサーバーを確認する |
DOMAIN,example.com,DIRECT | このホストへ直接接続する | 現在のネットワークから接続先へ直接アクセスできるか |
DOMAIN,example.com,REJECT | このホストへのリクエストを拒否する | 拒否が本来の意図に合っているか |
FINAL,PROXY | それまでにマッチしなかったリクエストにPROXYを適用する | フォールバックのポリシーが想定どおりか |
FINALには「マッチ対象」フィールドがなく、形式はFINAL,ポリシーです。FINAL,example.com,PROXYのようには書きません。途中に置くと、それ以降のリクエストを先に処理するため、後続の通常ルールが想定どおりに機能しなくなります。フォールバックにDIRECTとPROXYのどちらを使うかは利用目的によって異なり、すべての設定に共通する正解はありません。
5. Configに最小構成を保存して検証する
まず元の設定を複製し、ローカルのテスト用ファイルを編集してください。以下のルール部分を、設定ファイル全体にそのまま上書きしないでください。ここに示すのは[Rule]セクションのみです。元のファイルに同セクションがある場合は、その中を編集してください。[Rule]セクションを複数作ると、設定の把握が難しくなります。
-
元の設定を複製する
Configを開き、現在有効なファイルを確認します。内容をバックアップしてから、ローカルのテスト用設定を別に用意してください。テスト後に元へ戻せるよう、変更前のGlobal Routingの選択内容も記録しておきます。 -
ルールを編集する
Configからテストファイルの編集画面を開き、[Rule]を探して、下の最小構成例を入力します。カンマの位置、フィールド数、FINALの位置を確認してから保存してください。 -
設定を有効にする
Configで保存したテストファイルを選び、次にHome → Global Routing → Configを選択します。Homeで選択されているのが、自分で用意し、接続情報も正しく設定したサーバーであることを確認してください。 -
新しいリクエストを送る
接続先へのリクエストを新たに開始し、アプリの接続ログで接続先、マッチしたルール、適用されたポリシーを確認します。すでに確立している長時間接続では、変更したルールを検証できないことがあります。必要に応じて接続先のアプリを終了し、再度開いてください。
-
ルールを1つずつ追加する
最小構成が想定どおりに動作することを確認したら、ルールを1つ追加するごとに検証を繰り返します。結果が変わった場合は、DNS、サーバー、複数のルールを同時に変更せず、直前に追加したルールをいったん戻してください。
[Rule]
DOMAIN,account.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
この例では、アカウントのサブドメインに先にDIRECTを適用し、それ以外のexample.comのサブドメインにはPROXYを適用します。その後、IPルールとGEOIPを確認し、最後にFINALで残りを処理します。例示ドメインはマッチの仕組みを確認するためのものです。実際に接続テストを行う際は、自分がアクセスでき、ホスト名が明確な接続先に置き換えてください。
- テスト記録を残す:接続先のホスト名、マッチしたルール、実際のポリシー、接続結果の4項目を記録してください。
- ホストごとに確認する:1つのページから、画像、ログイン、APIなど別々のホストへのリクエストが送られることがあります。メインページが想定どおりでも、すべての関連リクエストに同じポリシーが適用されるとは限りません。
- 設定の上書きを確認する:設定がリモート更新される場合、更新によってローカルの変更が置き換わらないか確認し、独自の内容は別に保存してください。
6. ルールが反映されない場合とtimeoutの確認手順
「ページが開けない」ことだけでは、ルールの構文エラーとは判断できません。まず現在のファイルとGlobal Routingを確認し、次に実際の接続先とマッチしたルールを見て、最後に接続先への通信を確認します。接続に失敗したからといって、すべてのルールをすぐにPROXYへ変更しないでください。マッチの問題と接続の問題を切り分けられなくなります。
エラー:timeout
原因:接続テストまたはリクエストが所定の時間内に完了しなかった状態です。この結果だけでは、原因がルール、接続先のネットワーク、使用中のサーバーのどれかは判断できません。
対処:まず、このリクエストに実際に適用されたポリシーを確認します。PROXY の場合は、Home → Connectivity Test で現在のサーバーをテストし、自分の接続先アドレス、ポート、認証情報も確認してください。
| 症状 | 最初に確認する項目 | 対処方法 |
|---|---|---|
| すべてのリクエストが同じ方法で通信される | Home → Global RoutingがConfigになっているか | Configに戻し、現在有効なファイルを確認する |
| 完全一致のドメインルールにマッチしない | 前にサフィックスルールやキーワードルールがないか | 優先したい完全一致ルールを前に移動する |
| 後半のルールが適用されない | FINALが途中に置かれていないか | FINALを通常のルールの後ろに移動する |
| メインページは表示できるが、画像やAPIへの接続に失敗する | 失敗したリクエストが別のホスト名宛てではないか | アドレスバーだけで判断せず、実際の接続先に応じてルールを追加する |
| IPルールが想定どおりにマッチしない | 実際の接続先アドレス、ネットワーク範囲、no-resolve | マッチ判定時に使えるアドレス情報を確認し、ドメインの所属先とIPアドレスの所属先を同一視しない |
最後にルールの記述自体を確認します。半角カンマを使い、DOMAIN-SUFFIXなどのキーワードは原文のまま残し、説明文をルール行に貼り付けないでください。DOMAINなどの3フィールド形式のルールとFINALでは、フィールド数が異なります。名前付きポリシーを追加した場合は、参照先の名前が現在の設定に存在することも確認してください。元の設定に戻して正常に動作する場合は、変更箇所を絞る手がかりになります。具体的な原因は、変更を1つずつ戻して特定してください。