Shadowrocket ルールガイド
設定項目から構文を、リクエストの流れから適用結果を確認できます。このページは、自分のサブスクリプションまたはサーバー情報をすでに持ち、ルールファイルを管理する方向けです。例示のドメインとアドレスは構文説明用であり、利用可能なサービスを示すものではありません。
サーバーの追加、サブスクリプションの読み込み、接続の開始が初めての場合は、まず使い方ガイドに沿って操作してください。このページでは、各操作に関わる設定のしくみと、変更後の確認方法を解説します。使い方ガイドで基本操作を学び、ルールガイドで設定を調べながら、必要に応じて行き来してご覧ください。
- 設定ファイル:.conf
- Rule:上から順に照合
- 変更前に元のファイルを保存
購入・サーバー・設定を区別するShadowrocketはAppleプラットフォーム向けの有料クライアントです。アプリの買い切り購入と接続サービスの契約は別です。本サイトではノードやサブスクリプションの提供、販売、推奨は行っていません。アプリの入手先はApp Storeのみです。正規の入手方法はダウンロード・購入ガイドをご覧ください。
このページの目次
まずファイルとモードを確認し、その後で個々のキーワードを調べます。問題が起きた場合は、最後の章から記録をたどって原因を確認してください。設定全体を一度に置き換える必要はありません。
設定ファイルの構成と適用範囲
Shadowrocketの設定ファイルは、サーバー一覧の別名ではありません。サーバー情報には接続先、認証情報、通信設定が記載されます。一方、設定ファイルはトラフィックの処理方法、名前解決、特別な処理が必要なリクエストを定義します。サブスクリプションを更新してサーバー情報が変わっても、現在のルールファイルが更新されるとは限りません。逆に、ルールファイルを読み込んでも、接続可能なサーバーが用意されるわけではありません。問題を調べる前に、この2つを切り分けることで、誤った箇所を何度も変更するのを防げます。
設定セクションと行の書式を確認する
よく使われる設定セクションには、[General]、[Rule]、[Host]、[URL Rewrite]があります。角括弧でセクションを宣言し、次のセクション名が現れるまで、その後の内容が所属します。セクションによって構文は異なります。Generalではキーと値の組み合わせ、Ruleではカンマ区切りのフィールド、Hostでは名前とアドレスの対応を記述します。1行だけ見て正しく思えても、どのセクションにも自由に置けるわけではありません。セクションを間違えると、解析に失敗したり、想定と異なる動作になったりします。
[General]
dns-server = system
[Rule]
DOMAIN,portal.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
[Host]
printer.example.com = 192.0.2.20
この例はセクションの構成を示すもので、接続可能なサービス設定一式ではありません。example.comは説明用のドメイン、192.0.2.20は説明用のアドレスです。実際に設定するときは、自分が管理する権限を持つ対象に置き換えてください。例にあるPROXYもサーバーを作成するものではなく、現在利用可能なプロキシ選択先が必要です。まず既存のサーバーで接続できることを確認してから、特定のドメインをPROXYに振り分けるか検討しましょう。
Configで使用中のファイルを確認する
Configで現在選択されている設定を確認してから、編集内容を開きます。ファイルの保存と選択は別の操作です。リストに保存したファイルが、接続に使用中のファイルとは限りません。新しい設定を試すときは元のファイルを残し、識別しやすい名前で複製を保存してから、その複製を現在の設定に選択できます。切り替え後はHomeに戻ってGlobal Routingを確認し、ProxyやDirectではなくConfigが選ばれていることを確かめてください。
リモート設定とローカルの複製も分けて考えましょう。リモートの内容を再度更新すると、ローカルで加えた変更が保持されない場合があります。実際の挙動はファイルや更新方法によって異なります。長期的に管理する個人ルールについては、リモートファイルのローカル内容を編集しているのか、独立した複製を使っているのかを明確にしてください。「今回保存できた」ことは、「今後の更新でも変更が保持される」ことを意味しません。更新後に重要なルールを確認するほうが、マージの挙動を推測するより確実です。
構成を確認してから本文を編集する
長いファイルを初めて確認するときは、まずセクション名を検索し、Ruleの開始・終了位置とFINALの行を記録します。そのうえで、外部ルールの参照や追加のポリシー定義があるか確認してください。検索結果の1行だけを切り取って動作を判断しないでください。上の行に、より広い条件が記述されている場合があります。異なる設定から同じキーワードを使ったルールを持ち込む場合でも、ポリシー名が異なることがあります。結合する前に、参照先が現在のファイルまたは動作環境で定義されているか確認しましょう。
エディタによって置き換えられる全角カンマ、全角角括弧、曲がった引用符は、例の構文とは異なります。設定エディタには半角の英語記号を入力し、フィールドの間に説明用の日本語を挿入しないでください。コメントは独立した行に置くと読みやすく、ポリシー名の一部と誤認されにくくなります。空行はグループ分けに使えますが、照合の終了を意味するものではありません。ルールの実際の順序は、Rule内の記載位置で決まります。
各設定に明確な最終ルールを1つだけ置く管理しやすくするには、Ruleの末尾にFINALを置き、その前に例外、ドメイン、アドレスの各ルールを記述します。FINALより後にある通常のルールは、このルール照合には参加しません。
管理しやすいファイルにするには、現在どこでファイルを選択しているか、どの既存ポリシーにルールが依存しているか、変更に失敗したときどう復元するか、という3点を確認できるようにします。機能を追加する前に記録を整えるほうが、未検証のセクションを大量に重ねるより役立ちます。ファイルの書き出しや機種変更時の移行については、設定のバックアップと機種変更時の移行をご覧ください。ファイルを復元した後も、現在の設定とサーバー選択を改めて確認してください。
General、DNS、Global Routing
Generalの設定は接続と名前解決の基本条件を定め、Ruleはその条件下でリクエストのポリシーを決定します。「ルールは正しいのにアクセスできない」場合、Ruleだけを見てはいけません。ドメインを名前解決できるか、サーバーに到達できるか、システムが接続をShadowrocketに渡しているかなどが、対象ルールより先に結果へ影響する可能性があります。こうした前提を理解しておけば、ルールの問題とネットワークの問題を切り分け、ルールを追加して本当の原因を覆い隠すことを避けられます。
3つの動作モードで確認すること
Global RoutingのConfig、Proxy、Directは動作モードであり、同時に有効にする3つのルールセクションではありません。Configは現在の設定に従ってトラフィックを振り分けます。Proxyは通常の転送トラフィックをプロキシ経路に渡します。Directは直接接続の経路を使います。システムのルーティング、除外設定、接続ごとの制限も実際の通信に影響することがあるため、モード名だけでリクエストの挙動を判断することはできません。RuleをテストするときはConfigを選択し、対象リクエストの処理結果を確認してください。
| 画面上の表記 | 説明 | 確認に適した内容 |
|---|---|---|
| Config | Configモード | 現在のRuleによる振り分け結果を確認する |
| Proxy | Proxyモード | 既存のプロキシ経路が使えるか確認する |
| Direct | Directモード | 現在のネットワークで直接接続できるか確認する |
たとえば、ProxyではアクセスできるのにConfigでは失敗する場合、命中したポリシー、そのポリシーに対応するサーバー、名前解決の違いを確認します。両方のモードで失敗する場合は、まず既存のサーバー情報と基本接続を確認してください。すぐにDOMAIN-SUFFIXの記述ミスと決めつけるべきではありません。Directで成功しても、その時点で直接接続できたことを示すだけです。プロキシルールが正しく動作したことや、関連するすべてのリソースが同じ経路を使っていることを意味しません。
DNS設定はポリシーの代わりにはならない
[General]
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
dns-server = systemはシステムが提供する名前解決設定を使うことを示すもので、設定ファイルの構造を理解するための簡単な例です。あらゆるネットワークで一律に推奨される設定ではありません。実際の名前解決は、ほかのDNSオプション、リクエストの種類、現在の接続環境にも左右されます。既存の設定を管理する場合、この例をコピーするために元のDNS設定を削除しないでください。まず現在の値を記録し、変更を1つずつ加えて結果を比較し、必要なら元に戻します。DNS、ルール、サーバーを同時に変更すると、判断の根拠が失われます。
ドメインルールは名前を、アドレスルールはアドレスを照合します。その間に名前解決が行われる場合があります。ログにアドレスしか表示されないからといって、クライアントが常に元のドメインを把握しているとは限りません。ドメインが表示されていても、その後の接続が成功するとは限りません。名前解決の結果と接続結果を分けて記録してください。ドメインを解決できない場合は、まず名前解決の経路を確認します。名前解決は正常でも接続がタイムアウトする場合は、出口のポリシーと接続先への到達性を確認してください。
除外設定とオンデマンド接続の範囲
既存ファイルのバイパス設定や除外設定により、一部のトラフィックが想定したルールの経路を通らないことがあります。こうした設定はRule内のDIRECTと完全に同じではありません。DIRECTはルールに一致した後のポリシーですが、除外はルール処理の前に適用される場合があります。変更する前に該当する項目のアプリ内説明を読み、システムルーティング、プロキシの例外、その他の範囲のどれを制御しているのか確認してください。名前が似ているからといって、一方をもう一方の代わりとして使わないでください。
On Demandは主に接続を開始・再開するタイミングを管理する機能で、特定のドメインにどのポリシーを適用するかを決めるRuleの代わりにはなりません。接続が自動で開始しても、リクエストが直接接続のままという場合があります。そのときはOn Demandを何度も変更するのではなく、現在のGlobal Routingとルールの適用記録を確認してください。反対に、ルールファイルが整っていても接続が確立されていなければ、Ruleが自動的に通信を処理することはありません。接続するタイミングと、接続後の振り分けは別の問題です。
Generalを調整するときは、理由が分かる最小限の変更記録を残してください。元の値、変更後の値、検証に使ったリクエスト、結果の変化を記録します。接続が戻った後は、ローカルネットワークや別の名前解決に依存する接続先も再テストし、1つのウェブサイトだけで判断しないようにします。Generalのパラメータは単一のドメインルールより広い範囲に影響することが多いため、トップページが開くかだけでなく、通常のケースと例外の両方で確認してください。
モードを確認してからルールを判断するこのガイドのRuleの例は、Configを選択してテストすることを前提としています。ProxyまたはDirectを使用中の場合は、まずこの前提に戻してからルールの結果を比較してください。
DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD
ドメインルールは、頻繁に変わるサーバーアドレスではなく、名前に基づいてアクセスの意図を表すのに適しています。まず照合したい対象が、完全なホスト名、ドメインの一群、特定の文字列を含む名前のどれかを決め、それに合ったキーワードを選びます。対象範囲が広いほど、誤って一致する可能性が高まります。個人用の設定を管理する場合は、完全一致から始め、リクエスト記録で共通の要件が確認できてから複数の完全一致ルールをサフィックスルールにまとめるのが基本です。
DOMAIN:指定したホスト名だけに一致
[Rule]
DOMAIN,login.example.com,PROXY
DOMAIN,static.example.com,DIRECT
FINAL,DIRECT
DOMAINは完全なドメイン名との一致に使います。最初の例はlogin.example.comを処理しますが、api.login.example.comやドメイン全体のexample.comまで処理するわけではありません。ルールのフィールドにはホスト名を記入し、プロトコル、ポート、URLのパスは含めません。ブラウザーのアドレス欄に表示される完全なURLからは、名前の部分を取り出す必要があります。特定のパスだけを処理したい場合、DOMAINだけでは条件を表現できません。
1つのページから、ログイン、画像、API、アクセス解析など、異なるホストへの接続が発生することがあります。ページのURLに完全一致ルールを追加しても、そのうち1つの名前しか対象にできません。ページの文字は表示されるのに画像が読み込まれない場合は、すべての名前にルールを拡大する前に、失敗したリクエストが実際にどのホストへ接続しているか確認してください。同じページを開いたときの接続を1つずつ確認すると、追加が必要なリソースのドメインを見つけやすくなり、ほかの通信のポリシーを不必要に変更するのも防げます。
DOMAIN-SUFFIX:ドメインとサブドメインに一致
[Rule]
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
DOMAIN-SUFFIXは、指定したドメインとそのサブドメインに一致します。例では、まずlocal.example.comをDIRECTの例外として設定し、それ以外のexample.comに属する名前をPROXYに振り分けています。ここに記入するのはexample.comで、先頭にアスタリスクを付ける必要はありません。また、*.example.comを同じ書き方とみなさないでください。ドメインの境界は重要です。後方一致は、文字列のどこかに同じ文字が含まれる名前との一致ではありません。
例外は広い範囲のルールより前に置きます。例の最初の2行を入れ替えると、先にサフィックスルールに一致し、その後の完全一致によるDIRECTルールは結果を変更できません。これはDOMAINの優先順位が低いからではなく、Ruleが記載順に処理されるためです。条件がより具体的であっても、自動的に優先されるわけではありません。意図した順序はファイルの作成者が記述位置で表します。例外を追加するときは、それより先に適用される可能性のある広いルールをすべて確認してから、挿入位置を決めてください。
DOMAIN-KEYWORD:範囲が広いため、条件をよく確認
[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
DOMAIN-KEYWORDは、ドメイン名に指定したキーワードが含まれているかを調べます。特定のドメイン群に範囲が限定されません。例は構文の説明用であり、確認せず日常的に使うルールとして適切ではありません。名前にexampleが含まれるからといって、同じ組織や業務に属するとは限らないためです。キーワードが短く、よく使われる言葉であるほど誤って一致しやすくなります。完全一致やサフィックスで要件を表現できる場合は、範囲の明確な条件を優先してください。
| キーワード | 対象範囲 | よくある誤り |
|---|---|---|
DOMAIN | 完全なホスト名 | 名前の欄に完全なURLを入力する |
DOMAIN-SUFFIX | ドメインとサブドメイン | 不要なアスタリスクを先頭に付ける |
DOMAIN-KEYWORD | 名前に含まれるキーワード | キーワードを組織の境界とみなす |
ドメインルールを検証するときは、一致するはずの名前と、一致しないはずの名前を少なくとも1つずつ用意します。サフィックスルールではルートドメインとサブドメインの両方、キーワードルールでは同じ文字を含むものの対象範囲外である名前も確認してください。こうした逆方向のテストで、ルールの範囲が広すぎる問題を見つけられます。「対象にアクセスできた」ことだけでは、本来DIRECTにすべき別のリクエストまでプロキシ経路に送っていないか判断できません。
ドメイン名に国際化文字が含まれる場合は、リクエスト記録に実際に表示される名前の形式を確認し、クライアントが受け付ける形式で記入してください。空白を含む表示用のタイトルをそのまま使ったり、ブラウザーが読みやすく表示している文字列を最終的な照合値だと考えたりしないでください。もう1つよくある誤りは、ルールを変更した後、同じページを繰り返し再読み込みすることです。アプリが既存の接続を再利用する場合があるため、新しいリクエストを発生させ、変更後のポリシーが新しい接続に適用されていることを確認しましょう。
ルールが増えてきたら、「完全一致の例外」「業務ごとのサフィックス」「慎重に使うキーワード」を連続する小グループに分けると管理しやすくなります。ただし、キーワード順に機械的に並べるのではなく、例外との関係に合わせてください。特定のウェブサイトだけをプロキシに通す場合は、指定したウェブサイトだけを振り分ける方法を参考に、対象を絞ったリストから始め、実際に使われるリソースのリクエストに合わせて追加しましょう。関係のない名前を一度に大量に含める必要はありません。
GEOIP、IP-CIDR、IP-CIDR6、USER-AGENT
アドレスルールは「接続先のアドレスがどの範囲に属するか」を判定するもので、「ユーザーがどのアプリを使っているか」を判定するものではありません。アドレスへ直接接続する場合、ドメイン情報を利用できない場合、管理対象の内部ネットワークに明確な例外を設定する場合に役立ちます。ただし、同じアドレスを複数の業務が共有することや、名前解決の結果によってアドレスが変わることもあります。一度の観察だけで大きなアドレス範囲を特定のポリシーに固定するのは避けましょう。アドレスの出所と管理者を確認してから、設定に含めるか判断してください。
IP-CIDR:アドレスとプレフィックス長で範囲を指定
[Rule]
IP-CIDR,192.0.2.20/32,DIRECT,no-resolve
IP-CIDR,198.51.100.0/24,PROXY,no-resolve
FINAL,DIRECT
IPv4のIP-CIDRフィールドは、ネットワークアドレスとプレフィックス長で構成されます。/32は単一のアドレス、/24はアドレス範囲を表します。この数字はポートでも優先順位でもありません。例では説明用のアドレスを使っているため、実際のネットワークに到達できるかの判断には使えません。設定を管理する際は、対象のネットワーク範囲が正しいか確認してください。対象アドレスの後ろに短いプレフィックスを適当に付けると、関係のない宛先まで含めてしまうおそれがあります。
no-resolveは、アドレスルールを確認するためだけにドメインの名前解決を行わないようにする任意のパラメータです。すべてのDNSを無効にする意味ではなく、そのルールへの一致を保証するものでもありません。リクエストに比較可能なアドレスが含まれていれば、アドレスの照合は行われます。ドメイン名しかなく対応するアドレスがない場合、パラメータによって自動的に名前解決され、一致することは期待できません。この種のルールを調べるときは、リクエストに含まれているのが名前かアドレスかも記録してください。
IP-CIDR6:IPv6の経路を個別に確認
[Rule]
IP-CIDR6,2001:db8::20/128,DIRECT,no-resolve
IP-CIDR6,2001:db8:1::/48,PROXY,no-resolve
FINAL,DIRECT
IP-CIDR6はIPv6のネットワークプレフィックスを使い、/128は単一のIPv6アドレスを表します。例の2001:db8::は説明用です。IPv4のアドレスルールだけを設定しても、同じドメインへの接続がIPv6で確立した場合に一致するとは限りません。ネットワークと接続先の両方がIPv4とIPv6に対応している場合は、実際に使用されるアドレスファミリーをテストしてください。IPv4で一度成功しただけで、対象のアドレス振り分けがすべて正しく設定できていると判断しないでください。
ネットワークによって同じ接続先へのポリシーが異なる場合は、まず名前解決の結果と実際の接続先アドレスを確認し、設定がどちらか一方のアドレスルールしか含んでいないか調べます。特定のアドレスファミリーを無効にして挙動が一時的に変わっても、ルールの範囲が適切だとは証明できません。要件が安定したドメイン群に関するものであればドメインルールを、管理対象の明確なネットワーク範囲に関するものであれば対応するアドレスルールを使うと、管理しやすくなります。
GEOIP:アドレスデータベースによる分類
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
GEOIPは、アドレスデータベースに基づいて接続先のアドレスを分類します。GEOIP,CN,DIRECTは、データベースでCNに分類されたアドレスに一致した場合、DIRECTを適用することを示します。ウェブページの言語、ドメインのサフィックス、ユーザーの所在地で判定するものではありません。データベース上の分類と業務上の所属先が一致するとは限らず、分散型のインフラを使う接続先では特に注意が必要です。明確な業務上の例外はGEOIPより前に置き、アドレス分類からドメインに適した経路を推測しないでください。
GEOIPを使うには、利用可能なアドレス情報も必要です。リクエストが想定した地域条件に一致しなかった場合、国や地域のコードだけを変更するのではなく、実際の接続先アドレス、データベース上の分類、先行するルールを確認してください。GEOIPとFINALを組み合わせる場合は、一致しなかったリクエストがどこへ向かうかも確認します。例では、それ以外のリクエストをPROXYに渡しており、FINAL,DIRECTとはデフォルトの方向が逆です。設定例をコピーする前に、最後の行まで読んでください。
USER-AGENT:リクエスト特性はアプリの識別情報ではない
[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY
USER-AGENTは、取得できるUser-Agent情報に基づいてリクエストを照合します。例のExampleClient*は、この文字列から始まる特性を表します。アプリ名で振り分ける汎用的な方法ではありません。複数のアプリが同じ識別情報を使うことも、1つのアプリがリクエストごとに異なる識別情報を使うこともあります。暗号化されたリクエストからリクエストヘッダーを読み取れない場合、このルールだけで内部のUser-Agentを識別することはできません。
USER-AGENTを使う前に、記録上で該当する特性を実際に確認できるか確かめ、明確なテストリクエストで検証してください。このルールを有効にするためだけに復号の範囲を安易に広げないでください。また、リクエストヘッダーの照合失敗をプロキシサーバーの障害と混同しないようにしましょう。名前、アドレス、リクエストヘッダーはそれぞれ別の層の情報です。現在のリクエストからどの情報を取得できるかを確認してから、適切なキーワードを選んでください。
PROXY、DIRECT、REJECTとルールの優先順位
ルールは条件とアクションで構成されます。前のフィールドが照合対象を、ポリシーフィールドが一致後の処理を示します。PROXY、DIRECT、REJECTはよく使われるポリシーのキーワードです。Global Routingの画面に表示されるProxy、Directとは、大文字・小文字や使用箇所が異なるので区別してください。ルールを読むときは、ドメインが含まれているかだけでなく、条件とアクションを合わせて解釈します。同じドメインでも、異なるポリシーを設定すれば動作が変わります。
3つのポリシーの役割
PROXYは、一致したトラフィックを対応するプロキシの選択先に渡します。利用可能なサーバーと正しい接続パラメータが必要です。PROXYに一致しても、出口の方向が決まるだけで、サーバーへの接続や接続先からの応答が保証されるわけではありません。DIRECTは接続先へ直接接続する指定であり、名前解決とネットワーク経路が正常である必要があります。REJECTは一致したリクエストを拒否します。対象範囲が明確で、遮断してよいと確認できた場合に使い、失敗後に別の経路を試す指示として扱わないでください。
| ポリシー | 処理内容 | 確認するポイント |
|---|---|---|
PROXY | プロキシ経路へ送る | 一致結果と既存サーバーへの接続性 |
DIRECT | 直接接続の経路を使う | 名前解決の結果と現在のネットワークの到達性 |
REJECT | リクエストを拒否する | 予定した対象だけに影響しているか |
DIRECTはShadowrocketを終了する指定でも、接続を停止するスイッチでもありません。Configの下で特定のルールにDIRECTを適用しながら、ほかのリクエストにはPROXYを使えます。同様に、REJECTはデバイス全体をオフラインにするのではなく、条件に一致したリクエストだけを拒否します。ただし、共通API、認証サービス、複数のページが使うリソースをブロックすると、影響が広がることがあります。条件を明確にし、元に戻す方法を用意してください。
先に一致したルールで今回のポリシーが決まる
[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN,office.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,DIRECT
例では、最初に特定のホストを拒否し、別のホストをDIRECTの例外とします。残りのサフィックスに属する名前はPROXYに振り分け、その後GEOIPを確認し、最後にFINALで未一致分を処理します。優先順位はキーワードの「具体性の順位」ではなく、記載位置で決まります。サフィックスルールを先頭に移すと、2つの完全一致ルールが先に処理されなくなります。FINALを先頭に置くと、ほかの通常ルールが今回の判定に参加できません。
「一致した時点で終了」とは、今回のRuleによるポリシー選択で、後続の通常ルールを探し続けないという意味です。リクエストのライフサイクル全体で、設定機能が1つしか実行されないわけではありません。DNSや接続の確立など、ほかの処理にはそれぞれの段階があります。また、接続に失敗した後に自動で次の行へ進むという意味でもありません。PROXYに一致した後でサーバーへの接続に失敗しても、下のDIRECTが自動的な予備の出口になるとは限りません。復旧するには、後続のルールに任せるのではなく、ポリシーが依存している経路を修復してください。
FINAL:残りのリクエストの行き先を明示する
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
FINALにはドメインやアドレスのパラメータは不要です。前のルールに一致しなかったリクエストに最終ポリシーを適用します。例は「列挙したドメインはプロキシへ、それ以外は直接接続」を表しています。FINAL,PROXYに変更するとデフォルトの方向も変わり、列挙されていないリクエストがすべてプロキシ経路へ送られる可能性があります。一見、局所的な問題に見えても、設定例をコピーした際にFINALを見落としたことが原因の場合があります。最終ポリシーを変更する前に、ログイン、ローカルネットワークへのアクセス、普段使うサービスなどで維持する例外を洗い出してください。
管理するときは、末尾にFINALを1つだけ置くことをおすすめします。複数のFINALが順番に予備の経路を試すわけではありません。最初のFINALが残りのリクエストを処理するため、後続の同種の条件は適用されません。編集ツールによってファイル末尾に重複ルールができた場合は、まずどの部分が現在のRuleに属しているか確認してください。見た目が重複している行を、異なる設定の段落が意図せず統合されていないか確認せずに削除しないでください。
カスタムポリシーの参照先を確認する
複雑なファイルでは、ポリシーフィールドにPROXYではなくカスタム名を使うことがあります。その場合は、名前が現在の設定とアプリでサポートされる仕組みの中で定義され、利用可能な接続先を指定していることを確認してください。外部ポリシーを参照するルールだけをコピーし、対応する定義を追加しなければ、原因を特定できない依存関係が残ります。このガイドでは基本構文を示すために組み込みポリシーを使い、特定の設定ファイルにおける命名ルールを固定キーワードと誤認しないようにしています。
競合を調べるときは、隣の2行だけでなく上の行も確認するルールの適用範囲が重なるか確認するときは、Ruleの先頭から下へ追い、最初に一致するルールを探します。先行するキーワードルール、アドレスルール、外部ルールの参照が、目の前の完全一致ルールより先に結果を決めることがあります。
順序を整理する目的は、ファイルを見た目よく並べることではなく、例外の関係を読み取れるようにすることです。各ルールの目的を独立したコメントに記し、なぜ次のルール群より先に処理する必要があるのかも記録してください。その後、追加や削除を行うときは、理由が現在も有効か確認します。ルールの位置を説明できれば安全にまとめられます。用途を説明できないルールは、長期利用するファイルに直接追加せず、いったん分けてテストしてください。
HostとURL Rewriteの用途と範囲
HostとURL Rewriteはいずれも、ユーザーに見えるアクセス結果を変えることがありますが、解決する問題は異なります。Hostは主に名前とアドレスの対応を定義し、URL Rewriteは参照可能なURLを条件に処理します。Hostはプロキシポリシーではなく、URL Rewriteもドメイン振り分けの代わりにはなりません。必要な機能を判断するときは、まず目的を「名前解決先を指定する」「接続経路を選択する」「ある形式のURLを別の形式に変える」のどれかに整理してください。
Host:アドレスを固定しても出口は固定されない
[Host]
printer.example.com = 192.0.2.20
[Rule]
DOMAIN,printer.example.com,DIRECT
FINAL,PROXY
例では、1つの名前を説明用のアドレスに対応付け、Ruleでその名前の接続経路をDIRECTにしています。この2行はそれぞれ名前解決と経路選択を担い、互いに置き換えられません。実際に使うアドレスは、自分が利用する権限を持ち、現在のネットワークから到達可能なものにしてください。ドメインをアドレスに割り当てても、到達できなかったネットワークに接続できるようになったり、認証、ポート転送、サーバー側の仮想ホスト設定が自動で用意されたりするわけではありません。
アドレスを固定すると、既存の動的な名前解決が機能しなくなる場合があります。接続先のアドレス変更、近接サーバーへの振り分け、障害時の切り替えに依存するサービスでは、古い対応付けを長期間残すと接続がタイムアウトする可能性があります。追加前に本当にアドレスの固定が必要か確認し、解除方法を記録してください。テストでは名前が想定どおりのアドレスに解決されるかだけでなく、サービス、ポート、証明書の識別情報も正しいか確認します。アドレスから応答があっただけで、サービスが正常だと判断しないでください。
Hostはブラウザーがアクセスしているホストの識別情報を置き換えません。HTTPSの名前に接続するとき、サーバー証明書は引き続きその名前の検証条件を満たす必要があります。必要なサービスを提供しないアドレスに名前を割り当てると、証明書エラーや別のサイトが表示されることがあります。検証を無視して解決しようとしないでください。対象サービスがその名前に対応しているか、許可されたテスト環境での割り当てかを確認しましょう。通常の名前解決に戻した後は、関連するキャッシュも更新されたことを確認してください。
URL Rewrite:正規表現、転送先、アクション
[URL Rewrite]
^http://legacy\.example\.com/(.*)$ https://www.example.com/$1 302
この例では、正規表現で古いURLに一致させ、キャプチャしたパスを新しいURLに引き継ぎ、302リダイレクトを返します。ピリオドの前のバックスラッシュは、実際のピリオドに一致させるためのものです。先頭と末尾のアンカーで一致範囲を限定し、括弧でキャプチャした部分を$1で参照します。2つのドメインは例示用です。自分の設定で使う場合は、テストする権限のある接続先に置き換え、クエリパラメータとエンコードが要件どおり保持されるか確認してください。
正規表現のピリオドには既定で特別な意味があるため、エスケープし忘れると対象外の名前にも一致することがあります。ホストの境界を省略すると、似た別のURLまで範囲に含める可能性があります。URL Rewriteを管理する際は、一致する例、似ているが一致すべきでない例、パスとクエリパラメータを含む例を少なくとも1つずつ用意してください。ホームページだけでテストしないでください。パスのないURLで成功しても、より長いURLが正しく処理されるとは限りません。
暗号化による可視性の制限と処理段階
完全なHTTPS URLのパスは暗号化された内容に含まれるため、通常の接続振り分けでその中のすべての項目を読み取れるとは限りません。URL Rewriteを対象に適用できるかどうかは、リクエスト情報を参照できるか、また関連する処理条件が満たされているかによります。「正規表現を書いた」だけでパスを読み取れるようになったと考えないでください。リダイレクトルールの検証だけを目的に、復号の範囲をすぐに広げることも避けましょう。証明書や暗号化処理に関する設定は、許可、プライバシー、アプリの互換性を個別に評価してください。
Ruleの上から順に処理される原則を、「設定ファイル全体が記載順に一度だけ実行される」と単純に捉えてはいけません。各セクションには異なる機能があり、HostがRuleより前に記載されているからといって、必ず文字どおり先に実行されるとは限りません。書き換えの問題を調べるには、元のURL、リダイレクトの有無、転送先、その後の接続に適用されたポリシーをリクエストの流れに沿って確認します。これにより、書き換えが適用されなかったのか、転送先への接続に失敗したのか、その後の振り分けに問題があったのかを切り分けられます。
リダイレクトが繰り返される場合は、追加したルールをいったん無効にする新しい転送先が再び古いルールに一致する場合や、サイトが元のURLへリクエストを戻す場合は、ループになることがあります。元の設定に戻して正常なことを確認し、正規表現の範囲を絞ってください。逆方向のリダイレクトを重ねて追加しないでください。
ブラウザーがリダイレクト結果をキャッシュしていたり、アプリが名前解決や接続をキャッシュしていたりする場合があります。ルールを削除した後も以前の挙動が続いても、ファイルが保存されていないとは限りません。現在の設定を確認し、新しいテストリクエストまたは独立したテストセッションで再確認してください。長期的に使う書き換えルールには、目的、対象ホスト、想定する動作、削除条件を記録しましょう。接続先がURL構成を変更したのに、古い処理をローカルルールで強制し続ける事態を防げます。
HostとURL Rewriteは、対象が狭く目的を説明できる場合に適しています。あらゆるアクセス異常を修復するための手段として使わないでください。特定のサイトをPROXYに通したいだけならドメインルールに戻ります。名前解決の結果に問題があるなら、DNSと既存の割り当てを確認します。サイトにリクエストを拒否されたなら、認証やサービス側の応答も確認してください。問題の層を特定してから設定セクションを選べば、ファイルを簡潔に保ち、障害も再現しやすくなります。
よく使う振り分け設定と変更手順
組み合わせ例は、ルールの数ではなく要件から考えます。まずデフォルトのポリシーを決め、例外が必要な対象を列挙し、完全一致、サフィックス、アドレス条件のどれを使うか選びます。以下の各例はそれぞれ独立した考え方で、同じRuleに続けて貼り付けるものではありません。複数の例を結合する場合は、FINAL、例外の順序、重複条件を改めて調整してください。そうしないと、後から貼り付けた部分が判定にまったく参加しない可能性があります。
指定したウェブサイトをプロキシに通し、それ以外は直接接続する
[Rule]
DOMAIN,account.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-SUFFIX,example.net,PROXY
FINAL,DIRECT
対象範囲が明確で、リスト内の宛先だけをプロキシに通したい場合に適した設定です。まずアカウント用のホストを直接接続の例外にし、続けて2つの例示用ドメイン群を追加し、残りのリクエストをDIRECTにします。実際に設定するときは、まず1つの接続先でサーバーとルールの動作を確認し、その後、サービスが必要とするほかのホストを段階的に追加してください。ページにリソースが1つ読み込まれないからといってFINALをPROXYに変更しないでください。対象リストだけを振り分ける元の設定とは異なり、列挙されていないすべてのリクエストが変わります。
リストを管理するときは、ユーザーが入力したページURLと実際に発生したリソースのリクエストを分けて記録します。サービスによっては、静的ファイル、API、ログイン処理を別のドメインで提供しています。サフィックスルールだけで関連性を自動判断することはできません。実際に確認でき、必要性のある接続先だけを追加し、リストにない普段使うウェブサイトが引き続き直接接続されることも確認してください。詳しい設定は、指定したウェブサイトだけをプロキシに通すルールの解説をご覧ください。
明確な例外は直接接続し、それ以外はプロキシに通す
[Rule]
DOMAIN,portal.example.com,DIRECT
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
FINAL,PROXY
この例は逆の方針を採り、特定のホストとよく使われるプライベートIPv4アドレス範囲を直接接続の例外にし、それ以外はプロキシに渡します。プライベートアドレスのルールが対象にするのは該当するアドレス条件だけであり、すべてのローカルネットワーク検出、ブロードキャスト、特殊なネットワーク機能が想定どおり動作する保証はありません。現在のネットワークが別のアドレス範囲やIPv6を使っている場合は、実際の環境に応じて個別に確認してください。数個のプライベートアドレスルールを、システムネットワーク設定一式の代わりとみなさないでください。
FINAL,PROXYを使う前に、既存のプロキシ経路が日常の要件に対応できるか確認し、認証、ローカルネットワークのサービス、必要な直接接続の例外も確認してください。直接接続が必要なサービスには、範囲が明確な条件を設定してから、共有インフラ上のほかのリクエストに影響しないかテストします。動的なドメインが多い業務では、広いキーワードを推測して長期的な正確さを期待するのではなく、記録に基づいて継続的に見直してください。
特定のホストだけをブロックし、同じドメインのほかの通信は維持する
[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,DIRECT
この例では、ドメイン全体のサフィックスを拒否せず、完全一致する1つのホストだけをブロックします。初めてREJECTをテストするときは、用途が確認でき、重要な手順に影響しない対象を選びます。その後、ページ表示、ログイン、APIが正常か確認してください。リクエストが失敗するのは想定される動作の一部ですが、ユーザーからは原因を判断できない場合があるため、明確なコメントを残します。誤って影響を与えた場合は、パッチを何度も追加するより、このルールを取り消すほうが簡単に復元できます。
ブロック対象のホストが別の必要な業務にも使われている場合、ドメイン名だけでは内部の用途を区別できません。その場合は要件を見直し、さらに広い範囲のブロックで補おうとしないでください。REJECTに一致した後、アプリが別の接続先へ切り替えたり再試行したりすることがあります。記録に新しいリクエストが現れても、元のルールが無効になったとは限りません。各リクエストの名前とポリシーを比較し、同じ接続先の再試行なのか、別の接続が発生したのか確認してください。
新しいルールを既存ファイルに安全に追加する
まず元の設定を複製し、既存のRuleと末尾のFINALを確認します。新しい例外は、そのルールより前に適用される可能性のある広いルールより前に置きます。統合方法を推測して、2つ目のRuleセクションを追加しないでください。既存ファイルが外部ルールを参照している場合は、その範囲を理解してから、参照の前後どちらに挿入するか決めます。保存したら複製を選択し、Global RoutingがConfigであることを確認します。最後に新しいリクエストを発生させ、一致結果を確認してください。検証に失敗した場合は、元の複製に戻し、不確かな状態へ変更を重ねないようにします。
- 目的、デフォルトのポリシー、維持する必要がある例外を文章にする。
- 現在の設定、サーバーの選択、Global Routingを記録する。
- 今回必要なルールだけを追加し、フィールド、ポリシー名、FINALの位置を確認する。
- 一致するリクエスト、一致しないリクエスト、日常的に使うリクエストをそれぞれテストする。
- 結果を確認して記録を保存する。想定どおりでなければ元のファイルに戻し、調査を続ける。
サブスクリプションの更新で既存のサーバー一覧が変わることはありますが、ここで説明したルールの検証に代わるものではありません。現在のポリシーが依存するサーバーが変わった場合は、プロキシ経路を再確認してください。サーバーの表示名が変わっただけで、ルールの内容も変わったと判断することはできません。複数のサブスクリプションを管理する場合は、複数のサブスクリプションのグループ分けと整理を参考にし、取得元の管理とルールの管理を分けてください。重複するサーバーの問題をルールの例外として記述するのを防げます。
ルールの一致確認、トラブルの切り分け、設定の復元
ルール検証の目的は、たまたま一度アクセスできることではありません。指定したリクエストが意図した条件に一致し、予定したポリシーで処理され、維持すべき動作も損なわれていないことを確認します。テスト記録には、実施時刻、現在の設定名、Global Routing、対象の名前またはアドレス、実際の一致結果、接続の状況を含めます。時刻は今回のテストと比較するためのもので、アプリの更新情報を示すものではありません。具体的な証拠を残せば、次にネットワークが変化したときに以前の結果と比較できます。
ルールの数から原因を推測せず、層ごとに確認する
まず接続が確立しているか、使用中のファイルが選択されているかを確認し、次にリクエストが想定した処理対象に入っているか調べます。その後、名前解決と実際の接続先を確認し、最初に一致した条件を見て、最後にポリシーの出口が使えるかを確認します。前の段階で失敗していれば、後の段階の変更は通常意味がありません。たとえば、名前解決の失敗に対してドメインサフィックスを追加しても解決しないことがあります。PROXYに一致したもののサーバーに接続できない場合、FINALを移動しても直接的な解決にはなりません。
| 確認された現象 | 優先して確認する項目 | 次に行うこと |
|---|---|---|
| 新しいルールがすべて反映されない | 現在の設定とConfigモード | ファイルが選択されていることを確認し、新しい接続を発生させる |
| 対象が先行するルールに一致した | 上にあるルールとの適用範囲の重なり | 必要な例外を広いルールより前に移動する |
| PROXYに一致するが接続に失敗する | 既存のサーバーと接続先への到達性 | Proxyモードと具体的なエラーを比較する |
| 一部のリソースだけが失敗する | 失敗したリソースの実際のホスト | ページのタイトルではなく、関連するリクエストを1つずつ確認する |
| ルールを取り消しても以前の挙動が続く | キャッシュ、長時間接続、現在の設定ファイル | 新しいテストリクエストを発生させてから比較する |
Connectivity Testは既存サーバーのテスト結果を確認する助けになりますが、すべてのサイト、プロトコル、業務リクエストが利用できることを証明するものではありません。テストに成功しても、実際のアクセスで名前解決、接続先からの拒否、業務上の認証に問題が生じる場合があります。テスト結果は証拠の一部として扱い、最終的な結論とはみなさないでください。同様に、ウェブページが開いたからといってPROXY経由だとは限りません。該当するリクエストのポリシー記録と合わせて判断してください。
一致・不一致・回帰のテストケースを用意する
一致テストは対象がルールに一致することを確認し、不一致テストは対象範囲が広がりすぎていないことを確認します。回帰テストでは、従来正常だった機能が引き続き使えるか確認します。たとえばDOMAIN-SUFFIXを追加した場合は、ルートドメインとサブドメインをテストし、次にそのサフィックスに属さない名前を確認してから、ログインとローカルネットワークへのアクセスもテストします。用途の分からない接続先にアクセスしてテストする必要はありません。自分がアクセスする権限を持ち、目的が明確なサービスを使ってください。例示用のドメインは構文の説明にのみ使います。
テスト中は、できるだけ変更する変数を1つに絞ります。サーバー、ネットワーク、動作モードを同じに保ち、ルールを1つだけ変更して結果を比較してから次に進みます。ネットワークを切り替える必要がある場合は別に記録し、その変化による名前解決の違いをルール変更の結果と取り違えないようにしてください。ページが接続を再利用する場合は、関連するテストセッションを終了して新しいリクエストを開始します。新しいルールは通常、新しい接続で確認する必要があります。既存接続が継続した結果だけで判断しないでください。
ログを共有する際の機密情報の取り扱い
トラブルの記録を共有する場合は、再現に必要な接続先、ルール、ポリシー、エラー情報だけを残します。サブスクリプションURLの認証情報、サーバーのパスワード、非公開のリクエストパス、アカウント識別情報、設定ファイル内の認証情報は、事前に削除してください。スクリーンショットにも同じ情報が含まれる場合があるため、画像だからといって確認を省略しないでください。機密情報を明確な例示値に置き換え、どの項目を置き換えたか説明すると、再現性と情報保護を両立できます。
問題の範囲を絞るには、最小限のテスト設定を作成します。必要なGeneral設定、対象のルール1つ、FINALを残し、自分がすでに持っているサーバーを使います。最小構成で正常に動作したら、元のルールをグループごとに戻し、結果に差が出る箇所を特定してください。戻すときはグループ内の元の順序を維持し、ファイル全体を同時に並べ替えないでください。これにより、特定条件、外部参照、複数の例外の順序関係のどれが問題か確認できます。
復元後も動作状態を改めて確認する
切り戻しは、設定の文字列を元に戻すだけではありません。元の設定を再度選択し、Global Routingと既存サーバーの選択を確認します。必要であれば接続を再確立し、以前正常だったテストケースと比較してください。元の設定に戻しても異常が続く場合、ネットワーク、サーバー、接続先のサービスが変化した可能性があります。すべての問題を今回の編集だけに結びつけないでください。変更前後のファイルと簡潔な記録を残すと、記憶を頼りに何度も復元する際、新たな差分を生むのを防げます。
変更を完了と判断する基準対象が正しく一致し、例外が誤って影響を受けず、日常のリクエストが回帰テストに合格し、変更前の状態に戻せること。この4点すべてを確認してから、テスト用の複製を長期利用する設定にしてください。
機種変更後に復元する場合は、まずアプリがApp Storeから入手したものであることを確認し、自分で保存したサーバー情報と設定ファイルを復元してから、現在の設定とシステムの接続許可を再確認します。システム要件はApp Storeのページに記載された内容をご確認ください。購入済みアプリの復元や再入手については、購入済みアプリの復元ガイドと、同ページの購入に関するよくある質問をご覧ください。初回接続の手順は使い方ガイドに戻り、ルールの意味はこのページの目次から項目ごとに確認してください。
長期的な管理には、安定版とテスト版を1つずつ用意する方法があります。安定版には検証済みの変更だけを反映し、テスト版は新しい条件の追加や検証に使います。不要になった例外を定期的に整理し、固定アドレスが今も有効か確認し、リモート設定の更新後には個人ルールを再確認してください。ルールファイルの価値は長さではありません。各条件の目的を説明でき、結果を確認でき、変更をいつでも元に戻せることが大切です。