公式マニュアル Config / Rule

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

設定セクション、マッチ条件、適用ポリシーを確認します。まずリクエストがどのConfigを使うかを確認し、どのRuleに一致するのかを見ていきます。

このページは設定を調べるためのマニュアルで、初回接続の手順ではありません。既存のサブスクリプションまたはサーバー情報をまだ追加していない場合は、まずはじめにに沿って追加、接続、確認を行ってください。ルールの適用範囲、優先順位、設定の上書きで問題がある場合は、該当する章を参照してください。

上から順に評価 最初に一致したルールを適用 例示ドメインは接続先として使用できません
01 / CONFIG

設定ファイルの構成と編集時の注意点

設定全体、ルール一覧、サーバー情報を区別し、用途の異なる内容を上書きしないようにします。

1つのファイルで各セクションが異なる役割を担う

Shadowrocketの設定ファイルには、接続処理のパラメーター、振り分け条件、ドメインのマッピング、リクエストの書き換えをまとめて記述できます。角括弧内のセクション名がそれぞれの役割を示します。[General]には一般的な処理オプション、[Rule]には順番に評価されるルール、[Host]には明示的なドメインマッピング、[URL Rewrite]には条件に一致するURLの処理ルールを記述します。セクション名は単なる見出しではありません。別のセクションに記述すると、意図したとおりに解析されないことがあります。初めて見るファイルを読むときは、まず各セクションを見つけてからパラメーターを1行ずつ確認しましょう。ドメイン名だけを検索して内容を貼り付ける方法は避けてください。

サーバー情報と振り分けルールも別のものです。サーバー情報には接続先、プロトコル、認証パラメーターが記録され、ルールはリクエストに適用するポリシーを指定します。DOMAIN-SUFFIX,example.com,PROXYだけでは利用可能なサーバーは作成されません。また、サブスクリプションのインポートに成功しても、指定したルールファイルが有効になったとは限りません。このページでは、ユーザー自身がサブスクリプションまたはサーバー情報をすでに用意していることを前提にしています。例にあるドメインやアドレスは適用範囲の説明用で、接続先情報は提供しません。

変更前にコピーを保存し、1項目ずつ編集する

Configで現在選択されているファイルを確認し、名前を控えて、元の内容を別のコピーとして保存します。編集前にファイルがリモートのアドレスから取得されたものか、次回の更新で内容全体が再ダウンロードされるかを確認してください。リモート設定とサーバーのサブスクリプションは、どちらもリンクとして表示される場合がありますが、更新対象は異なることがあります。実際のインポート方法と内容を確認して判断しましょう。更新方法が分からないまま、リモートファイルを恒久的なローカルメモのように扱わないでください。次回の更新で手動追加したルールが上書きされる可能性があります。

編集時は元のセクション名を維持し、対象のセクション内だけに内容を追加します。まず範囲を限定したDOMAINルールを1つ追加し、保存して有効にした後、テスト接続を新たに確立します。結果を確認してからDOMAIN-SUFFIXへ範囲を広げてください。エディターで保存成功と表示されても、キーワード、パラメーター、ポリシーがすべて有効とは限りません。解析に関する警告が出た場合は、まずその内容を解消してください。元のエラーを隠すために、ルールを次々と追加するのは避けましょう。

[General]
dns-server = system

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

[Host]
lab.example.com = 192.168.10.20

この設定例はファイルの基本構造を示すもので、接続設定一式ではありません。システムDNSを使用し、指定した完全なドメイン名をDIRECTに、example.comとそのサブドメインをPROXYに振り分け、それ以外のリクエストをDIRECTにします。また、実験用ドメインに固定アドレスを設定しています。実際にアクセスできるかどうかは、選択中のサーバー、ネットワークの到達性、アドレスが利用環境に合っているか、対象サービスが稼働しているかによって異なります。実験用のアドレスマッピングをそのまま本番環境で使わないでください。

構文の正しさと用途の適切さを区別する

構文として正しい行でも、ネットワーク上の目的に合わないことがあります。たとえば、FINAL,DIRECTとFINAL,PROXYはいずれも有効な最終ルールですが、一致しなかったリクエストを処理する方向はまったく異なります。設定を確認するときは、エラーの有無だけでなく、どのリクエストがこの行に一致するのか、指定したポリシーが利用可能か、失敗時に復旧できるかも確認してください。変更ごとに入力と期待する結果を記録し、変更前後の差分を保存しておくと安心です。

同じセクションが複数あったり、設定が互いに矛盾したりする場合は、トラブルシューティングを続ける前に構成を整理してください。「重複項目は最後のものが必ず有効になる」といった未検証の前提に頼らないようにしましょう。同じ用途のルールを読みやすい場所にまとめ、重複するマッピングを減らし、理由が分かる記録を残す方が、多くの条件を追加するより保守しやすくなります。

02 / GLOBAL ROUTING

動作モードとルールの適用条件

ルールが正しくても、現在のモード、選択中の設定、接続状態によって処理フローに入るかどうかが決まります。

Config、Proxy、Directの役割

ルールを確認する前に、HomeでGlobal Routingを確認してください。設定モードのConfigは、現在の設定にある振り分けロジックに従って処理します。Proxyは主にリクエストをプロキシ経由で処理し、Directは主に直接アクセスします。ProxyとDirectのモードは、Ruleの評価順序を検証するための代替環境ではありません。Proxyで特定のドメインにアクセスできても、そのテスト経路でプロキシ接続が機能している可能性を示すだけで、DOMAIN-SUFFIXの書き方が正しいことの証明にはなりません。

このページのルールの説明は、Global RoutingがConfigに設定され、対象の設定が有効で、接続を再確立していることを前提にしています。画面にSceneも表示される場合は、現在のシーンで実際にどの設定とポリシーが使われているかを確認してください。シーン名そのものをルールとみなさないでください。デバイスによって画面構成が異なる場合があります。現在の画面に表示される選択結果を確認し、「リクエストが最終的にどの処理ロジックを使うか」を明確にしてください。ボタンの位置だけを覚えるのではなく、実際の選択状態を確認することが重要です。

モードと画面上の表示確認するポイント適した検証用途
設定 / Config現在のConfigとRuleの順序ドメイン、アドレス、FINALの振り分けを検証
プロキシ / Proxy選択中のプロキシサーバーと到達性プロキシ接続の問題を切り分ける
直接接続 / Direct現在のネットワークから直接アクセスできるか直接接続経路を比較の基準にする

Generalは2つ目のRuleではない

Generalのオプションは、使用するDNSの参照元、特定のアドレスファミリーを処理するかどうか、特定の処理範囲から除外する対象など、基本的な処理環境に影響します。Rule内の条件を1行ずつ評価する仕組みとは異なります。より上位のネットワーク設定ですでに対象リクエストが除外されている場合、Ruleの末尾にそのリクエスト向けのルールを追加しても、期待どおりに動作しないことがあります。トラブルシューティングではGeneralも確認しますが、一般設定を一度にすべて変更しないでください。

たとえば、dns-server = systemはシステムのDNSを使用することを示します。すべてのリクエストが直接接続される、あるいはアクセス先のドメイン名が必ず解決できるという意味ではありません。接続経路はポリシーによって決まり、名前解決で得たアドレスは後続の接続に使われるため、それぞれ個別に確認する必要があります。元の設定にほかのDNSオプションがある場合は、まず設定どうしの関係を理解してください。例に合わせるために既存の設定全体を置き換えないでください。

[General]
dns-server = system

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

この例では、完全なドメイン名api.example.comだけを明示的にPROXYに振り分けます。Configモードでは、この設定を使って最初の条件を確認できます。別のモードに切り替えると、接続方向を見ても2行の評価順序を証明できません。比較テストでは、最初にモードを記録し、同じリクエストを実行してから、元のConfigに戻してください。一時的に切り替えただけでも、その後のルールテストで共通の前提が崩れることがあります。

接続状態と既存セッション

設定を保存した後も、すでに確立された長時間接続が以前の経路を使い続ける場合があります。ブラウザーの接続再利用、アプリのバックグラウンドセッション、名前解決のキャッシュも確認結果に影響します。テストでは対象アプリの既存セッションをできるだけ終了し、必要に応じて接続を切断して再接続してから、新しいリクエストを送信してください。再生中のメディア接続の経路が変わらないからといって、新しいルールが適用されていないとは限りません。ページがローカルキャッシュから表示された場合も、ネットワーク接続に成功したとは判断できません。

Connectivity Testはサーバーの基本的な接続状態を確認するのに役立ちますが、個別のアプリのリクエストと同じテストではありません。サーバーテストに成功しても、対象ドメインの名前解決に失敗したり、サーバー側がリクエストを拒否したりする場合があります。逆に、ページが一部表示されても、関連するすべてのサブドメインに同じポリシーが適用されたとは限りません。ルールを正しく検証するには、テストアイコンだけに頼らず、具体的なリクエストと一致したルールを確認してください。

03 / DOMAIN

ドメインルールの適用範囲と境界

まず完全なドメイン名で要件を確認し、必要に応じてサフィックスやキーワードへ範囲を広げます。

DOMAIN:完全なドメイン名を1つ指定

DOMAINの照合対象はドメイン名であり、完全なURLではありません。DOMAIN,api.example.com,PROXYはapi.example.comを対象とします。ページのパスに同じ文字列が含まれていても、別のサイトには一致しません。また、www.example.comも自動的に対象になるわけではありません。https://、パス、クエリパラメーター、末尾のポート番号は付けないでください。同じドメイン内の特定のパスを区別したい場合、ドメインルールは適切な方法ではありません。まず、アプリが該当するリクエスト情報を実際に取得できるか確認してください。

完全なドメイン名を指定するルールは、範囲を限定した例外に適しています。メインサイトとほかのサブドメインはプロキシ経由にしつつ、特定の内部APIだけを直接接続する場合は、そのAPIのDOMAINルールを広範囲のサフィックスルールより前に置きます。こうすると「例外を優先する」意図が明確になります。完全なドメイン名の優先度がクライアントによって自動的に高くなるわけではなく、先に評価されるためです。2つの行を入れ替えると、後ろにある例外が適用されない場合があります。

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

DOMAIN-SUFFIX:ドメインのサフィックスとサブドメイン

DOMAIN-SUFFIX,example.com,PROXYは、example.com自体と、api.example.com、img.cdn.example.comなどのサブドメインに一致します。サフィックスはドメインの境界に基づいて判定され、単なる文字列の部分一致ではありません。notexample.comはexample.comのサブドメインではありません。通常はベースドメインをそのまま記述し、*.example.comのように書く必要はありません。サフィックスの値にワイルドカードを使うと、かえって曖昧になります。

サフィックス条件は同じドメイン階層の管理に便利ですが、同じサービスが1つのドメイン階層だけを使うとは限りません。ページが独立したログイン用、静的リソース用、API用のドメインにアクセスすることがあります。そのため、メインサイトのルールが一致していても、画像やログインが別の経路を使う場合があります。実際のリクエストを確認し、必要なドメインの用途を1つずつ確認してください。公共のサフィックス全体に範囲を広げるのは避けましょう。共有ホスティングのドメインでは、範囲を広げすぎると無関係なサービスにも影響します。

DOMAIN-KEYWORD:より広い部分一致

DOMAIN-KEYWORDは、ドメイン名に指定したキーワードが含まれるかどうかを確認します。DOMAIN-KEYWORD,example,PROXYはexample.comのサフィックス条件より範囲が広く、exampleを含む別のドメインにも一致する場合があります。ドメインの運営主体が同じかどうかは判断せず、登録可能なドメイン部分だけに限定して検索するものでもありません。広い部分一致が必要で、意図しない一致を許容できる場合に限り、キーワード条件を使用してください。

対象がapi.example.comとdownload.example.comだけなら、行数を減らすために短すぎるキーワードを使わず、完全なドメイン名またはサフィックス条件を選びましょう。1文字や一般的な略語は、設定の確認が難しく、設定を変更していないのに後から追加されたサイトまで意図せず対象にすることがあります。キーワードルールは見つけやすい場所に置き、一致すべき例と一致してはならない例をいくつか用意して検証してください。

条件設定例適用範囲
DOMAINapi.example.com指定した完全なドメイン名のみ
DOMAIN-SUFFIXexample.comドメイン本体とサブドメイン
DOMAIN-KEYWORDexampleドメイン名に指定文字列を含むもの

ドメインの識別と入力内容の確認

ドメイン条件を使うには、処理フローでリクエストとドメイン名を関連付けられる必要があります。アプリがIPアドレスに直接接続する場合や、照合可能な名前がリクエスト情報に残っていない場合、ドメインルールは意図どおりに機能しないことがあります。その場合は、IPアドレスとログを確認し、IPをDOMAINに記述しないでください。国際化ドメイン名を設定する場合は、実際に識別される表記と一致させる必要があります。コピー時には全角カンマ、見えない空白、混入したURLエンコード文字にも注意してください。

ルールをまとめて整理するときは、まず重複項目を削除し、前方にある広範囲な条件が後続の精密な条件を覆っていないか確認します。同じドメインに異なるポリシーを指定したルールが重複しても、自動的に選択されるわけではありません。適用結果は行の位置で決まります。適用範囲の基本例はDOMAIN、GEOIP、FINALの基本的な書き方を参照してください。このページに戻ったら、ルールの範囲と設定全体の評価順序をあわせて確認しましょう。

04 / IP & GEOIP

IPアドレスの範囲、アドレスファミリー、GEOIP

ドメインルールは「名前」を、IPルールは「接続先」を判定します。両者は置き換えられません。

IP-CIDR:ネットワークプレフィックスで照合

IP-CIDRは、アドレスとプレフィックス長を使ってIPv4アドレスの範囲を指定します。192.168.0.0/16は、16ビットのネットワークプレフィックスで区切られたアドレス範囲を表します。URLが192.168で始まるかどうかを調べるものではありません。通常、プレフィックス長が大きいほど範囲は狭くなります。単一のIPv4アドレスは/32で指定できます。編集前に対象がネットワーク全体か単一のホストかを確認し、サブネットマスク、ポート番号、CIDRプレフィックスを同じパラメーターに混在させないでください。

ローカルネットワーク上のサービスには、通常、ローカルアドレスへの直接接続が必要ですが、例外は実際のネットワーク設定に応じて指定してください。プライベートアドレス範囲をDIRECTにしても、異なるネットワーク間のルーティングが用意されるわけではなく、デバイスやルーターのアクセス制御を自動的に回避するものでもありません。接続するWi-Fiが変わりアドレス範囲が変わると、以前のローカル例外が同じサービスを対象にしなくなることがあります。社内、ゲスト、家庭のネットワークでアドレスが重複する場合もあるため、現在の環境で検証してください。

[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

no-resolve:ルール評価のための名前解決を抑制

IP系ルールでは、no-resolveパラメーターを使って、そのルールの照合だけを目的とした追加の名前解決を行わない意図を示せます。対象アドレスがすでに分かっている場合や、アドレス範囲の確認だけのために名前解決を避けたい場合に適しています。「接続全体でDNSが不要」という意味ではありません。また、後続のプロキシ、アプリ、ほかのルールで名前解決が行われないとも限りません。リクエストにアドレスがすでに含まれているか、後続にどの条件があるかによって、実際の動作は異なります。

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

この例では、明確なドメインポリシーを先に置き、ローカルアドレスの例外を後に置いています。リクエストにドメイン名しかない場合、no-resolve付きのIPルールがそのドメインからプライベートアドレスを必ず判別できるわけではありません。リクエストに接続先IPがすでに含まれている場合は、そのアドレスを使って判定できます。アドレス分類のために名前解決を許可するか、ドメインを基準にした処理を優先するか、必要な動作を選んでください。すべてのIPルールに機械的に同じパラメーターを追加しないようにしましょう。

IP-CIDR6:IPv6の範囲を個別に処理

IPv6はIPv4のネットワーク範囲に自動的に含まれません。環境でIPv6を使用している場合は、テスト対象に含める必要があります。IP-CIDR6もCIDR形式で範囲を指定しますが、アドレスにはIPv6表記を使います。例の2001:db8::/32は書式説明用のドキュメント用アドレス範囲であり、実際のネットワークで使用するものではありません。実際のルールには、自分が管理している、または処理が必要だと確認できたアドレス範囲を指定してください。

[Rule]
IP-CIDR6,2001:db8::/32,DIRECT,no-resolve
FINAL,PROXY

ドメインがIPv4とIPv6の両方のアドレスを返すと、アプリは一方を優先することも、並行して試すこともあります。そのため、一度の成功や失敗だけでは、どのアドレスルールが処理に関与したのか判断しにくい場合があります。使用されたアドレスファミリーと接続先IPをそれぞれ記録し、ルールの適用範囲を確認してください。IPv6経路に問題がある場合は、ネットワークの接続性と設定の対応状況を確認します。アドレスファミリーを任意に無効化することを、あらゆる問題に対する一律の解決策にしないでください。

GEOIP:IPアドレスの地域判定であり、コンテンツの分類ではない

GEOIP,CN,DIRECTは、接続先IPの地理情報をもとに判定します。Webページの言語、サイト運営者、デバイスの所在地を基準にするものではなく、すべてのIPがユーザーの想定どおりに分類される保証もありません。CDN、共有アドレス、サービスの移行により、同じドメインでもネットワークによって異なるアドレスが返ることがあります。そのため、GEOIPに一度一致した結果を、そのサイトのすべてのリクエストに当てはめないでください。

安定したドメインポリシーが必要な場合は、まずドメインの例外を明示し、その後に広範囲なアドレス分類条件としてGEOIPを使う方法を検討してください。分類の違いを調べる際は、その時点で解決されたIP、テストしたネットワーク、一致した行を記録します。「このサイトはこの地域のはず」といった判断だけで済ませないでください。現在使用している地理情報が用途に適しているかも確認しましょう。分類結果は、接続先アドレスやネットワークの到達性を検証する代わりにはなりません。

05 / POLICY & ORDER

ポリシーの意味と最初に一致するルール

最初に一致した条件でポリシーが決まります。「より具体的なルール」が前方のルールを自動的に飛び越えることはありません。

PROXY、DIRECT、REJECTの違い

PROXYはプロキシ経由で処理することを示します。実際に接続できるかどうかは、現在の選択状態と、設定で参照されている有効なサーバーによります。DIRECTは接続先へ直接アクセスすることを示し、「まずプロキシを試し、失敗したら直接接続する」という意味ではありません。REJECTは一致したリクエストを拒否する指定で、パフォーマンス最適化のスイッチではありません。それぞれ目的が異なるため、リクエストが失敗したからといって無作為に切り替えないでください。まず本来使うべき経路を判断し、名前解決、接続、サービスの応答をそれぞれ確認します。

カスタムポリシー名を設定で使用している場合は、その名前が実際に定義され、参照先と定義名が完全に一致しているか確認してください。サーバーの表示名を、そのまま利用可能なポリシー名とみなさないでください。また、定義を含めずに別のファイルから参照だけをコピーしないようにしましょう。このページでは基本的な動作を示すため組み込みのポリシー名を使用しており、カスタムポリシーグループの全定義は扱いません。認識されない名前がある場合は、同じ名前のルールを追加するのではなく、参照関係を修正してください。

上から順に評価。「最も具体的なルールを優先」はしない

Ruleは上から順に評価します。リクエストが条件に一致した時点で、その行のポリシーが適用され、同じリクエストに別のポリシーを適用するために後続のルールを評価することはありません。ルールの種類に、テキスト上の順序を上書きする共通の優先順位はありません。たとえば、先にexample.comのサフィックスルールがあり、後ろにapi.example.comの完全一致ルールがある場合、後者は通常、前者に先に一致するため適用されません。大規模なルール一覧を保守するときによく起こる見落としです。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

api.example.comの場合、最初の完全一致条件に該当してDIRECTになり、サフィックス条件の評価には進みません。www.example.comの場合は最初の条件に一致せず、2番目の条件に一致するためPROXYになります。exampleを含むものの、そのドメインのサフィックスではないドメインは、キーワード条件に一致する場合があります。アドレス系のルールは、それより前の条件で評価が終わらなかった場合にのみ判定されます。独立した別レイヤーが常に上書きすると考えないでください。

FINALは末尾に置くフォールバックルール

FINALには専用のマッチ値がありません。一般的な書式はFINAL,PROXYまたはFINAL,DIRECTです。前のルールに一致しなかったリクエストを処理するため、一覧の最後に置きます。途中にFINALを置くと、その後のルールが通常どおり評価されなくなります。また、新しいルールを単純にファイルの末尾へ追加すると、既存のFINALの後ろに書き込んでしまう場合があります。追加した行の存在だけでなく、編集のたびに末尾の位置を確認してください。

フォールバック先はネットワークの用途に合わせ、テストの期待結果と一致させてください。FINALは、ネットワーク障害時に自動で切り替わる予備サーバーではありません。また、前のPROXYルールで接続に失敗した後、次のルールを実行するものでもありません。ルールが一致してポリシーが決まった後の接続失敗は、そのポリシー経路の問題です。FINALを障害時のフォールバックと誤解すると、プロキシサーバーが使えないときに関係のない末尾のルールばかり変更してしまい、原因を解決できません。

順序を確認しやすい階層に整理する

一般的な整理方法として、まず明確な用途の例外を置き、次に適切な範囲のドメインルール、その後にローカルアドレスと地理情報の条件、最後にFINALを配置します。これは確認しやすくするための方法であり、すべての環境で必須となる固定順序ではありません。特定のアドレス範囲をすべてのドメイン条件より優先する要件がある場合は、そのルールを前方に配置してください。アドレス情報が必要になることや、後続のドメイン判定に影響することを理解したうえで設定します。

評価順序を確認するときは、重要な各ルールについて、一致するはずの入力例と、そのルールを通過するはずの入力例を用意してください。一致する例だけでは、広範囲な条件による上書きを見落とします。古いルールを削除する際にも同じ方法で確認しましょう。長期間使われていないように見える例外が、特定のネットワーク、アドレスファミリー、ログイン手順でだけ必要になる場合があります。設定の品質をルール数で判断するより、それぞれの用途を明確に記録する方が確実です。

06 / DNS & HOST

名前解決とHostマッピング

「名前をどのアドレスに変換するか」と「接続にどのポリシーを適用するか」を区別してから、名前解決の違いを調べます。

DNSの結果と振り分け結果は別々に確認

DNSはドメイン名を接続に必要なアドレスへ変換し、Ruleはリクエストに適用する処理ポリシーを決定します。互いに影響することはありますが、同じ設定ではありません。ドメイン名を解決できても接続に失敗することがあり、経路によって名前解決を行う場所が異なる場合もあります。問題を調べる際は、ドメイン名、取得したアドレス、一致したルール、最終的なポリシーの4点を記録してください。「ドメイン名にIPがある」だけでは振り分けが正しいとは言えず、PROXYと表示されるだけでは接続先に到達できるとは限りません。

Generalで指定したDNSの参照元は、名前解決の環境に影響します。システムのDNSを使う場合、結果はWi-Fi、モバイル通信、システムのネットワーク設定によって変わることがあります。別の参照元を指定する場合も、現在のネットワークから利用できるか、設定に別の名前解決オプションがないかを確認してください。テスト結果を得るために、記録を残さずDNS、サーバー、ルール順序を同時に変更しないでください。アクセスできるようになっても、何が有効だったのか判断できなくなります。

Hostは名前とアドレスの対応関係を明示する

Hostは、自分が管理する実験用サービス、固定の内部デバイス、一時的な移行テストにアドレスを指定する場合に適しています。通常はドメイン名、等号、アドレスの順で記述します。ページのパスやプロトコルのパスワードを記述するものではありません。次の例ではlab.example.comをプライベートアドレスに割り当て、そのドメインのポリシーをDIRECTにしています。Hostはアドレスマッピングを、Ruleは接続の処理方向を、それぞれ指定します。

[General]
dns-server = system

[Rule]
DOMAIN,lab.example.com,DIRECT
FINAL,PROXY

[Host]
lab.example.com = 192.168.10.20

このアドレスが意味を持つのは、ネットワーク上に該当するデバイスとサービスが実際に存在する場合だけです。マッピングを保存しても、サーバーが作成されたり、別のLANにアクセスするためのルートが追加されたりするわけではありません。接続先サービスがHTTPSを使用する場合は、証明書のドメイン名がアクセス先と一致する必要があります。TCP接続できるアドレスをドメインに割り当てても、TLSの検証に成功するとは限りません。証明書エラーが発生した場合はドメイン名、証明書、サービスの設定を確認してください。検証の無効化をHostの通常の手順にしないでください。

公開サービスのアドレスを固定し続けない理由

公開サービスでは、DNSによって接続先が異なる地域、負荷、アドレスファミリーに振り分けられることがあります。特定のアドレスを手動で固定すると、この振り分けが使われなくなります。一時的に接続できたアドレスが、後で移行されたり、サービスを停止したり、現在のネットワークに適さなくなったりする可能性があります。共有サービスでは、リクエストに含まれるドメイン名を使ってサイトを選ぶ場合もあります。Hostは、理由が明確で検証でき、元に戻せるマッピングに使用してください。トラブルシューティングで見つけたIPを、すべてのデバイスに恒久的に設定するのは避けましょう。

一時的なマッピングが必要な場合は、元のドメイン名、解決結果、置き換えたアドレス、元に戻す方法を記録してください。テスト後はマッピングを削除し、通常の名前解決に戻ったか確認します。古いHost項目が残っていると、ドメイン名が以前のアドレスに明示的に割り当てられたままになり、後からDNSを変更しても効果がないように見えることがあります。こうした問題はGeneralのDNS参照元を変更するだけでなく、まずHostに対象の完全なドメイン名がないか検索してください。

キャッシュとアドレスファミリーによる結果の違い

名前解決のキャッシュは、システム、アプリ、ブラウザー、接続処理フローなど、複数の場所に存在する場合があります。設定を保存してすぐにページを更新しても、以前に取得したアドレスや既存の接続が使われることがあります。マッピング変更前後の結果を比較するには、新しいリクエストセッションを開始し、必要に応じて再接続して、実際の接続先アドレスを確認してください。ページが再表示されるかどうかだけでキャッシュが消去されたと判断しないでください。ページ自体がローカルデータから表示されている場合もあります。

もう1つよくある違いは、IPv4とIPv6が共存することです。IPv4アドレスを1つだけマッピングし、1つのアドレスファミリーしかテストしないと、アプリの接続動作全体を説明できない場合があります。アプリの実際の接続記録から最終的に選ばれたアドレスを確認し、対応する範囲がIP-CIDRまたはIP-CIDR6に含まれるか調べてください。IPアドレスに直接接続するリクエストには変換するドメイン名がないため、通常、Hostのドメインマッピングはトラブルシューティングの入り口にはなりません。

07 / REQUEST MATCHING

USER-AGENTとURL Rewrite

これらの条件はリクエスト情報を参照できるかどうかに依存します。任意のアプリや暗号化された内容を識別する機能として扱わないでください。

USER-AGENTで照合する情報

USER-AGENTはリクエスト内で識別可能なUser-Agent情報を対象とします。デバイス上のアプリ名を網羅する汎用インデックスではありません。アプリのアイコンだけで、すべての接続元を特定する機能でも、すべての通信をアプリ単位で振り分ける仕組みでもありません。異なるアプリが同じシステムネットワークコンポーネントを使うことがあり、同じアプリでもリクエストによって識別情報が異なったり、この照合に使える情報が提供されなかったりします。使用する前に、実際のリクエストにどの情報が含まれるか確認してください。

[Rule]
USER-AGENT,ExampleApp*,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

この例では、ExampleAppで始まる識別情報を使って条件の書式を示しています。実際のアプリが必ず一致するという意味ではありません。処理フローで該当するリクエスト情報を取得できる場合に限り、この条件で判定できます。必要な情報が公開されていない接続については、ドメインや接続先アドレスなど、確認可能な情報を使って調べてください。存在しない情報を補うために、あいまいなワイルドカードを追加し続けないでください。

HTTPSではリクエストのパスやヘッダーが自動的に見えるわけではない

通常の振り分けで利用できる名前やアドレス情報と、暗号化されたリクエスト全体を読み取る機能は異なります。ドメインを使ってDOMAIN-SUFFIXで判定できるからといって、HTTPSのパス、クエリパラメーター、User-Agentを読み取れるとは限りません。ルールは、実際に確認可能な情報に基づいて設計してください。本来適用できないヘッダールールを検証するために、証明書の信頼設定を急に変更したり、処理範囲を広げたりしないでください。こうした変更には、セキュリティへの影響と適用条件を個別に理解する必要があります。

特定のサイトを指定した経路で接続することが目的なら、ドメインルールの方が直接的な方法です。リクエスト単位の条件が実際に必要で、処理フローが該当情報を識別できると確認できた場合に限り、USER-AGENTなどの条件を検討してください。検証には自分が管理するテストリクエストを使い、入力する識別情報と期待するポリシーを対応させます。一度アクセスに成功したからといって、その情報が読み取られたと判断しないでください。

URL Rewrite:リクエスト先を書き換える機能であり、プロキシを選ぶ機能ではない

URL Rewriteは、式に一致するURLを処理します。ポリシーを選択するRuleとは役割が異なります。Rewriteは条件に一致したリクエストのアドレスを書き換えたり、リダイレクトしたりします。次の例は、平文のHTTP URLを対象に、example.comへのリクエストを対応するHTTPSアドレスへリダイレクトします。式のドットはエスケープが必要です。先頭のアンカーは照合の開始位置を制限し、キャプチャグループは元のパスを保持するために使います。

[URL Rewrite]
^http://example\.com/(.*)$ https://example.com/$1 302

ここでの302は一時的なリダイレクトを表します。クライアントが後続のリクエストを想定どおりに送信するかどうかは、リクエスト方式やアプリの動作によって異なります。リダイレクト後もすべてのメソッドやリクエストボディが保持されるとは限りません。また、ブラウザーのアドレスバーが変わったからといって、すべてのバックグラウンドAPIが同じルールを通ったとは限りません。まず、単純で観察しやすいリクエストをテストし、応答とリダイレクトの流れを確認してから対象範囲を広げてください。

正規表現では範囲とループを制限する

式を作るときは、まずプロトコル、ドメインの境界、パスの範囲を決めてからキャプチャグループを検討します。ドメイン名のドットをエスケープしないと、正規表現では任意の1文字として扱われ、意図しないアドレスに一致する場合があります。広すぎるキーワードだけを使うと、クエリパラメーターや別サイトに影響することもあります。書き換え後のURLが元の式に再び一致すると、リダイレクトを繰り返す可能性もあります。「元のURL → 新しいURL → 再度一致するか」の流れ全体を確認してください。

アカウントの認証情報、サブスクリプションのトークン、業務用の秘密鍵を共有可能な書き換え例に記載しないでください。説明や記録に使うリクエストからは機密パラメーターを削除し、ルールの動作を再現できる構造だけを残します。実際の設定で機密情報が必要な場合は個人の設定として管理し、トラブルシューティング用の添付ファイルとして公開しないでください。他人の式をコピーする場合も、条件だけでなく書き換え先のドメインとアドレスを確認してください。

設定を確認するときは、RuleだけでなくURL Rewriteも独立した一覧として確認してください。ドメインの振り分けが期待どおりでも、誤った書き換えによってリクエストが別の経路へ送られることがあります。一方、Rewriteルールが存在しても、すべての接続に適用されるわけではありません。リクエストのプロトコル、確認可能な情報、現在の設定によって適用可否が決まります。

08 / VALIDATION

ルールの検証、トラブルシューティング、保守

一度に変更する条件は1つだけにし、新しいリクエストで一致した行と実際の経路を確認します。元に戻せる設定を保存してください。

最小限で元に戻せる検証手順を作る

まず現在正常に動作している設定をコピーします。テストする権限のあるドメインを1つ選び、期待するポリシーを記録してから、完全なドメイン名を指定したルールを1つ追加します。関連する広範囲の条件とFINALより前にあることを確認し、保存してコピーを有効にした後、Global RoutingをConfigに設定します。続いて新しい接続を確立し、対象ドメイン、接続先アドレス、一致した条件、適用されたポリシーを確認してください。すべてが期待どおりになった場合に限り、ルールの範囲を段階的に広げるか、通常の設定に統合します。

動作環境を長い新規設定で直接置き換え、大量の問題から原因を推測するのは避けてください。リモート設定では元の取得元とローカルの差分を保存します。更新されるサブスクリプションでは、サーバーデータの変更とルールファイルの変更を区別してください。更新後に問題が発生した場合は、どの項目が更新されたのかを先に確認します。サーバーアドレスや認証情報の変更と、DOMAINの入力ミスは別の問題です。同じルール変更で両方を解決することはできません。

  1. 現在のネットワーク、Config名、Global Routing、テスト対象を記録し、元のコピーを保存します。
  2. ルールまたはパラメーターを1つだけ変更し、所属セクションと前後のルールによる上書きを確認します。
  3. 保存後、変更したファイルが実際に有効になっていることを確認し、新しいテストセッションを開始します。
  4. ログに記録されたドメイン、アドレス、ルール、ポリシーを照合します。必要に応じてDirectとProxyを比較の基準として使ってください。
  5. Configに戻して結果を記録します。期待どおりでない場合は変更を元に戻し、次の項目を確認します。

現象から原因の範囲を絞り込む

期待したルールの一致記録がまったくない場合は、まずモード、選択中の設定、現在のセッションで実際にリクエストが送信されたかを確認します。次に、ドメインをURLとして入力していないか、前方に広範囲の条件がないか、IPアドレスへ直接接続していないかを調べます。PROXYに一致してもアクセスできない場合は、対象ドメインのルールを追加し続けず、選択中のサーバー、プロトコルのパラメーター、DNS、接続先サービスを確認してください。ルールに一致したかどうかと接続できたかどうかは、別々の結果として記録します。

現象優先して確認する項目次に行う検証
変更しても接続経路が変わらないGlobal Routing、現在のConfig、既存の接続新しいセッションで対象行に一致するか
完全なドメイン名のルールに一致しない前方にあるサフィックス、キーワード、FINAL実際のドメイン名が入力値と一致するか
PROXYに一致しても接続できないサーバーの状態、プロトコルのパラメーター、名前解決同じ接続先への直接接続とプロキシ接続を比較
ページが一部しか読み込まれないAPI、ログイン、リソースの個別ドメイン失敗したリクエストに別のポリシーが適用されたか
更新後に手動追加したルールが消えたリモート設定による上書きとローカルコピー更新前後の差分を確認

プロトコルとルールのトラブルシューティングも分けて行います。たとえばTrojanのアドレス、ポート、パスワード、SNIは接続パラメーターです。詳しくはTrojanのパラメーター設定のポイントを参照してください。Hysteria2とネットワークのUDP環境についてはHysteria2とQUICの解説をご覧ください。プロトコルのパラメーターが間違っている場合、ルールに一致しても認証情報を補うことはできません。

診断情報を共有する前に機密情報を削除

問題の説明に必要な最小限の記録には、ルールの抜粋、使用したモード、対象ドメイン、失敗した段階を含めます。サブスクリプション全体は不要です。共有前にサブスクリプションURLのトークン、サーバーのパスワード、識別情報、プライベートネットワーク情報を削除してください。スクリーンショットではアドレスバー、QRコード、通知欄も確認します。example.comなどの例示用ドメインに置き換える場合は、置き換えた箇所を説明しつつ、ルールの順序と構文は残してください。そうしないと、上書き関係を判断できません。

ルールは実際の用途ごとに保守してください。使わなくなったHost項目を削除し、重複するドメインルールを整理し、FINALが最後にあることを確認します。重要な用途については、いくつかのテスト入力を用意しておきましょう。ネットワークを切り替えた後は、LANアドレスとアドレスファミリーを再確認してください。家庭のWi-Fiで一度確認したからといって、あらゆる環境で問題がないとは限りません。ルールが多いほど適用範囲が正確になるわけではありません。それぞれの例外について、目的、入力例、元に戻す方法を説明できることが、長期的な保守につながります。

クライアントの入手方法と利用条件

Shadowrocketはクローズドソースの商用アプリです。iPhone / iPad版はApp Storeで2.99米ドルの買い切り、Mac(Appleシリコン/Intel)、Windows、Android、Linux版は無料です。アプリの買い切り購入と接続サービスの契約は別です。本サイトではサーバーやサブスクリプションを提供、販売、推奨していません。このマニュアルでは、ユーザーがすでに用意した情報の使い方を解説します。iPhone / iPadのシステム要件はApp Storeの掲載内容をご確認ください。各プラットフォームの入手方法とシステムの許可に関する案内は全プラットフォームのダウンロードページにまとめています。その他のプラットフォームのインストーラーは本サイトの/dl/から取得できます。

接続の許可設定とHome画面を改めて確認する場合ははじめにに戻ってください。入手、購入済みアプリの復元、インストールに関するよくある質問はダウンロードに関するよくある質問をご覧ください。ルールの問題を調べる際は、まず現在の状態を保存し、再現可能な最小限の変更でテストします。結果を説明できない場合は変更を元に戻し、原因をさらに絞り込みましょう。一時的な修正を設定に残し続けないでください。

Shadowrocket 全プラットフォームダウンロード