Shadowrocketのルールは、接続に適用するポリシーを決めるもので、利用可能なサーバーを提供するものではありません。サーバーのインポートを済ませ、Configで通信を振り分けたい方に向けて、Global Routingと構成ファイルの違い、6つのルールキーワード、最小限の例を使ったマッチ順序・DNSの条件・実際の接続先を解説します。ドメイン名とアドレスの例は構文の説明用であり、利用可能な接続先ではありません。
1. まずConfigを選択し、ルールの適用を確認する
Shadowrocketのルールは、接続を開始すれば必ず1行ずつ適用されるわけではありません。まずHomeでGlobal Routingを確認します。現在の構成ファイル内のルールを使うにはConfigを選択してください。続いてConfigで、編集した構成ファイルが実際に有効になっているか、同じ名前の別ファイルが選ばれていないかを確認します。
| 選択肢 | 用途 | ルール確認時の注意点 |
|---|---|---|
Config | 現在の構成に従って振り分け | この記事のルール例を検証する際の前提です。 |
Proxy | すべての通信をプロキシ経由で接続 | この状態では、特定のルールがDIRECTを選択したか検証できません。 |
Direct | すべての通信を直接接続 | この状態では、PROXYルールが正しく動作するか判断できません。 |
Scene | シーンに応じて設定を適用 | シーンが切り替わっていないか先に確認し、ルールが効かない状態と混同しないようにします。 |
Homeではサーバーの選択と接続、Configでは構成ファイルの管理、Settingsではアプリの設定を行います。Settings → On Demandは条件に応じた接続の動作に影響しますが、DOMAIN-SUFFIXのポリシーを自動で別のものに変える機能ではありません。トラブルシューティングでは「接続が確立するか」と「確立後にどのルールが適用されるか」を分けて確認し、異なる種類の設定を同時に変更しないでください。
2. ルールは上から順に判定され、最初の一致でポリシーが決まる
一般的なルール行は英語のカンマで区切り、「ルールタイプ、マッチ対象、ポリシー」の順に記述します。マッチ対象を持たないFINALは「FINAL、ポリシー」の形式です。ルールは記載順に判定され、一致した時点でそのポリシーが適用されます。後続のより具体的に見えるルールまで判定されることはありません。そのため、「具体的な例外を先に、広い範囲のルールを後に、FINALを最後に」という順序が重要です。
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
この3行の場合、api.example.comは1行目に一致してPROXYが選ばれます。www.example.comは1行目には一致しませんが、2行目に一致するためDIRECTが選ばれます。2行目を1行目より前に移すと、api.example.comも先にサフィックスルールに一致し、元の個別例外が適用されません。順序を誤っても必ず構文エラーになるとは限りませんが、判定結果は変わります。
3. DOMAIN・DOMAIN-SUFFIX・DOMAIN-KEYWORDの違い
ドメインルールがマッチするのは、接続で利用できるドメイン情報であり、ウェブページの完全なURLではありません。マッチ対象にはプロトコル、ポート、パス、クエリパラメーターを含めないでください。たとえば/accountというパスのページにアクセスする場合も、DOMAINが判定するのはホスト名だけです。同じホスト上の2つのページを区別することはできません。
| キーワードと例 | マッチする対象 | マッチしない対象・注意点 |
|---|---|---|
DOMAIN,example.com,DIRECT | example.com | www.example.comは含まれません。 |
DOMAIN-SUFFIX,example.com,PROXY | example.com、www.example.com、a.b.example.com | notexample.comは含まれません。サフィックス判定ではドメインラベルの境界が考慮されます。 |
DOMAIN-KEYWORD,metrics,REJECT | ドメイン名にmetricsを含む接続 | マッチ範囲が広く、metricsという名前のサブドメインだけに限定されません。 |
api.example.comだけをプロキシ経由にする場合は、apiをDOMAIN-KEYWORDに指定するのではなく、DOMAINを使ってください。後者では無関係なドメインまで対象になる可能性があります。1つのドメインとそのすべてのサブドメインを対象にする場合は、DOMAIN-SUFFIXを選びます。ここで説明したサフィックス構文の代わりに、ワイルドカードの*.example.comを使わないでください。
- ホスト名を完全一致させる場合は、
DOMAINを使います。 - ドメインとそのサブドメインを対象にする場合は、
DOMAIN-SUFFIXを使います。 - 文字列による広い範囲のマッチが必要な場合は、
DOMAIN-KEYWORDを使い、意図しない一致がないか確認してください。 - 接続先のIPアドレスしか分からず、利用可能なドメイン情報がない場合は、IP系ルールを確認します。ドメインルールが必ず判定に使われるとは限りません。
4. IP-CIDR・GEOIPとDNSの関係
IP-CIDRはアドレスのネットワーク範囲で、GEOIPはIPの地理情報データベース上の所属情報でマッチします。判定対象はいずれもアドレス情報であり、ウェブページの言語、アカウントの地域、ドメイン末尾の国・地域コードではありません。ドメインに特定の国・地域コードが使われていても、それだけでGEOIPのどの地域コードに一致するかは判断できません。
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
192.0.2.0/24は文書用のサンプルネットワークです。/24は先頭24ビットがネットワークプレフィックスであることを示し、192.0.2.0から192.0.2.255までが範囲に含まれます。これは利用可能なサーバーアドレスではありません。IP-CIDRはアドレス範囲全体にマッチするため、192.0.2.0という文字列だけを判定するものではありません。IPv6のネットワークには対応するIP-CIDR6ルールタイプを使用し、IPv4の例にIPv6アドレスを無理に記述しないでください。
ドメインルールに一致せず、後続のIPルールにアドレス情報が必要な場合は、DNSの状態が判定に影響することがあります。GEOIPの結果も実際の接続先アドレスとデータベースの内容によって異なり、特定のウェブサイトの全リソースが対象になるとは限りません。確認時は「アプリが開かない」だけでなく、対象ドメイン、実際のアドレス、適用されたポリシーを記録してください。
5. 最小限のルールセットでFINALとポリシーの結果を確認する
以下はルールの読み方や動作を試すための一通りの例であり、あらゆるネットワーク向けの設定推奨ではありません。変更前に現在の構成とサーバー設定を残し、コピー上でルールを調整してください。[Rule]だけの断片を、接続に必要なパラメーターをすべて含む新しい構成ファイルとして扱わないでください。
[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
DOMAIN-KEYWORD,metrics,REJECT
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
blocked.example.comは最初にREJECTに一致するため、後続のexample.comサフィックスルールには進みません。api.example.comは2行目に一致してPROXYが適用されます。実際に接続できるかどうかは、プロキシサーバーの状態にも左右されます。metrics.example.comは先にDOMAIN-SUFFIXに一致するため、後続のREJECTではなくDIRECTが適用されます。- それ以外のドメインは、metricsを含み、かつ先行ルールに一致しない場合にDOMAIN-KEYWORDに一致します。
- 先行ルールに一致しなかった接続は、
FINAL,PROXYが適用されます。FINALは、引き続き判定が必要なルールより前に置かないでください。
metrics.example.comも拒否する場合は、サフィックスルールより前に、個別のDOMAIN例外を追加できます。キーワードルール全体を前に移動すると、metricsを含むすべてのドメインが先に拒否される可能性があります。変更前に対象範囲を明確にし、「個別の例外を追加する」か「範囲の広いルールを移動する」かを選んでください。1つのドメインを修正するために、影響範囲を広げないようにしましょう。
6. 現在の構成を編集して動作を確認する
-
元の構成を残す
Configを開き、まず現在使える構成のコピーを保存してから、変更するファイルの編集画面を開きます。元に戻せるよう、ファイル名と元のGlobal Routingの設定を記録してください。
-
ルール部分を確認する
構成ファイル内で[Rule]を探し、英語のカンマで区切って1行ずつ編集します。個別の例外は該当する範囲の広いルールより前に置き、FINALは最後に配置してください。順序を整理する代わりに、[Rule]のセクションを複数貼り付けないでください。
-
構成を有効にしてモードを選ぶ
保存後、Configでこのファイルが選択されていることを確認します。Home → Global Routing → Configに戻り、Configを選択してください。ファイルを保存しただけでは、変更を検証できません。
-
接続先を確認する
Homeで既存のサーバーを選択し、Connectivity Testを実行して、プロキシ経由で接続できる状態か先に確認します。サーバーとサブスクリプションの情報は利用中のサービス提供元から取得してください。ルールの記述だけでは、これらのパラメーターを補えません。
-
新しい接続で確認する
対象へのリクエストを新たに開始し、アプリの接続記録で接続先、マッチしたルール、出力ポリシーを確認します。一度に変更するのは1項目だけにしてください。古い接続が再利用される場合は、必要に応じて古いリクエストを停止してから再接続し、テストしてください。
Connectivity Testで確認できるのは接続の可否であり、特定のウェブサイトに指定したルールが適用された証明にはなりません。ルールの検証には、個々のリクエストの記録を使ってください。また、サーバーのサブスクリプションとルールの構成は別々に確認します。Homeのサーバーリストを更新しても、現在のConfig内のルールが更新されるわけではありません。リモート構成を再更新した後は、ローカルでの変更が保持されているかも確認してください。
7. ルールの誤りと接続先の問題を切り分ける
ルールがPROXYに一致していても、ウェブページが開かないからといって、構文エラーとは限りません。以下は接続ログによく表示されるネットワークエラーの一部です。エラー全文にアドレス、ポート、低レベルの詳細が含まれる場合は、接続先への接続段階とプロキシサーバーへの接続段階のどちらで発生したかをまず確認してください。
エラー:connection refused
原因と対処:接続先のエンドポイントが接続を拒否しています。対象ポートで待ち受けていない場合や、明示的に拒否された場合によく発生します。まず接続記録で失敗したエンドポイントを確認し、該当するサーバーまたは接続先サービスのアドレスとポートを調べてください。FINALの位置を変更するだけでは解決できません。
エラー:i/o timeout
原因と対処:制限時間内にネットワーク処理が完了しませんでした。まずHomeのConnectivity Testで選択中のサーバーを確認し、次に対象リクエストがDIRECTとPROXYのどちらを通ったかを確認して、それぞれ直接接続経路またはプロキシ経路を調べてください。
たとえばサービス提供元からサーバーポートとして443が指定されている場合、サーバー設定のポートが実際に443になっているか確認してください。ルールの例に443が出てくるという理由だけで、元のポートを置き換えないでください。DOMAIN-SUFFIX自体にポートの指定はなく、サーバーの待ち受けポートとドメインのマッチ条件は別の層に属します。
8. ルール設定についてよくある質問
DOMAINを設定したのに、別のポリシーが適用されるのはなぜですか?
まずHome → Global RoutingでConfigが選ばれているか確認し、次にConfigで有効なファイルを確認してください。その後、対象ルールより前にあるルールを上から確認します。特に先行するDOMAIN-SUFFIX、DOMAIN-KEYWORD、FINALに注意してください。前のルールに一致した接続は、それ以降のルールでは判定されません。
GEOIP,CN,DIRECTで、すべてのドメインルールを置き換えられますか?
できません。GEOIPは接続先IPのデータベース上の所属情報で判定するため、同じサービスでも異なる地域のリソースが使われることがあります。特定のドメインに適用するポリシーを固定するには、明示的なDOMAINまたはDOMAIN-SUFFIXをGEOIPより前に置き、接続記録で結果を確認してください。
サブスクリプションを更新したのに、ルールが古いままなのはなぜですか?
まず更新した対象を確認してください。Homeのサーバーサブスクリプションの更新は、主にサーバー項目に反映されます。ルールは現在のConfigから読み込まれます。Configで実際の内容と有効状態を確認し、サーバー名が変わったことだけをルール更新の根拠にしないでください。
FINALをDIRECTに変えれば接続を直せますか?
変更されるのは、先行ルールに一致しなかった接続のデフォルトの出力先だけです。サーバーパラメーターやDNSの問題は解決できません。まず対象が実際にFINALに一致しているか確認してください。特定のドメインだけに例外が必要なら、すべての未一致接続の動作を変えるのではなく、範囲を明確にしたルールを追加してください。