公式マニュアル · Config リファレンス
Shadowrocket 設定ガイド ルールと優先順位
本ページは、テーマ別に参照できる設定マニュアルです。設定ファイルの構成、リクエストがルールに一致する仕組み、ポリシーとDNSが結果に与える影響を解説します。初回の読み込みと接続方法は使い方ガイドをご覧ください。基本操作を確認した後、本ページで設定を一つずつ確認できます。
- General / Rule
- Host / URL Rewrite
- PROXY / DIRECT / REJECT
設定ファイルの構成:データとルールを区別する
Shadowrocketでは、サーバー情報と設定ファイルはそれぞれ異なる役割を担います。サーバー情報には接続先、使用するプロトコル、認証方法が記載され、設定ファイルはリクエストの処理方法や、直接接続する対象、プロキシポリシーに渡す対象を定めます。サブスクリプションを読み込んでサーバーが表示されても、意図したルールファイルが選択されているとは限りません。逆に、ルールをすべて含むファイルを保存しても、参照先のプロキシ出口に有効な接続情報があるとは限りません。トラブルの切り分けでは、この2つを別々に確認してください。
Config 内のファイルと現在有効なファイル
Config を開いたら、まず現在使用中のファイルを確認し、次に編集するファイルを確認します。設定ファイルが複数ある場合、一覧のファイル名は識別のためのもので、内容が同じであることを保証しません。編集前にコピーを保存し、現在の Global Routing のモードと選択中のサーバーを記録してください。変更後にアクセスできなくなっても、元のファイルと比較できます。リモート設定の場合は更新方法も確認し、ローカルでの編集が配信元のファイルで上書きされないようにしましょう。
設定ファイルは通常、セクションごとに構成されます。角括弧でセクション名を囲み、その中に設定やルールを1行ずつ記述します。General には共通オプション、Rule にはリクエストの振り分け、Host には静的なホスト名のマッピング、URL Rewrite には条件に合うURLの処理を記述します。各セクションの役割は異なります。同じファイルに書かれていても、先頭から順番に実行する一つのルール一覧ではありません。特に、Host の行をそのまま Rule に貼り付けないでください。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY
設定例は前後関係を保って読む
上の例は確認用の最小構成です。General の2行は等号で値を設定し、Rule の各項目は半角カンマで区切っています。共通オプション、ドメインルール、プライベートアドレスルール、最後に適用するルールの関係を示すもので、サーバー情報の代わりにはなりません。PROXY はプロキシポリシーに渡す指定ですが、最終的な出口は現在の設定と選択中のサーバーによって決まります。example.com は説明用に予約されたドメインです。置き換える場合は実際に処理したい接続先を指定し、サービス提供元のサーバーアドレスは使わないでください。
ルールを読むときは、まず先頭のルールタイプ、次に対象、最後にポリシーと任意パラメーターを確認します。たとえば IP-CIDR の行には DOMAIN-SUFFIX の行と異なり no-resolve があります。これはドメイン解決の扱いに関する指定で、ポリシー名ではありません。FINAL は対象フィールドを持たず、構造も異なります。コピーする際は英語の句読点とフィールドの順序を保ち、カンマが全角に変わったり、セクション名に余分な文字が入ったりしないよう注意してください。
コメントは単独の行に記述し、例外が必要な理由を説明します。ルールの内容をそのまま言い換えるだけでは、後から見返したときに役立ちません。ほかから入手した設定例は、どのセクションに属するか、前提条件は何かを確認してから挿入位置を決めてください。似たセクション名の設定がすべてそのまま互換とは限りません。オプション、任意パラメーター、機能の対応状況は、Shadowrocketアプリ内の最新の説明に従ってください。認識されない項目があれば、まず1行だけで動作を確認します。
ローカル編集とサブスクリプション更新の違い
Subscribe は主にサーバー項目の更新に使われます。一方、Config ファイルの更新ではルールやDNSなど、共通の動作が変わる場合があります。同じサービス提供元から取得したものであっても、更新される内容が同じとは限りません。更新前に何を更新するのかを確認し、更新後はサーバーの選択状態とルールファイルに変化がないか確認しましょう。接続の問題をすべてサブスクリプションの失効とみなすと、ファイルの切り替えやローカルの例外ルールが置き換わった可能性を見落とします。
設定を保存したら、エディターが閉じたことを確認するだけでなく、実際に使用する画面に戻って有効な状態を確認してください。新しい接続にのみ反映されるオプションもあり、既存の接続では以前の経路が使われ続けることがあります。比較テストでは、古いリクエストを終了してから同じリクエストを再度行ってください。接続を再確立する場合は、進行中の作業を先に保存します。操作の全体的な流れは使い方ガイドを参照してください。以降の章では、各設定の判断基準を解説します。
General と DNS:名前解決と接続経路は別
General の設定は、リクエストがルールで判定される前後の基本動作に影響するため、1つのドメインルールより広い範囲に作用することがあります。DNS はドメイン名をアドレスに変換し、Rule はリクエストの処理方法を決め、サーバー情報はプロキシ接続を確立します。この3つは関連していますが、互いの代わりにはなりません。ドメインが名前解決できても接続先のサービスにアクセスできるとは限らず、プロキシサーバーに接続できても、すべてのドメインを適切に解決できるとは限りません。
原因を説明できる基準をまず作る
[General]
bypass-system = true
dns-server = system
ここでの dns-server = system は、システムのDNSを基準として使用する設定です。現在のネットワークでの基本的な名前解決を確認しやすくなりますが、すべてのネットワークで適切に動作することを保証するものではありません。bypass-system はシステム通信を迂回させる共通設定であり、「すべてのプライベートアドレスを直接接続する」ための代替設定ではありません。個別のアドレスルールが必要かどうかは、対象アドレス、現在のネットワーク、リクエストの記録をもとに判断してください。設定名だけから適用範囲を推測しないようにしましょう。
最初のトラブルシューティングでは、General のオプションを必要最小限にして、変更ごとの影響を説明できる状態にします。DNSの変更、ルールの追加、サーバーの切り替えを一度に行い、その後ページが表示されたとしても、どの変更が有効だったのか分かりません。サーバーと Global Routing を固定して、変更する変数を1つに絞り、同じ対象へ再度リクエストして結果を記録する方法が確実です。動作が戻ったら、その変更を残すか判断してください。
ドメインルールとアドレスルールで必要な情報は異なる
DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD はリクエストから識別できるドメイン名を使い、IP-CIDR と GEOIP はアドレス情報を使います。先行するドメインルールでポリシーが決まる場合、後続のアドレスルールのためだけに追加の照合を行う必要はありません。アドレスルールまで判定が進んだ場合、クライアントが有効な接続先アドレスを取得している必要があることがあります。ここでの名前解決と、最終的な接続に使われる名前解決の経路は、単純に同じものとして扱えません。特にプロキシプロトコルやリモート側での処理方法によって異なります。
アドレスで開始されたリクエストや、クライアントがドメイン情報を十分に取得できないリクエストには、ドメインルールで照合する対象がありません。ブラウザーのアドレスバーにサイト名が表示されていても、すべての個別リクエストが同じドメインを含むとは限りません。接続記録を確認し、ドメイン、接続先アドレス、ヒットしたルールタイプ、適用されたポリシーをそれぞれ確かめてください。1つのページが複数のドメインを使う場合は、トップページのドメインだけでなく、失敗したリクエストを個別に調べます。
DNS設定変更後に確認する範囲
ネットワークを切り替えた後に問題が起きた場合は、まず現在のネットワークで同じドメインを解決できるか確認し、次に新しいリクエストが意図したポリシーで処理されているかを確認します。キャッシュがテスト結果に影響する場合があり、既存の接続では再解決が行われないこともあります。対象のページを閉じて開き直し、必要に応じてアプリ内の操作で接続を再確立してから、新しい記録を確認してください。一度の再読み込みで成功したからといって、継続的に解決できるとは限りません。アドレスが変わっただけで名前解決の異常と判断しないようにしましょう。
ローカルネットワークのリソースでは、システムDNSが内部名の解決を担うことがあります。DNSの参照先をむやみに変更すると、それらの名前を解決できなくなる可能性があります。パブリックドメインでも、ネットワークによって異なるサービスアドレスが返されることがあり、その違いだけで障害とは言えません。まず返されたアドレスに到達できるか、適切なプロトコルでリクエストしているか、サーバー証明書がドメイン名に対応しているかを確認してから、DNSの変更を検討してください。HTTPSサイトにアドレスを直接入力してアクセスしても、通常のドメイン名を使うリクエストを正確に再現できるとは限りません。
Host マッピングで、動的ドメインの名前解決問題を長期的に覆い隠さないでください。マッピングするとアドレスが固定され、サービスが移転した後も古いアドレスを参照し続けることがあります。その結果、DNSを変更しても効果がないように見える場合があります。同じドメインに Host の項目とドメインルールの両方がある場合は、それぞれを分けて記録してください。前者はアドレスの参照元を変更し、後者はポリシーを決めます。マッピングを削除する前に、ローカルのサービスが引き続き依存していないかも確認し、トラブルシューティングを新たなアクセス問題に広げないようにしましょう。
プライバシーに配慮して診断する際は、必要な接続先情報だけを残してください。DNSの記録にはアクセス先のドメインが含まれる場合があります。スクリーンショットやテキストを共有する前に、個人の業務名、アカウント情報、サブスクリプションURLを削除してください。接続失敗をさらに調べる場合は、使い方ガイドのトラブルシューティングも参照し、権限、サーバー、ネットワークの状態を確認します。DNSは個別の確認項目として調べ、あらゆる障害の原因と決めつけないようにしましょう。
ドメインルール:完全一致・サフィックス・キーワード
ドメインルールは「このサービスにどのポリシーを適用するか」を表すのに適しており、変わり続けるサービスのIPアドレスを管理するより分かりやすいことが多いです。タイプを選ぶ前に、1つの完全なホスト名、あるドメインとそのサブドメイン、または特定の文字列を含むドメインのどれを対象にするかを明確にしてください。3種類は対象範囲が順に広がります。記述が短いという理由だけで、最も広いタイプを選ばないでください。範囲が広いほど、無関係なリクエストに一致しないか慎重に確認する必要があります。
DOMAIN:完全なドメイン名で一致
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,static.example.com,DIRECT
FINAL,PROXY
DOMAIN は完全なドメイン名との一致に使います。1行目が対象とするのは api.example.com のみで、example.com やその下位のサブドメインは自動的に含みません。単一のAPIに適用する場合や、広範囲のルールより前に特定の例外を設定する場合に適しています。ホスト名だけを記入し、https://、ポート、パス、クエリパラメーターは付けないでください。これらは DOMAIN の照合フィールドではなく、追加すると意図した対象と異なる指定になります。
完全一致ルールは、それぞれが特定のサービスに対応するため確認しやすい一方、ページが別のドメインにもリクエストを送る場合は、個別にポリシーを確認する必要があります。メインのドメインに一致したからといって、ログイン、画像、認証、APIのリクエストも同じ出口を通るとは限りません。トラブルシューティングでは失敗したリクエストの記録から実際のホスト名を確認し、必要なルールを追加します。URLの見た目から依存先ドメインを推測すると、原因となったリクエストを見落とすことがあります。
DOMAIN-SUFFIX:ドメインの境界に沿って適用
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
DOMAIN-SUFFIX,example.com,DIRECT は example.com とそのサブドメインを対象にします。ドメインのサフィックス関係で判定するため、任意の文字列を含むドメインがすべて一致するわけではありません。名前に example.com という文字列を含むだけの別ドメインは、同じ対象として扱われません。上の例では api.example.com に先に PROXY を指定し、同じドメイン配下のほかのリクエストには DIRECT を適用します。特定の例外を先に、範囲の広いルールを後に置くことで、例外と既定の動作が分かりやすくなります。
サフィックスを指定する場合は通常 example.com と記述します。ブラウザーに表示されたURL全体をそのまま貼り付けたり、Webページのパスをドメインの一部として扱ったりしないでください。ほかの構文での慣習から、*.example.com のようなワイルドカードをそのまま使わないようにしましょう。1つのホスト名だけを対象にするなら DOMAIN、サブドメイン全体が必要なら DOMAIN-SUFFIX を使います。範囲はルールの数ではなく、実際の要件に基づいて決めてください。
DOMAIN-KEYWORD:より広い文字列一致
[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
DOMAIN-KEYWORD は、ドメイン名に指定した文字列が含まれているかを判定します。その文字列がブランド名、組織名、ドメイン境界の一部かどうかは考慮されないため、example が互いに無関係な複数のドメインに含まれることがあります。対象範囲が明確な場合や、一時的な診断には適していますが、対象ドメインを確認する代わりにはなりません。短い語、よく使われる語、業務上の意味を持つ広い語は、意図しない一致を特に起こしやすいため注意してください。
キーワードルールを完全一致ルールより前に置くと、後続の完全一致ルールがリクエストを処理する機会を失います。完全一致ルールのほうが「具体的」に見えても、自動的に優先されることはありません。テストでは、対象にしたいドメイン、同じ文字列を含むが対象にしたくないドメイン、まったく関係のないドメインの3種類を確認します。対象と除外の両方が想定どおりになって初めて、そのルールの範囲が現在の設定に適切だと言えます。
ルールの対象はサーバー名ではない
ドメインルールの照合対象はリクエスト先であり、Home に表示されるサーバーの名前ではありません。サーバー名を変更しても DOMAIN-SUFFIX の対象は変わりません。反対に、対象ドメインのルールを変更してもサーバーの認証情報は修正されません。同じ接続先が Proxy モードでは開けて Config モードでは開けない場合、すぐに Add Server の情報を再入力するのではなく、まず一致したポリシーと接続先を比較してください。2つの層の変更は分けて確認します。
既存のドメインルールは「完全一致の例外、明確なサフィックス、必要なキーワード」の順に整理し、それぞれの目的を記録すると確認しやすくなります。重複項目を削除する前にポリシーを比較してください。同じドメインでもポリシーが異なる場合、単純に統合できる重複ではありません。対象をブロックしたい場合はポリシーを REJECT に変更できますが、一致範囲の考え方は変わりません。詳しくはREJECT ルールとブロックの仕組みをご覧ください。
アドレスとリクエストの特徴:IP-CIDR、GEOIP、USER-AGENT
アドレスルールは、サービスのドメインが一定かどうかではなく、接続先アドレスやその地域情報をもとに判定します。プライベートネットワーク、既知のアドレス範囲、後続の広範な分類には適していますが、特定サイトのサービス全体を正確に表すものではありません。同じサービスが複数のアドレス範囲を使う場合があり、異なるサービスが同じインフラを共有することもあります。ある時点で確認したアドレスを特定サイトの恒久的な識別子とみなすと、実際の状態とルールが徐々にずれていきます。
IP-CIDR とプレフィックス長
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
IP-CIDR6,fc00::/7,DIRECT,no-resolve
FINAL,PROXY
CIDR はネットワークアドレスとプレフィックス長で表します。IPv4 の /32 は単一のアドレスを示し、プレフィックスが短いほど対象となるアドレス範囲は広くなります。192.168.0.0/16 は「最後の2つの部分が0のアドレスだけ」ではなく、プレフィックス全体の範囲を表します。上の例は、一般的なプライベートIPv4アドレスの範囲と IPv6 のユニークローカルアドレスの範囲を示しています。構文の例であり、すべてを追加すべきという意味ではありません。実際の接続先と現在のネットワークに応じて判断してください。
プライベートアドレスへの直接接続はポリシーを決めるだけで、存在しないローカルルートを作ったり、異なるネットワークで同じプライベートアドレスを自動的に相互接続したりするものではありません。別のネットワーク内にある接続先には、引き続き適切なネットワーク到達性が必要です。複数のネットワークが同じプライベートアドレスを使う場合、アドレスの意味が衝突することもあります。DIRECT に一致しても接続できない場合は、CIDR の範囲をむやみに広げるのではなく、接続中のネットワーク、接続先デバイスの稼働状況、ポートの開放状態を確認してください。
no-resolve の適用範囲
no-resolve は、そのアドレスルールとの照合だけを目的としたドメイン解決を避けるための指定です。リクエスト全体でDNSを使わないという意味でも、対象を直接接続に強制する設定でもありません。リクエストに使用可能な接続先アドレスがすでに含まれていれば、アドレスルールに一致する場合があります。ドメイン名だけがあり、有効なアドレス情報がない場合、このルールが名前解決を実行してから判定すると期待しないでください。デバッグでは、その時点でリクエストがどの情報を持っていたかを確認する必要があります。
no-resolve を追加するかどうかは、そのルールの役割によって決めます。明確なプライベートアドレスへの接続では、すべてのパブリックドメインに対して余分なアドレス照合を試みないほうが動作を説明しやすい場合があります。解決後のアドレスで分類する必要があるリクエストでは、このパラメーターを省略した場合の名前解決への依存を理解してください。すべてのルールの末尾に機械的に追加しないでください。DOMAIN や FINAL にアドレスルールのフィールド構成を流用することもできません。
GEOIP はアドレスの分類であり、サイトの所属を示すものではない
[Rule]
DOMAIN,api.example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
GEOIP,CN,DIRECT は、利用可能な接続先アドレスと地理情報データベースに基づいて判定します。ページ内の文字、ドメインのサフィックス、ユーザーの所在地は判定基準ではありません。中国語のページでもアドレスが CN に分類されるとは限らず、ほかの言語のページでも CN に分類される場合があります。CDN、アドレスの移転、データベースの違いも結果に影響します。そのため GEOIP は広範な分類ルールとして使い、明示的に処理する必要があるドメインの例外より後に配置してください。サイトがどの組織に属するかを証明するためのものではありません。
| タイプ | 判定基準 | 主な制限 |
|---|---|---|
IP-CIDR | IPv4 アドレスのプレフィックス | アドレス範囲はサイト全体の範囲を示すとは限りません |
IP-CIDR6 | IPv6 アドレスのプレフィックス | IPv4 ルールが IPv6 に自動適用されることはありません |
GEOIP | アドレスの地理的な分類 | 接続先アドレスとデータベース情報に左右されます |
USER-AGENT | 識別可能な User-Agent | リクエストの可視性と実際のフィールドに左右されます |
USER-AGENT は汎用的なアプリ選択機能ではない
[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY
USER-AGENT は、識別可能なリクエストに含まれる User-Agent フィールドを照合します。上の ExampleClient は説明用の文字列で、実在のアプリを示すものではありません。アプリ単位の振り分けと同じ機能ではありません。複数のリクエストで同じフィールドが使われることもあれば、同じアプリが異なるフィールドを送信することもあります。また、ルールで読み取れる情報がまったくない通信もあります。特に暗号化されたリクエストでは、クライアントがリクエストヘッダーを当然に確認できると想定しないでください。
USER-AGENT ルールに一致しない場合は、まずフィールドが参照可能か、実際の内容がパターンに合っているかを確認し、その後でルールの位置を調べます。ルールを機能させるために、不要な通信まで確認対象に広げないでください。暗号化されたコンテンツの処理に関わる場合は、許可、証明書の信頼、プライバシーへの影響を別途検討してください。本ページのアドレスとポリシーの例では、追加の暗号化コンテンツ処理を有効にする必要はありません。要件を明確なドメインで表現できる場合は、まずドメインルールで確認するのが適切です。
接続ポリシーと Global Routing の3つのモード
ルールは「どのリクエストがこの種類に当たるか」を示し、ポリシーは「該当するリクエストをどう処理するか」を示します。PROXY、DIRECT、REJECT はルールで使うポリシーキーワードです。一方、Global Routing の Config、Proxy、Direct は全体の動作モードです。関連する名称ですが、同じ階層のものではありません。トラブルシューティングでは、現在のモードと一致したポリシーの両方を記録してください。そうしないと、モードを切り替えた結果を、ルールが修正された結果と誤認する可能性があります。
PROXY、DIRECT、REJECT
PROXY は一致したリクエストをプロキシポリシーに渡す指定です。接続が確立するかどうかは、出口の選択、プロトコル設定、認証情報、現在のネットワークに左右されます。どの接続先にもアクセスできることを保証するものではなく、サーバーを自動生成することもありません。DIRECT は接続先に直接接続する指定ですが、通信は現在のデバイスが接続しているネットワークを通ります。REJECT は一致したリクエストを拒否する指定で、クライアントは対応するエラーとして接続を終了する場合があります。別のサーバーに転送する指定ではありません。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,local.example.com,DIRECT
DOMAIN,blocked.example.com,REJECT
FINAL,PROXY
3つの例はそれぞれプロキシ接続、直接接続、拒否を示し、ドメインは説明用です。api.example.com が PROXY に一致して接続に失敗した場合は、次に出口を確認します。クライアントが自動的に DIRECT に切り替えるとは限りません。blocked.example.com が REJECT に一致した場合、接続失敗はポリシーの結果です。それをサーバー障害の証拠とみなすことはできません。テストを始める前に、アクセスできること、指定した出口で接続すること、想定どおり拒否されることのどれを成功条件とするか明確にしてください。
Config、Proxy、Direct を比較する目的
| モード | 主な用途 | トラブルシューティングで確認する点 |
|---|---|---|
| 設定 / Config | 選択中の設定ファイルに従ってルールを適用 | ファイル、順序、一致したルールとポリシー |
| プロキシ / Proxy | プロキシ経路との比較に使用 | 選択した出口とサーバーの接続性 |
| 直接接続 / Direct | 現在のネットワーク経路との比較に使用 | ローカルネットワークと接続先への直接到達性 |
3つのモードはトラブルシューティングの考え方を示すもので、システム上のすべての通信が必ず同じように処理されるという意味ではありません。システム通信、設定内のバイパス項目、個別機能による制限がある場合もあります。比較テストは同じネットワーク環境で同じ対象に新しいリクエストを行い、実際の記録を確認してください。ステータスバーのアイコンや、あるページが開けることだけでは、すべてのリクエストがどの経路を通ったか判断できません。
Proxy では接続できるのに Config ではできない場合は、まず DIRECT、REJECT、またはより上にある別のルールが対象に適用されていないか確認し、次に正しい Config ファイルが選ばれているか確認します。Config と Proxy の両方で失敗する場合は、サーバーのアドレス、ポート、プロトコル、認証情報を確認します。既知の別の接続先も使って、出口全体の問題か特定の接続先だけの問題かを切り分けてください。Direct で接続できるのは、現在のネットワークに利用可能な経路があることを示すだけで、プロキシの設定が正しい証拠にはなりません。
選択中のサーバーとルールポリシーの関係
Home で選択したサーバー、設定ファイル内のポリシーグループ、ルールが参照するポリシー名は、同じ設定の中で確認する必要があります。単純な設定では PROXY を使って現在のプロキシポリシーに渡せます。複雑な設定で独自のポリシー名を参照する場合は、その名前が実際に存在し、有効なメンバーを指していることを確認してください。他人の設定ファイルにある独自の名称を汎用キーワードとみなしてコピーしたり、サーバーの表示名を変更すればすべての参照が自動的に有効になると思い込んだりしないでください。
プロトコルの設定はプロキシ接続の確立方法を決めるもので、ルールポリシーとは関連しますが別の層です。たとえば Trojan では、アドレス、ポート、パスワード、TLS 関連の項目を、手元にあるサーバー情報に従って設定する必要があります。ルールを DIRECT から PROXY に変更しても、認証情報の誤りは修正されません。各項目の設定範囲はTrojan パラメーターの説明を参照してください。トラブルシューティングでは、ルールとサーバーを別々に確認します。
REJECT だけでコンテンツフィルタリングに関するすべての要件を満たせるわけではありません。1つのドメインが必要な機能と拒否したいリクエストの両方を提供している場合、ドメイン全体を拒否するとログイン、読み込み、同期に影響することがあります。暗号化された通信では、ドメイン単位のルールだけで同じホスト内の異なるページパスを区別できるとは限りません。より細かい制御が必要な場合は、一致対象の情報が見えるか、機能上どのような境界があるかを確認してください。範囲の広いキーワードルールを次々に追加しないようにしましょう。
比較テストが終わったら、使用予定のモードに戻してもう一度テストしてください。接続確認のために Proxy を使ったまま Config に戻し忘れると、「ルールが効かない」と誤解しやすくなります。Direct での確認後に元へ戻し忘れた場合も、同じような誤判定が起きます。現在のモード、サーバー、ファイルを同じテスト記録にまとめておくと、背景の分からない成功スクリーンショットを大量に保存するより、後のメンテナンスに役立ちます。
ルールの優先順位と FINAL:最初に一致したルールで終了
Rule を読むときは、上から順に1行ずつ判定することが最も重要です。リクエストが適用可能なルールに一致すると、そのポリシーが使われ、それより「具体的な」ルールを探して下へ読み進むことはありません。DOMAIN が DOMAIN-SUFFIX より自動的に優先されたり、ルールタイプの名前だけでドメインルールがアドレスルールに優先されたりすることはありません。優先順位を決めるのは、まず設定ファイル内の位置です。この仕組みを理解するほうが、多くのルールキーワードを覚えるより設定ミスの防止に役立ちます。
例外は範囲の広いルールより前に置く
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
この例では、まず api.example.com に PROXY を適用する例外を設定し、次に同じドメイン配下のほかのリクエストを DIRECT に渡します。その後、プライベートアドレスと CN の分類を処理し、最後に PROXY を既定のルールとして適用します。各行にはそれぞれ役割があります。サフィックスルールを先頭に移動すると、api.example.com は先に DIRECT に一致し、後にある完全一致の例外は適用されません。行の間にコメントや空行を入れても、順序は変わりません。
「例外を先に置く」とは、すべての DOMAIN ルールをファイル全体の先頭に集めるという意味ではありません。同じ判定範囲では、対象の狭いルールを広いルールより前に置くということです。実際の設定では用途ごとにグループ分けできますが、グループをまたぐ重複も確認してください。前方にある DOMAIN-KEYWORD が、後続の複数のサービスドメインをすでに含んでいる場合があります。アドレス範囲のルールが、後で特別に処理したい接続先を含むこともあります。グループ見出しは人が読みやすくするためのもので、クライアントに新たな優先順位の階層を作るものではありません。
FINAL の構造と配置
[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
FINAL は、それ以前のルールに一致しなかったリクエストに適用する最後のルールです。タイプとポリシーだけを記述し、ドメインやアドレスのフィールドは不要です。通常は Rule の末尾に配置します。FINAL を途中に置くと、後続の通常ルールで残りのリクエストを処理できなくなります。ファイル内に FINAL が複数ある場合も、段階的に使う予備の出口とは考えないでください。最終的なポリシーを1つに定め、具体的な例外は前のルールで指定します。
FINAL,PROXY と FINAL,DIRECT は既定の動作が異なるため、どちらかが常に正しいとは言えません。前者は分類されなかったリクエストをプロキシポリシーに渡し、後者は直接接続します。どちらを選ぶかは、既定の経路をどうしたいか、前に置いた例外が十分かどうかで決まります。設定をコピーする場合は特に最後の行を確認してください。前のルールがほとんど同じでも、既定のポリシーを変えると、ルールに記載されていない多くの接続先で出口が変わることがあります。
手作業で判定してルールの重なりを見つける
ルールを確認するときは、代表的な接続先をいくつか選び、上から順に判定してください。完全一致の例外が最初の行に一致するか、同じドメイン配下の別ホストがサフィックスルールに一致するか、プライベートアドレスがアドレスルールに進むか、残りのリクエストが最終的に FINAL に到達するかを確認します。想定するポリシーだけでなく、どの行で判定が止まったかも記録してください。競合を見つけやすくなるだけでなく、一見正しいルールに一致記録が出ない理由も説明できます。
アドレスルールを判定に使う場合は、接続先アドレスがすでにあるか、no-resolve により該当行が名前解決を行わないかも記録します。アドレス情報のないドメイン名だけを机上で確認しても、GEOIP の実際の結果を正確に予測できません。ログが手作業での判定と異なる場合は、クライアントが認識した接続先情報を優先して確認し、その後で現在有効なファイルを調べます。アドレスルールを一致させるために、すべてのドメインルールを削除しないでください。
2つの設定ファイルを統合するときは、Rule の内容をそのまま連結しないでください。1つ目の FINAL によって、2つ目のルールがすべて適用されなくなる場合があります。範囲の広いキーワードが、2つ目にある例外より先に一致することもあります。まずセクションを分け、FINAL を取り除き、用途別に具体的なルールを統合してから、FINAL を1つだけ追加します。同じ対象でポリシーが異なる競合は手動で選択し、意味が同じことを確認してから完全一致の重複行を整理してください。
長いファイルをメンテナンスする場合は、ルールの追加を小さな変更としてローカルコピーに反映し、挿入位置、対象範囲、想定するポリシー、テスト結果を記録してください。しばらく運用してから同種の項目をまとめるようにすると、トラブルのたびに新しいルールを先頭へ積み上げずに済みます。ルールの順序は、理由を説明できる構成に保ちましょう。なぜその行がそこにあるのかを覚えているのが管理者本人だけでは、後の更新や障害からの復旧が難しくなります。
Host と URL Rewrite:アドレスのマッピングとリクエスト処理
Host、URL Rewrite、Rule は同じ設定ファイルに記述されることがありますが、同じ仕組みとして扱うことはできません。Host は指定したホスト名に静的なアドレスを割り当て、URL Rewrite は識別可能なURLと照合条件に応じて処理を実行し、Rule は接続ポリシーを選びます。それぞれ「アドレスの取得元」「リクエストの処理方法」「接続経路」を扱います。問題が複数の層に関係する場合は、それぞれが想定どおりか分けて確認してください。
Host:名前解決結果の固定は出口の指定ではない
[Host]
service.example.com = 192.0.2.10
ここでは service.example.com を説明用アドレス 192.0.2.10 に割り当てています。このアドレスは文書用に予約された例示アドレスであり、アクセス可能なサービスではありません。Host の行では等号を使い、Rule のようにカンマで区切りません。後ろに PROXY を追加してポリシーを指定することもできません。同じ接続先に特定の接続方法が必要な場合は、Rule に別途記述し、実際の接続記録でアドレスとポリシーの両方が想定どおり使われているか確認してください。
Host は接続先アドレスが明確で、維持管理できる場合に適しています。頻繁に変わるパブリックサービスのアドレスを安易に固定する用途には向きません。ドメインの背後では、地域別の振り分け、障害時の切り替え、アドレスのローテーションが行われることがあります。単一のアドレスに固定すると、こうした変更を無視し、時間がたつと機能しなくなる可能性があります。マッピングを追加するときは、目的、有効となる条件、削除方法を記録し、一度解決されたアドレスを恒久的な修正として使わないようにしましょう。
HTTPS リクエストでは、ドメイン名は証明書の検証やサービスの選択にも使われます。マッピングしたアドレスへの TCP 接続が確立しても、証明書、SNI、仮想ホストの設定が原因でサービス側がリクエストを拒否する場合があります。Host マッピングを行っても、任意のアドレスがそのドメインの有効な証明書を持つようになるわけではなく、サーバーの認証情報も変わりません。証明書エラーが発生した場合は、検証を無効にして済ませるのではなく、接続先サービスの設定を確認してください。
URL Rewrite:まず照合範囲を確認
[URL Rewrite]
^http://example\.com/old$ http://example.com/new 302
上の例は、HTTP の特定パスを対象にしたリダイレクトの例です。正規表現で旧アドレスを照合し、遷移先URLを指定します。302 は一時的なリダイレクトを表します。これはドメインの振り分けルールではなく、Rule セクションに記述するものではありません。ドメインの区切りを文字として表すため、ピリオドはバックスラッシュとピリオドで記述します。先頭と末尾のアンカーは範囲を限定し、より長いパスや追加文字まで誤って一致させないためのものです。
URL のクエリパラメーターも照合結果に影響します。上の例で末尾にドル記号を置いているため、追加のクエリ文字列があるアドレスは、指定した完全一致の範囲に入りません。クエリ文字列を許可するかどうかは、実際の要件に応じて式を設計し直してください。「すべて一致させる」ために境界をむやみに削除したり、広範なワイルドカードを追加したりしないでください。変更前に一致させる例と一致させない例を列挙して個別に確認すると、パス、パラメーター、エスケープの違いを見つけやすくなります。
HTTPS の可視性とループのリスク
ドメインを振り分けに使えることは、暗号化されたリクエストのパスやヘッダーまで見えることを意味しません。HTTPS ではパスが暗号化された内容に含まれるため、ドメインルールだけを根拠に URL Rewrite で処理できると判断しないでください。暗号化されたコンテンツをさらに処理する場合は、証明書の信頼、対象ドメイン、プライバシーへの影響を別途理解する必要があります。本ページの例で HTTP を使うのは、一見単純な書き換え例の中に、こうした追加の前提条件を隠さないためです。
書き換えルールによってリダイレクトループが発生することもあります。旧アドレスから新アドレスへ転送した後、別のルールが新アドレスを旧アドレスに戻すと、ブラウザーは再試行を繰り返すか、リダイレクト回数が多すぎるというエラーを表示します。転送先が元の照合式にも一致し、同じルールが繰り返し適用される場合もあります。テストでは最終ページだけでなく転送の連鎖を確認してください。各段階を説明できない場合は、式の範囲を絞り、重複するルールを一時的に無効にします。
Host を確認するときは既存の Rule を変更せず、接続先アドレスの参照元だけを比較します。URL Rewrite を確認するときは、まず明確な HTTP のテストURLでリダイレクトが機能することを確かめ、その後、転送先アドレスの振り分け結果を確認してください。3つのセクションを同時に変更すると、最終的に成功しても依存関係が分かりにくくなります。通常の業務リクエストをテストする場合は、元の設定ファイルのコピーを残し、ログイン後の遷移、フォーム送信、その他の状態を伴うリクエストにテストルールが影響しないようにしてください。
設定の配信元を更新した後は、Rule に変化がないかだけでなく、Host と URL Rewrite も確認してください。アドレスマッピングが古くなっていたり、サービスのパスが変更されていたり、以前必要だった書き換えが新しい動作と競合したりする場合があります。メンテナンス記録には、少なくとも対象、目的、削除条件を記載してください。出所や目的を説明できない項目は、長期間残すよりも、まずコピー上で無効にしてテストしてから削除を判断するほうが、影響を管理しやすくなります。
確認とメンテナンス:1つのリクエストから変更箇所を特定
設定確認の目的は「ファイルが完全に見える」ことを証明するのではなく、想定する各動作を実際のリクエストから説明できるようにすることです。有効なテストでは、現在のネットワーク、Global Routing のモード、Config ファイル、選択中のサーバー、対象ドメイン、確認できた結果を最低限記録します。これらの前提がない場合、同じページの表示が前後で異なる原因は、編集したルールではなくキャッシュ、既存の接続、ネットワークの変化、出口の切り替えかもしれません。
4つの層に分けて問題を絞り込む
第1層では、リクエストが現在のクライアントの処理対象に入っているかを確認します。接続が有効か、システムの許可があるか、正しいファイルを使用しているかを確かめてください。第2層では、ドメイン名やアドレスなど、接続先の情報が利用できるか確認します。第3層では、一致したルールとポリシーが想定どおりかを確かめます。第4層で初めて、該当する経路で接続できるかを調べます。この順で確認すれば、サーバーは正常なのに誤って REJECT に一致している状況で、サーバー情報を何度も入力し直すような手戻りを防げます。
Connectivity Test は接続条件の確認に役立ちますが、テストが成功しても実際の通信に必要な条件がすべて満たされているとは限りません。テスト方法によって対象やプロトコルが異なる場合があり、1つのページが複数のドメインにリクエストを送ることもあります。サイトに問題がある場合は、失敗した具体的なリクエストを1つ選び、ドメイン、アドレス、一致したルール、失敗した段階を確認してから、ページ全体の動作を調べてください。Data の統計は利用状況の確認には役立ちますが、特定のルールに一致したことを単独で証明するものではありません。
| 確認された状況 | 最初に確認する項目 | 次に行うこと |
|---|---|---|
| ルールに一致しない | 現在のファイル、モード、先行ルール | 実際のドメインを使って1行ずつ判定 |
| PROXY に一致しても失敗する | 選択した出口とサーバー設定 | 接続先を固定して Proxy モードと比較 |
| DIRECT に一致しても失敗する | 現在のネットワークと接続先への到達性 | 接続先アドレス、ポート、名前解決を確認 |
| 更新後だけ問題が発生 | ファイルの変更と出口の選択 | 更新前のコピーと項目ごとに比較 |
元に戻せる最小限の変更を行う
一度に変更するのはルール1つ、または関連する設定1つに絞り、変更前後の内容を保存してください。テスト結果が変わらない場合は、リクエストが再確立されたか、より前のルールに一致していないかを確認してから、変更を戻すか調査を続けるか決めます。効果のなかった例外を残したまま次々に追加しないでください。次のテストで確認する変数が増えてしまいます。設定ファイルが長い場合は、コピー上に必要な General と少数の Rule だけを残し、問題を再現できる最小の状態を作ります。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN,api.example.com,PROXY
FINAL,DIRECT
この診断用の例では、1つのサンプルドメインを PROXY に渡し、それ以外は DIRECT にすることで、確認対象を絞っています。長期利用向けの汎用設定ではありません。適用する前に、既定のポリシーを変更するとほかのリクエストにも影響することを理解してください。想定どおりの結果が得られたら、元の設定から関連するルールをグループごとに戻し、どのグループで一致結果が変わったか特定します。それでも失敗する場合は、照合範囲を広げるのではなく、ドメイン情報、プロキシ出口、接続先サービスを引き続き確認してください。
更新、バックアップ、機密情報の取り扱い
設定のバックアップとサーバーのサブスクリプション情報は、分けて保存してください。ファイルによっては、サーバー情報、認証情報、個人を特定できる情報を含むリンクが記載されています。主な内容がルールに見える場合でも、共有前に全体を確認しましょう。トラブルシューティング用の資料を共有する場合は、セクション名、ルールタイプ、フィールド構成、順序を保ち、必要に応じて実際のドメインを example.com に置き換えます。アカウント情報とサブスクリプション情報は削除してください。スクリーンショットの一部だけを隠し、ほかの識別可能な項目を見落とさないようにしましょう。
アプリのアップデートは App Store から行います。アプリの入手方法と正規版の確認は正規版の確認方法をご覧ください。設定ファイルの更新方法は、実際に利用しているファイルの配信元によって異なります。この2種類の更新を混同しないでください。アプリの更新後に初めてアクセスに失敗したからといって、ルール構文が変わったと判断するのも避けましょう。まずファイル、モード、サーバー、ネットワークを確認し、個々の設定項目がアプリ内の説明に沿っているかを調べてください。
サービス提供元のサブスクリプションを使用している場合は、更新の前後でサーバー項目の名前や設定値が変わっていないか、以前の選択が引き続き有効かを確認します。個別の共有リンクとサブスクリプションリンクは用途が異なります。読み込んだ項目がどちらか分からない場合は、共有リンクとサブスクリプションリンクの違いをご覧ください。本ページでは手元にある情報の使い方を説明しています。サーバー情報とサブスクリプションは、ご利用のサービス提供元から入手してください。
最後に回帰テストを行います。完全一致の例外、ドメインサフィックス、プライベートアドレス、FINAL から代表的な接続先を1つずつ選び、適用されるポリシーを確認してください。Host または URL Rewrite を使用している場合は、マッピングとリダイレクトの連鎖もそれぞれ確認します。テスト後は使用予定の Global Routing に戻し、元に戻せるコピーを保管してください。よくある接続の問題は使い方ガイド、通信量の読み方はData の通信量統計ガイドをご覧ください。再現可能なリクエストと明確な変更記録に基づくメンテナンスは、ルールを増やし続けるより効果的です。