Config / Rule · 公式マニュアル

Shadowrocket ルール・設定リファレンス

設定セクションごとに構文を、照合順序から結果を確認できます。自身のサブスクリプションまたはサーバー情報をお持ちで、通信の振り分けを確認したい iPhone / iPad ユーザー向けです。

初回の読み込みと接続については、まずクイックスタートガイドをご覧ください。このページでは接続後の設定を確認します。初回インストールの手順は扱いません。クライアントは買い切り型で、回線プランとは別です。当サイトではノードやサブスクリプションの提供・販売・推奨は行っていません。

  • 設定セクションとパラメータ
  • ルールの種類とポリシー
  • 順序と検証

01 / CONFIG STRUCTURE

設定ファイルの構造:サーバー情報と動作ルールを区別する

Shadowrocketでは、サーバー情報は「どのサーバーを経由して接続するか」を決め、設定ファイルは「各リクエストをどのように処理するか」を定めます。両者は関連しますが、同じものではありません。手持ちのサブスクリプションは通常、サーバー項目の読み込みや更新に使用します。通信を振り分けるルールを含む設定ファイルは、Configで内容を確認して有効にする必要があります。Homeにサーバーが表示されていても、カスタムルールが有効とは限りません。設定を読む前に、現在選択しているサーバー、有効な設定ファイル、Global Routingの状態を記録してください。以降の確認条件をそろえられます。

4つの設定セクションの役割

一般的なテキスト形式の設定ファイルでは、角括弧でセクション名を示します。[General]にはDNSやシステム通信に関する設定など、全般的なパラメータを記述します。[Rule]にはリクエストの照合条件と対応するポリシーを記述します。[Host]には指定したドメインのアドレス対応を記述します。[URL Rewrite]では、式に一致するURLを処理します。セクション名は単なる見出しではありません。行が属するセクションによって解釈が変わります。ドメインルールをGeneralに貼り付けても、行の構文が正しくてもRuleのルールとしては機能しません。

[General]
bypass-system = true
dns-server = system

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT
FINAL,PROXY

[Host]
localhost = 127.0.0.1

[URL Rewrite]
^http://example\.com/ https://example.com/ 302

この例は設定ファイルの構造を確認するためのもので、すべての環境に適用できる汎用設定ではありません。Generalの2行は、真偽値パラメータとDNSの値をそれぞれ示します。Ruleの3行はドメイン、アドレス範囲、最終ポリシーを示します。Hostのlocalhostはローカルループバック名の例で、最後の行はHTTPからHTTPSへのリダイレクトを示します。例のドメインは実際のサービスを表すものではありません。コピーする前に目的を明確にしてください。特にFINALの値は、他のルールに一致しなかったすべてのリクエストに影響します。例がPROXYだからといって、そのまま使わないでください。

句読点、段落、読みやすさ

ルールのフィールドは半角カンマ、パラメータの代入には半角イコール、セクション名には半角の角括弧を使います。日本語入力で全角のカンマ、引用符、空白が入力されると、意図どおりに解析されないことがあります。各ルールは1行ずつ記述してください。ページ上の折り返しを新しいルールと間違えないようにしましょう。読むときは「キーワード、照合値、ポリシー、任意のパラメータ」の順に分けて確認できますが、すべてのキーワードでフィールド数が同じとは限りません。FINALには照合値がないため、機械的に3列にしないでください。

設定セクションの並びを、固定された処理手順と考えてはいけません。ファイル内でGeneralがRuleより上にあっても、各リクエストがすべての全般パラメータを処理してから他のセクションを順に実行するわけではありません。HostやURL Rewriteも、Ruleの後に続くルールではありません。上から順に読む必要があるのは、Rule内の照合順序です。設定ファイルの構造とルールの優先順位を分けて考えれば、設定セクション全体を移動して「ルールの優先順位を上げる」といった効果のない変更を避けられます。

Configで有効な設定を確認する

Configを開いたら、まず現在選択されているファイルを確認し、読みたいファイルや編集対象を開きます。コピーを編集する場合は、用途が分かる名前を付け、元のファイルを残してください。編集内容の保存とファイルの有効化は別々に確認する必要があります。保存しただけでは、そのファイルが現在の接続に使われているとは限りません。ファイル一覧に戻って選択状態を確認し、Global Routingも確認します。画面上の項目の位置はアプリの変更に伴って変わることがあります。固定の画面位置ではなく、ファイル名、選択状態、実際のリクエスト結果を判断材料にしてください。

アプリの正規性を確認できない場合は、まず正規アプリの確認方法を参考に、デベロッパ名のShadow Launch Technology Limited、公式アイコン、アプリID 932747118を確認してください。ShadowrocketはAppleプラットフォーム向けの有料クライアントです。入手先はApp Storeのみです。システム要件はApp Storeのページに記載された内容をご確認ください。基本環境を確認してから、このページの部分的な設定例を目的に合わせて編集するほうが、サーバーと設定を同時に変更するより原因を特定しやすくなります。

02 / GENERAL

General と DNS:名前解決と通信の振り分けは別の設定

Generalでは全般的な動作を設定しますが、「全般的なパラメータ」はGlobal RoutingのProxyと同じ意味ではありません。前者は設定が適用される範囲を示し、後者は接続に使用するルーティングモードを示します。設定を読むときは、この2つを分けて考えてください。たとえばdns-serverを変更するのはドメイン名の解決設定を変更することであり、すべてのリクエストが自動的にPROXYになるわけではありません。反対に、Global RoutingをProxyに変更しても、すべてのDNSクエリが特定のサーバーを使うとは限りません。

Generalの基本的なパラメータを理解する

[General]
bypass-system = true
dns-server = system

1行目はシステム関連の通信をバイパスする設定を有効にし、2行目はシステムDNSを使用します。trueは真偽値、systemはパラメータの値であり、置き換えるサーバー名ではありません。システム関連の通信の処理は、OSのネットワーク動作や他の設定にも左右されます。そのため、bypass-systemを「すべてのAppleサービスが特定のポリシーで処理される」と解釈しないでください。特定のドメインを調べる場合は、実際のリクエスト記録も確認しましょう。パラメータ名だけを見てリクエストが必ずバイパスされると判断すると、実際に照合されたルールを見落とすことがあります。

dns-serverとHostの用途も異なります。前者は名前解決に使用する設定を決め、後者は特定の名前にアドレスを割り当てます。Hostにドメインのアドレスが指定されている場合、DNSを変更してもその名前の解決結果は変わらないことがあります。調査前に同じ名前のHost項目を探し、キャッシュと新しいリクエストを確認してください。システム、アプリ、リモート側でそれぞれ異なるキャッシュが保持される場合があります。DNSを一度切り替えた直後に同じページを再読み込みするだけでは、新しい設定が有効かどうかは判断できません。

名前解決の失敗と接続の失敗を区別する

ドメインにアクセスすると、通常はまずアドレスを取得し、その後に接続するなど複数の段階があります。ドメインを解決できない場合、ルールが想定したIP情報を得られないことがあります。名前解決が完了していても、その後の接続、TLS、リモート側の応答で失敗する可能性があります。したがって「ページが開かない」はDNSエラーと同じ意味ではありません。まず解決結果があるかを確認し、次にリクエストで使われたポリシーとサーバーを確認してください。同じ条件で他のドメインにはアクセスでき、特定のサイトだけ失敗するなら、そのサイトのルール、アドレス、接続結果を優先して比較します。

混同しやすい3つの設定レイヤー
設定項目主な役割これだけでは判断できないこと
dns-serverDNS関連の値を指定するすべての通信リクエストがPROXYを使う
[Host]名前とアドレスの対応を指定する接続時に有効な証明書が自動的に得られる
[Rule]リクエストを照合し、ポリシーを選択する接続先に必ずアクセスできる

DNSを変更する必要があるのはどんなときか

現象が名前解決の段階にあると分かった場合に限り、DNS設定の変更を検討してください。たとえば、同じドメインでもネットワークによって解決結果が異なる場合や、リクエスト記録で名前解決が完了していないと分かる場合です。変更前に現在の値とテスト時のネットワークを記録し、変更後は同じ接続先に再度アクセスしてください。DNS、Global Routing、サーバーを同時に変更しないでください。アクセスが回復しても、何が効果をもたらしたのか分からなくなります。設定は、一度だけ偶然うまくいった組み合わせではなく、結果を説明できるものであるべきです。

暗号化DNSを使う場合は、そのサービスのアドレス自体にどう接続するかも考慮してください。名前解決サービスのアドレスを設定できても、現在のネットワークから接続できるとは限りません。サービスへの接続条件が満たされていない場合、ドメインルールではこの前提条件を補えません。この記事では、そのまま置き換えて使える公開DNSサービスの一覧は提供しません。この種の情報を入力する場合は、自分で利用可能と確認した情報を使い、アプリに現在表示されているパラメータ形式に従ってください。異なるプロトコルのアドレス書式を混用しないでください。

IPv4とIPv6にも注意してください。1つのドメインから両方のアドレスが返される場合があり、片方だけを確認すると実際の接続経路を見落とすことがあります。IPv4ルールに一致しない場合は、すぐにルール範囲を広げるのではなく、リクエストがIPv6を使っていないか確認してください。DNSの設定、返されるアドレス、アドレスルールをあわせて確認しましょう。名前解決の詳しい説明はDNS設定ガイドをご覧ください。このページでは、まず失敗が起きている段階を特定してからGeneralを変更することを重視します。

03 / DOMAIN MATCHING

ドメインルール:完全一致、サフィックス、キーワード

安定したドメイン名で振り分け先を指定できる場合は、まずドメインルールを検討してください。アドレスを直接列挙するより「特定のサイトやサービス」という意図を反映しやすく、サーバーアドレスの変更にも左右されにくくなります。ただし、ドメイン名は完全なURLではありません。DOMAINの照合値にプロトコル、パス、クエリパラメータ、ポートを貼り付けないでください。ブラウザーのアドレス欄にある完全なURLからホスト名を取り出し、その名前だけを対象にするのか、配下のすべてのサブドメインも含めるのかを判断します。

DOMAIN:指定した名前だけに一致

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,account.example.com,DIRECT
FINAL,PROXY

1行目はapi.example.com、2行目はaccount.example.comを対象にしています。DOMAINは「この語句を含む」という条件ではなく、他のサブドメインも自動的に対象にしません。実際のリクエストがimages.api.example.comの場合、同じサービスに属しているように見えても、1行目に一致するとは限りません。DOMAINによる完全一致は、少数の明確な例外に適しています。たとえば、大半のリクエストには最終ポリシーを適用し、特定のホスト名だけDIRECTにするケースです。使用前に実際のリクエストから完全な名前を確認し、ページに表示されたブランド名をホスト名と取り違えないようにしてください。

DOMAIN-SUFFIX:ドメイン境界に沿ってサフィックスに一致

[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

DOMAIN-SUFFIX,example.comはexample.comとそのサブドメイン(www.example.comなど)に一致します。ドメインの境界に沿って判定するため、任意の文字列の末尾を比較する条件ではありません。したがって、notexample.comは通常このサフィックスの対象にはなりません。上の例ではprivate.example.comへの完全一致の例外を、広いサフィックスより前に置いています。この2行を逆にすると、サフィックスが先に一致して例外の完全一致ルールが期待どおりに機能しなくなります。ルールの行数より、どの範囲が他のルールを覆うかに注目してください。

サフィックスには通常、アスタリスクを付ける必要はありません。*.example.comをDOMAIN-SUFFIXの標準値として使うと、ワイルドカード式とサフィックス照合という異なる仕組みを混同することになります。また、画像用ドメインを対象にするために、短い汎用サフィックスまで範囲を広げないでください。範囲が広いほど、関係のないサービスまで含める可能性が高くなります。まず実際のサービスで使われている登録ドメインを基準にし、すべてのリクエストが同じサフィックスを使うと決めつけず、リクエスト記録に基づいて個別のドメインを追加してください。

DOMAIN-KEYWORD:範囲が広く、誤一致もしやすい

[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT

DOMAIN-KEYWORDはドメイン名に含まれるキーワードに一致します。ここでのexampleは完全なドメインではなく、DOMAIN-SUFFIXのようなドメイン境界の条件もありません。そのため、関係のない名前に一致する可能性があります。広い条件が必要で、影響範囲を確認できる場合に限って使用してください。対象がexample.comとそのサブドメインだけなら、通常はサフィックスルールのほうが意図に合います。ルールが短いからといって正確とは限らず、キーワードが少なくても管理しやすくなるとは限りません。

同じ対象に使える3つの照合範囲
キーワード例用途
DOMAINapi.example.com特定の1つの名前に例外を設定する
DOMAIN-SUFFIXexample.comルートドメインとサブドメインを対象にする
DOMAIN-KEYWORDexample名前に含まれる文字列で照合する

ページのドメインがすべてのリクエストのドメインとは限らない

1つのページから、ログイン、画像、API、静的リソース用のドメインにそれぞれリクエストを送信する場合があります。トップページは開いてもログインできない場合、同じルールの動作が不安定なのではなく、別のリクエストに異なるポリシーが適用されている可能性があります。操作中にリクエスト記録を確認し、実際に失敗した名前を特定してからルールを追加してください。サードパーティのリソース用ドメインは複数のサービスで共有されることがあります。あるページに表示されたからといって、そのドメインへのすべてのアクセスに同じポリシーを適用するべきだとは限りません。

リクエスト記録にIPアドレスしかなく、照合に使えるドメイン情報がない場合、ドメインルールは適切な確認箇所ではない可能性があります。その場合は、アドレスルール、DNS、リクエストの発生方法を確認してください。似たドメインルールを増やすだけでは解決しません。国際化ドメイン名や特殊な形式の名前についても、実際の記録に表示された形式を基準にしてください。変更後は、対象の名前と、似ているものの一致してはいけない名前をテストします。必要な範囲をカバーし、境界外の対象まで含めていないことを確認できます。

04 / ADDRESS AND REQUEST

IP-CIDR、GEOIP、USER-AGENTの適用範囲

アドレスルールはネットワーク範囲を表すもので、ドメインルールの代わりにはなりません。同じドメインが複数のアドレスに解決されることも、同じアドレスで複数のドメインが提供されることもあります。両者は異なる対象を表します。「特定のドメインにアクセスするときはPROXYを使う」なら、まずドメインルールを検討してください。「このLANの範囲にアクセスするときはDIRECTを使う」なら、アドレスルールが分かりやすいでしょう。アドレスルールに一致する理由、または一致すべきでない理由を判断するには、接続先のアドレスとネットワーク範囲を確認する必要があります。

IP-CIDR:アドレスとプレフィックス長をあわせて確認

[Rule]
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
FINAL,PROXY

各行の2番目のフィールドは、ネットワークアドレスとスラッシュ以降のプレフィックス長で構成されます。192.168.0.0/16はアドレス範囲を示し、192.168.0.0の1台だけに一致するわけではありません。10.0.0.0/8と172.16.0.0/12も、それぞれプライベートアドレス範囲を示します。これらをDIRECTにするのは、LANアクセスでよくある意図を示した例であり、実際のすべてのネットワークで使われる範囲ではありません。ルーター、デバイス、内部サービスの実際のアドレスを確認してから、該当する範囲を残す必要があるか判断してください。

プレフィックスが短いほど、通常は対象範囲が広くなります。1台のデバイスだけを指定するつもりで広いネットワーク範囲を設定すると、他の接続先まで一致します。調査時は、アドレスがそのネットワークに属しているか、サブネットマスクが想定どおりか、ルールがより広い条件より前にあるかを確認してください。ドメインの名前解決で得たパブリックIPを、そのサービス全体の恒久的な範囲として扱わないでください。アドレスは変わることがあり、特定の時点で割り当てられた近接サーバーのアドレスにすぎない場合もあります。一時的なアドレスルールで仮説を検証できても、長期運用に適するとは限りません。

IP-CIDR6とno-resolve

[Rule]
IP-CIDR6,fc00::/7,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY

IP-CIDR6はIPv6アドレス範囲に使用します。上の例はローカル用途のアドレス範囲を示しています。IPv4ルールがIPv6にも自動的に適用されるわけではありません。デュアルスタックの接続先では、実際に使用されているアドレスファミリーをまず確認してください。任意パラメータのno-resolveは、このIPルールのために追加のドメイン解決を行わない意図を示します。グローバルDNSを無効にする設定ではなく、リクエストで名前解決が一切発生しないことを保証するものでもありません。リクエストにすでにアドレスが含まれていれば、アドレス照合に使われることがあります。使用前に、どの段階の名前解決を避けたいのか理解してください。

GEOIP:アドレスの地域分類に基づく条件で、ユーザーの位置を示すものではない

[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY

GEOIP,CNは接続先IPの地域分類に基づいて一致します。ユーザーの現在地を読み取る条件ではなく、ページの言語からサイトの地域を判断するものでもありません。分類結果はアプリが使用するデータに依存するため、関連するすべてのドメインに同じポリシーが適用されるとは限りません。サービスは分散型のインフラを使用することがあり、実際のアドレスとサービスの所在地は一致しない場合があります。特定のドメインに決まったポリシーを適用したいなら、アドレスの地域分類に頼るより、ドメインルールで明示するほうが意図を表しやすくなります。そのルールは、より広い条件より前に配置してください。

GEOIPとドメインルールが併用されている場合、「条件に一致すること」と「最終的に適用されること」を区別してください。上にあるドメインルールに一致したリクエストは、通常、それより下のGEOIPポリシーには進みません。ドメインルールに一致しなければ、その後の条件としてアドレスの地域分類が使われることがあります。ある接続先にDIRECTが適用されない場合は、地域データの誤りと決めつけず、先行するルールを確認してください。アドレスの地域分類は設定の一条件であり、全体の順序から切り離して接続結果を説明することはできません。

USER-AGENT:すべてのリクエストを識別できるとは限らない

[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY

USER-AGENTは取得できるリクエスト識別情報に基づいて照合します。上の例はワイルドカードを含むパターンです。アプリのアイコンや名前で通信を選ぶ条件ではなく、特定のアプリのすべての接続に適用できる保証もありません。特に復号していないHTTPS通信では、通常、リクエストヘッダーをこの種の判定に直接使うことはできません。例の確認のために復号を有効にする必要はありません。このページの例は、そのような設定に依存しません。実際のリクエストに照合可能な情報がある場合に限り、USER-AGENTを利用できる条件として扱ってください。

05 / POLICY

Global RoutingとPROXY、DIRECT、REJECT

Global RoutingのConfig、Proxy、Directはモードの選択肢です。一方、Rule内のPROXY、DIRECT、REJECTはルールの処理ポリシーです。似た語句ですが、階層が異なります。ルールが有効かどうかを確認するときは、まずGlobal Routingを確認してください。Config以外のモードでは、Ruleを変更しても接続結果が変わるとは限りません。ProxyやDirectに一時的に切り替えてテストした場合は、カスタムルールを検証する前に元のモードへ戻してください。

Global Routingの3つのモードを確認するポイント
画面上の表示説明確認する内容
ConfigConfig有効な設定ファイルとRuleを確認する
ProxyProxyプロキシ経由の接続経路と比較する
DirectDirect現在のネットワークで直接接続した場合と比較する

PROXY:プロキシ経由を選択するが、接続先への到達を保証するものではない

ルールポリシーのPROXYは、現在選択されているプロキシ経由で接続する意図を示します。サーバーアドレスそのものではなく、サーバーに必要な認証情報やプロトコルパラメータを補うものでもありません。手持ちのサーバー情報で、アドレス、ポート、認証情報、その他の設定に誤りがあれば、ルールが正しくPROXYに一致しても接続に失敗することがあります。そこで、リクエストが意図したポリシーを選んだことと、そのポリシーで使う接続経路が利用可能であることを別々に確認してください。この2つをまとめて「ルールが効かない」と判断すると、調査の方向を誤ることがあります。

Homeで選択しているサーバーも記録してください。同じ設定ファイルを使っていても、サーバーを変えると結果が異なることがあります。これはRuleの構文が変わったことを意味しません。カスタムポリシーやグループを使う場合は、その名前と実際の参照先を確認し、定義されていない名前を例に書かないでください。この記事では、追加のグループ定義に依存しないよう、3つの組み込みポリシーを使っています。Trojanのパラメータを詳しく確認する場合は、Trojanパラメータの解説をご覧ください。プロトコルのパラメータを直すためにドメインルールを変更しないでください。

DIRECT:現在のネットワークから直接接続する

DIRECTはShadowrocketの停止や、OSのVPN設定の無効化を意味しません。現在の処理で接続先への直接接続を選択します。接続先に到達できるかどうかは、現在のネットワーク、名前解決の結果、サービス自体の状態に左右されます。LAN内の接続先にDIRECTを使うのは意図に合うことが多いものの、デバイスが該当するネットワークに接続されている必要があります。デバイスが同じネットワーク上にない場合や、LAN内のサービスが該当アドレスで待ち受けていない場合、DIRECTルールで元々存在しない接続性を作ることはできません。

REJECT:一致したリクエストを明示的に拒否する

[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

1行目は指定した名前への接続を拒否し、2行目は残りのサフィックスに一致するリクエストにPROXYを適用します。最後に、それ以外の通信を処理します。REJECTは接続させたくない対象を明確に指定するためのもので、決めかねている最終ポリシーの代わりにはなりません。拒否する名前がログイン、認証、コンテンツ読み込みにも使われていると、ページの一部が正常に動作しなくなることがあります。変更前にその名前の用途を確認し、変更後はトップページが表示されるかだけでなく、重要な操作も確認してください。

拒否ポリシーを設定しても、ページ上の特定コンテンツだけを確実に消せるとは限りません。ウェブページの表示要素とネットワークリクエストは1対1で対応せず、1つのドメインが複数の機能を担うこともあります。特定のリソースを遮断するために範囲が広すぎるサフィックスやキーワードのルールを使うと、正常なリクエストにも影響しやすくなります。対象を限定して始め、リクエスト記録で条件を確認してから範囲を広げるか検討してください。新たな問題が起きたら、例外を重ねて元の誤りを分かりにくくする前に、追加した拒否ルールを元に戻してください。

FINAL:他のルールに一致しないリクエストの行き先を指定する

FINALは照合値を持たない最終ルールで、一般的な書式はFINAL,PROXYまたはFINAL,DIRECTです。グローバルモードとは別の概念で、Configのルールとして、前のルールに一致しなかったリクエストだけを処理します。どちらのポリシーを選ぶかは、想定するデフォルトの動作によって異なります。どのユーザーにも正しい値があるわけではありません。PROXYを使う場合は、手元のサーバーが利用可能であることを確認してください。DIRECTを使う場合は、ルールに記載されていない接続先が直接接続されることを理解してください。

3つのモードで現象が異なる場合は、すぐに結論を出さず、違いを記録してください。Directで接続できてProxyで失敗するなら、サーバーへの経路を調べる必要があるかもしれません。Proxyでは接続できてConfigで失敗するなら、一致したポリシーや他の設定を確認します。どのモードでも失敗する場合は、接続先や現在のネットワークに問題がある可能性もあります。具体的な判断には接続記録も必要です。モード切り替えの結果だけで他の原因をすべて排除することはできません。

06 / FIRST MATCH

照合順序と優先順位:最も具体的なルールが自動で選ばれるわけではない

Ruleは上から順に確認し、最初に一致したルールが処理を決めるのが基本です。DOMAINがDOMAIN-SUFFIXより必ず優先される、あるいはアドレスルールは自動的にドメインルールの後に来る、と考えてはいけません。キーワードは照合条件を示すだけで、用途に応じた優先順位を設定してくれるわけではありません。管理しやすい構成にするには、明確な例外を先に置き、次に広いドメイン範囲、その後にアドレス範囲と地域条件を並べ、最後にFINALを置く方法があります。これは整理方法であり、アプリが自動的に適用する並べ替えではありません。

反例を使って、後続ルールが無効になる状況を確認する

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN,private.example.com,DIRECT
FINAL,DIRECT

private.example.comは最初の2行の両方の条件に一致しますが、最初の行ですでに処理されるため、下のDIRECT例外は期待どおりに機能しません。2行目を長くしたり、末尾で同じルールを繰り返したりしても、優先順位は上がりません。狭い範囲の例外を先に確認するよう、相対的な順序を変更してください。実際の調査では、追加した行だけを検索するより、ファイルの先頭から対象を覆う可能性のある最初の条件を探すほうが効果的です。

[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

順序を修正すると、private.example.comは先に完全一致ルールに一致し、example.comに属する他の名前はサフィックスルールに一致します。残りのリクエストにはFINALが適用されます。この結果は順序と条件の組み合わせによるもので、DOMAINに固定された最優先順位があるからではありません。今後、上部にprivateを対象とするDOMAIN-KEYWORDを追加すれば、結果が変わる可能性があります。広い条件を追加するたびに、新しいルールだけでなく、前後にある例外も確認してください。

FINALを末尾に置く理由

FINALには、さらに照合するドメインやアドレスの条件がありません。前のルールに一致しなかった場合の処理を示します。他のルールより前に置くと、後続のルールが通常どおり照合されなくなります。長い設定ファイルでは、FINALが複数ないか特に確認してください。異なる断片をつないだファイルでは、途中に最終ルールが含まれていることがあります。各断片の元の範囲を確認してから統合してください。Ruleのリスト全体を単純に連結するのは避けましょう。

重複するアドレス範囲や名前解決の条件も順序を確認する

アドレスルールにも包含関係があります。広いネットワーク範囲が狭い範囲を覆うことがあり、地域条件が特定の接続先アドレスに一致する場合もあります。個別の範囲に例外を設ける場合は、広い条件より前に配置してください。また、ドメインのリクエストがアドレスルールに一致できるかどうかは、接続先アドレスがすでにあるか、照合のための名前解決が許可されているかなどにも左右されます。アドレスが数値上ある範囲に属しているだけでは、すべての照合結果を説明できません。ルールの順序と、その時点で利用可能な情報をあわせて確認してください。

Hostによるアドレスの変更を、Ruleの順序変更と混同しないでください。HostやDNSによって後続の処理で使えるアドレスが変わり、Ruleのアドレス条件はその情報を使って判定します。同様に、URL Rewriteはドメインルールの優先順位を自動的に上げる機能ではありません。他の設定セクションはリクエストの環境に影響しますが、Rule内の順序は独立して確認する必要があります。原因を混同しないよう、「条件に使う情報が変わった」のか「ルールの位置が変わった」のかを分けて記録してください。

一致マトリクスで境界を検証する

上記の修正例で想定される結果
テスト対象一致するルール想定ポリシー
private.example.com完全一致の例外DIRECT
www.example.comドメインサフィックスPROXY
example.netFINALDIRECT

テスト対象には、明確に一致すべきもの、隣接する範囲にあるもの、一致してはいけないものを含めてください。前者だけをテストすると、広すぎるルールの影響を見落とすことがあります。例のドメインはマトリクスの説明用です。実際のテストでは、自分で確認できる対象に置き換え、リクエストのドメイン、アドレス、適用されたポリシーを記録してください。対象が既存の接続を再利用している場合、新しいルールが新規接続の判定にまだ使われていないことがあります。保存して有効化した後、新しいリクエストを発生させてください。

リモートから取得した設定や長い設定を確認する場合は、まずコピー上で最小の反例を作成します。対象に関係する少数のルールとFINALだけを残して順序を検証し、修正を完全な設定ファイルに反映してください。最小の反例は長期運用の設定の代わりではなく、「どの包含関係が問題を起こしたのか」を示すためのものです。2、3行で問題を安定して再現できれば、ルールを追加しながら試行錯誤する必要がなくなり、その後の管理も容易になります。

07 / HOST AND URL REWRITE

Host と URL Rewrite:アドレスの割り当てとURLの書き換え

Hostは名前とアドレスの対応を扱い、URL Rewriteは式に一致するURLを処理します。どちらもPROXYやDIRECTを選択する機能ではありません。アクセスに失敗したときは、まず何を変更したいのかを明確にしてください。同じドメインを別のアドレスに解決したいのか、古いURLから新しいURLへ転送したいのか、それとも別の接続経路を使いたいのかを確認します。最初の2つはこの章に関係する可能性がありますが、3つ目はRuleで設定します。通信を振り分けるためにHostを変更すると、アドレスや証明書の問題を招くことがあります。

Hostの最小例と適用範囲

[Host]
localhost = 127.0.0.1

左側が名前、右側がアドレスです。localhostと127.0.0.1はローカルループバックの例です。ここでいう「ローカル」は接続を開始するデバイス自身を指し、ルーターや選択中のプロキシサーバーではありません。リモートサーバーにアクセスする業務で、このアドレスを使わないでください。対応を記述してもアドレス情報が提供されるだけで、そのアドレス上で必要なサービスが自動的に起動するわけではありません。対象ポートで待ち受けていない、ネットワークに到達できない、サービス設定が合っていない場合は、名前とアドレスが対応していても接続に失敗することがあります。

実際のドメインにアドレスを固定する前に、アドレスの管理者、安定性、その方法でアクセスしてよいかを確認してください。多くのサービスは地域や負荷に応じてアドレスを動的に返すため、結果の1つを固定すると元の振り分けが機能しなくなることがあります。対応を記述すると通常のDNSの変化が見えなくなり、後で調査するときに、名前解決サービスが常に古いアドレスを返していると誤解する場合もあります。Hostは明確で管理可能な対応関係に適しており、一時的に得られた解決結果を期限なく保存する用途には向きません。

HostはTLS証明書の検証を代替しない

HTTPS接続では、リクエストのドメイン名と証明書などの条件も関係します。ドメインを特定のアドレスに割り当てても、そのアドレスがドメイン名に合ったサービスを提供するとは限らず、証明書名の不一致が自動的に解決するわけでもありません。TLSエラーが発生した場合は、接続先の名前とアドレス、サーバー側の設定を確認してください。検証を無効にすることを通常の解決方法にしないでください。テスト後に対応が不要になった場合は削除し、新たに接続するときに実際のアドレスを確認して、古い設定が他の調査に影響しないようにしましょう。

URL Rewriteを構成する3つの要素

[URL Rewrite]
^http://example\.com/ https://example.com/ 302

この行には、照合式、置換先、リダイレクトのステータスコードがこの順で含まれています。先頭の^は文字列の先頭から照合することを示します。exampleの後ろのバックスラッシュは、ピリオドを通常の文字として扱うためのものです。省略すると、正規表現のピリオドは通常、任意の1文字を表し、照合範囲が広がります。末尾のスラッシュも条件の一部です。ここでは一時的なリダイレクトとして302を使っていますが、これですべてのHTTPアクセスが修復されるわけではありません。また、元のURLのパスやクエリパラメータが自動的に保持されるとも限りません。

例の置換先は固定URLで、照合したURLの残りの部分を明示的に保持していません。実際の要件にパスやクエリパラメータが含まれる場合は、キャプチャ範囲と置換方法を先に設計し、少数の管理可能な対象でテストしてください。元のドメインが同じだからといって、ログインのコールバック、APIリクエスト、通常のページをすべてサイトのトップページにリダイレクトしないでください。広すぎる書き換えはリクエストの意味を損ない、ページでリダイレクトループが発生することもあります。書き換え後のURLが別の書き換え条件にも一致する場合は、その相互作用も確認してください。

HTTPSで確認できる情報の制約

完全なHTTPSの通信経路とリクエスト内容は通常、暗号化された接続の中にあります。URL Rewriteを追加するだけで、すべての暗号化通信に適用できるとは限りません。この章ではHTTPS復号を求めず、証明書のインストールをルールによる通信振り分けの前提にもしていません。目的がドメインに基づく接続先の振り分けだけなら、ドメインルールを使い、完全なURLを見るための追加設定は不要です。この機能が適用できるかどうかは、実際に確認できるリクエスト情報と、アプリが対応している処理条件に基づいて判断してください。

どちらの設定セクションも、テストには取り消しの手順を含めてください。元の値を保存してから、対応付けまたは書き換えを1件だけ追加します。目的の動作を確認した後、変更を取り消して再テストし、現象が変更に応じて安定して変わるか確認します。取り消し後も問題が続く場合は、項目を追加し続けるのではなく、キャッシュ、既存の接続、接続先サービスの変化を検討してください。設定ファイル全体で4つのセクションの関係を確認する場合は、設定ファイルの構造ガイドをご覧ください。この章では、影響範囲を説明と検証が可能な範囲にとどめることを重視します。

08 / CHANGE AND VERIFY

設定の変更とトラブルの切り分け:再現可能な検証手順を作る

設定が正しいことと、アクセスに成功することは、関連はありますが別の結論です。正しいルールが一時的に利用できない接続経路を選ぶこともあります。アクセスに一度成功しても、キャッシュや既存接続によるもので、新しいルールが判定に使われたとは限りません。信頼できる検証には、テスト条件を固定し、元の設定を保存し、一度に1つの要素だけを変更し、新しいリクエストの結果を記録することが必要です。この章では、ここまでの各ルールを元に戻せる手順に整理しています。特定のドメインだけに問題がある場合、変更後も変化がない場合、設定の更新後に動作が変わった場合などに役立ちます。

手順1:設定を変更する前に、現在の状態を記録する

現在のネットワークの種類、Global Routing、有効なファイル、選択中のサーバーを記録し、どの操作で問題が発生するかを具体的に説明してください。「使えない」とだけ記録せず、トップページが開かない、画像が表示されない、ログインできない、APIリクエストが失敗する、LAN内のデバイスにアクセスできない、などに分けてください。繰り返し実行できる操作を1つ決め、できるだけ同じ対象でテストします。問題がもともと断続的に起きている場合は、変更前に何度か状態を確認してください。そうしないと、変更後の偶然の成功を修正の効果と誤認しやすくなります。

手順2:コピーを保存し、変更範囲を絞る

Configで元のファイルを残し、コピーを編集します。関連するセクションに同じ種類のルールがないか、条件の重複や途中のFINALがないかを確認してください。特定のドメインだけに問題がある場合は、広いキーワードルールをすぐに追加するのではなく、範囲の狭いDOMAIN例外を1つ追加してみます。DNSを調整する場合はRuleの順序を変えず、Hostを調整する場合はサーバーを変更しないでください。そうすれば、結果の変化と明確な1つの変更を結び付けられます。

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY

この部分例は、完全一致の例外を検証するためのものです。api.example.comにはPROXY、サフィックスに一致するその他の名前にはDIRECT、それ以外のリクエストには最終ポリシーを適用します。各行の意味を確認してから、自分の対象と期待するポリシーを対応付けてください。例のドメインを使って実際の接続をテストしたり、すでにあるFINALの後ろにこの部分例全体を追加したりしないでください。既存ファイルの構造が複雑な場合は、まずコピー上で最小の再現例を作ってロジックを確認してから、長期運用する設定に統合してください。

手順3:保存して有効化し、新しいリクエストを送る

編集後に保存結果を確認し、Configに戻って有効な設定を確認してから、Global RoutingをConfigに設定します。対象の操作をもう一度行い、必要に応じて一度切断して再接続し、既存接続の再利用が観察に与える影響を減らしてください。再接続しても、アプリ内のキャッシュがすべて消えるわけではありません。リクエスト記録もあわせて確認し、新しいネットワークリクエストが発生しているか判断してください。テスト中に「ページの表示が変わらない」ことを、そのまま「ルールが変わっていない」とみなさないでください。ページが関連するリソースを再リクエストしていない可能性があります。

手順4:まずルールの一致を確認し、次に接続を調べる

リクエストに適用されたポリシーが想定と異なる場合は、Ruleの先頭に戻って、他のルールとの包含関係、実際のホスト名、アドレスファミリー、Global Routingを確認してください。ポリシーが想定どおりなのに失敗する場合は、選択中のサーバー、プロトコル情報、DNS、接続先の応答を確認します。特定のネットワークだけで失敗する場合はネットワーク条件を比較し、特定のサーバーだけで失敗する場合はサーバーへの接続結果を比較してください。ポリシーが正しいのに重複ルールを追加し続けないでください。重複項目では認証エラー、到達できないアドレス、接続先サービスの異常は直せません。

確認できた結果に応じて次の手順を選ぶ
確認できた結果優先して確認する項目まだ範囲を広げない
ポリシーが想定と異なるモード、ファイル、条件、順序サーバーパラメータの変更
ポリシーは正しいが接続に失敗する接続経路、名前解決、接続先通信振り分けルールの重複
変更後、新しい記録がない新しいリクエストが発生したか、既存接続を再利用したかルールの照合範囲
更新後に動作が変わったファイルの内容と有効なファイルの違い根拠のない全体置換

手順5:隣接する対象を再テストし、復元方法を記録する

対象へのアクセスが回復した後も、同じサフィックス内の他のリクエスト、その範囲に属さない対象、影響を受ける可能性のあるLANアクセスを確認してください。最終ポリシーを変更した場合は、ルールに一致しないすべてのリクエストの接続先が変わる可能性があるため、より広い範囲で再テストします。どの行をなぜ変更し、どう検証し、どう元に戻すかを記録してください。機密性の高いリクエスト内容全体を保存する必要はありません。長期運用する設定の価値は、変更した当日に動作することだけでなく、後から見ても理解できることにあります。

原因を特定できない場合は、スイッチをオンにしても接続できない場合の確認手順を続けて確認するか、よくある質問で該当する項目を探してください。読み込みと接続の手順を改めて確認する場合は、クイックスタートガイドに戻ってください。購入やデバイスの互換性については、App Storeの正規アプリ情報をご覧ください。システム要件とユニバーサル購入の対象かどうかは、App Storeのページに記載された内容をご確認ください。ルールの問題を解決するために、クライアントを再購入する必要はありません。