2026-09-09 · ルールと振り分け · 約10分

Shadowrocketのルール設定入門:DOMAIN・DOMAIN-SUFFIX・DOMAIN-KEYWORD・GEOIP・IP-CIDR・FINALのマッチ条件

6種類のルールキーワードの対象と範囲、上から順に照合して最初の一致で確定する仕組み、PROXY・DIRECT・REJECTの設定方法を解説します。

この記事の概要

この記事は、Shadowrocketで自分の接続設定を保存し、ルールによる振り分けを編集する方を対象としています。まずドメインルールとIPルールを区別し、最小限の設定例でルールの順序と最終フォールバックを確認します。最後にConfigとHomeで設定結果を検証します。例示するドメインとアドレスは構文の説明用であり、利用可能な接続サービスを示すものではありません。

1. ルールの適用前にGlobal Routingと設定ファイルを確認

ルールは設定ファイルの[Rule]セクションに記述します。このセクションの順序を変更する意味があるのは、リクエストが設定に基づく振り分け処理に入っている場合だけです。まずHome → Global Routingで現在の選択肢を確認し、画面上部の接続スイッチだけでルールの適用状況を判断しないでください。

選択肢用途確認するポイント
Proxyトラフィックをプロキシ経由で処理カスタム振り分けルールを1件ずつ検証する設定ではありません。
Directトラフィックを直接接続で処理プロキシルールを変更しても、この選択肢の切り替えにはなりません。
Config現在の設定ファイルに従ってトラフィックを処理この記事では、この選択肢を使ってルールを検証します。
Sceneシーンの設定に従ってルーティングを決定まず、シーンで実際に選択されているルーティング方式と設定を確認してください。

Configでは設定ファイルを管理し、Homeでは接続状態とGlobal Routingを確認します。Settings → On Demandでは条件に応じて接続を開始する動作を管理しますが、DOMAINを別のマッチタイプに変更したり、ルールの並び順を置き換えたりする機能ではありません。トラブルの切り分けでは、「接続が開始されているか」と「どのルールに一致したか」を分けて記録してください。

リクエストがトンネルに入る ルーティング方式を確認 ルールを順に確認 一致したルールのポリシーを適用 外向き接続を確立

2. DOMAIN・DOMAIN-SUFFIX・DOMAIN-KEYWORDのマッチ範囲

この3種類のルールが判定するのはドメインです。Webページの本文やURLのパスを基準に振り分けるものではありません。ルールのドメイン欄にはhttps://や/loginを付けず、ポート番号もホスト名に含めません。たとえばhttps://api.example.com:8443/loginへのアクセスで、ドメイン照合の対象となるのはapi.example.comです。

ルールマッチするマッチしない
DOMAIN,example.com,DIRECTexample.comapi.example.com
DOMAIN-SUFFIX,example.com,DIRECTexample.com、api.example.comnotexample.com
DOMAIN-KEYWORD,example,PROXYexample.com、myexample.netsample.net

DOMAINは、特定のホスト名を個別に処理する場合に適しています。DOMAIN-SUFFIXはドメイン階層に沿ってルートドメインとサブドメインを対象にします。example.comと記述すればよく、*.example.comにする必要はありません。DOMAIN-KEYWORDはドメインに含まれるキーワードを調べます。同じルートドメインに限定されないため、名前が似ている別のドメインまで対象にしてしまうことがあります。

要点:ドメイン階層で指定できる場合は、広範なキーワードを使わない

ルートドメインとそのサブドメインをまとめて対象にする場合は、DOMAIN-SUFFIXを優先してください。異なるルートドメインにまたがる同じ文字列を本当に照合する必要がある場合に限り、DOMAIN-KEYWORDを使い、実際に一致するホスト名を確認します。

3. GEOIPとIP-CIDR:ドメイン文字列ではなく宛先IPを照合

GEOIPは、宛先IPが地理情報データベースでどの地域に割り当てられているかを基準に照合します。たとえばGEOIP,CN,DIRECTは、データベースでCNに分類された宛先アドレスにDIRECTを適用します。Webサイトの言語、ドメインの末尾、ユーザーの所在地で判定するものではありません。また、データベース上の地域とWebサイト運営者の所在地は同じとは限りません。

IP-CIDRはIPv4アドレス範囲にマッチします。192.0.2.0/24は先頭24ビットが固定されたネットワークを表し、192.0.2.0から192.0.2.255までが対象です。192.0.2.8/32は1つのアドレスだけにマッチします。ここに示したアドレスは文書用の例であり、実際のサービスへの接続確認には使えません。

IP-CIDR,192.0.2.8/32,REJECT,no-resolve
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

上の例では、単一アドレスのルールをネットワーク全体のルールより前に置いています。そのため宛先が192.0.2.8の場合、最初にREJECTが適用され、後続のネットワーク範囲のDIRECTには進みません。これは記述順によるもので、システムが/32に自動で高い優先度を与えているわけではありません。

4. 上から順に照合し、最初の一致で確定。FINALは末尾に配置

この記事で扱う通常のルールは、上から順に照合し、一致したルールのポリシーを適用した時点で判定が終了します。後続の通常ルールで再判定されることはありません。より細かい条件のルールが、前にある広範なルールを自動的に飛び越えることもありません。例外を設ける場合は、そのルールを前に移動してください。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,telemetry,REJECT
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
  1. login.example.comへのリクエストは最初のルールに一致するため、DIRECTが適用されます。
  2. img.example.comへのリクエストは最初のルールには一致せず、2番目のルールに一致するため、PROXYが適用されます。
  3. telemetry.example.comへのリクエストは2番目のルールに先に一致するため、3番目のルールは適用されません。拒否するには、該当する拒否ルールを2番目のルールより前に移動してください。
  4. 前のルールに一致しなかったリクエストには、最後にFINAL,PROXYが適用されます。FINALにはドメイン欄やアドレス欄はなく、キーワードとポリシーだけで記述します。

FINALを先頭に置くと、後続の通常ルールが照合されなくなります。設定を管理する際は、内容が明確な最終フォールバックを1つだけ残し、末尾に置いてください。ルールを追加し続けて順序の問題を解決しようとせず、先に一致しているルールを特定します。

上記の設定例はマッチ順序の説明用であり、汎用の振り分けルール一覧ではありません。既存の設定に適用する前に、各ポリシーが目的に合っていることを確認し、元の設定のコピーを保存してください。

5. PROXY・DIRECT・REJECTの役割

ルールの最後の主要フィールドで、一致後の処理方法が決まります。キーワードは「何にマッチさせるか」、ポリシーは「どう処理するか」を指定するもので、互いに置き換えることはできません。この記事は、ユーザーがすでに自分の接続サービスと接続設定を持っていることを前提とし、ノード、サブスクリプション、その他の接続サービスの提供・販売・推奨は行いません。

ポリシー動作例
PROXYプロキシ経由で外向き接続します。利用可能なプロキシの選択が必要です。DOMAIN,api.example.com,PROXY
DIRECTプロキシを経由せず、現在のネットワークから宛先に直接接続します。DOMAIN,local.example.com,DIRECT
REJECT一致したリクエストを拒否します。DOMAIN,blocked.example.com,REJECT

PROXYはプロトコル名ではありません。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuardは接続設定で使うプロトコルであり、ここで使う基本ポリシーの記述をそのまま置き換えることはできません。ルールがPROXYに一致しても、宛先サービスに接続できるとは限りません。接続パラメータ、DNS、接続先の状態をそれぞれ確認してください。

DIRECTは、Shadowrocketのルール判定を経由しないという意味ではありません。一致後の外向き接続に直接接続を選ぶ指定です。REJECTによってページやリソースの読み込みに失敗するのは、意図した結果である場合があります。ログイン用APIを誤って拒否している場合は、ページ本体が開いてもサイトの機能が正常とは限りません。

6. Configで変更し、新しいリクエストで検証

一度に変更するのはルール1つ、または順序1か所にとどめ、検証してから次に進むことをおすすめします。サブスクリプションの更新は主にユーザーが登録済みのサーバー一覧に関するもので、現在有効な設定の[Rule]セクションが変更されたことを意味しません。リモート設定の再更新でローカルの変更が上書きされることもあるため、テスト前にコピーを保存してください。

  1. 元の設定を保存

    Configを開き、現在有効なファイルを確認して、復元できるコピーを先に保存します。テスト後に元に戻せるよう、変更前のGlobal Routingも記録してください。

  2. ルールセクションを編集

    Configで対象ファイルの編集画面を開き、[Rule]を探します。単一ホストの例外はドメインサフィックスのルールより前に置き、FINALは末尾に配置してください。フィールドは半角カンマで区切ります。

  3. 変更後の設定が有効か確認

    保存後、Configで変更したファイルが有効になっていることを確認します。Home → Global Routingに戻り、Configを選択してから、Homeの接続状態も確認してください。

  4. リクエストを再実行

    テスト中のページを閉じてから再度開きます。確立済みの長時間接続が引き継がれないよう、必要に応じて接続を再確立してください。接続ログで確認できる宛先ドメイン、宛先IP、一致したルール、ポリシーを確認します。

  5. 一致したルールを確認

    ポリシーが想定と異なる場合は、一致した位置から上に向かって、より広い範囲のルールを確認してください。ルールには正しく一致しているのにアクセスできない場合は、DNS、既存のプロキシ設定、接続先サービスを確認し、順序を闇雲に変更しないでください。

7. ルールが適用されない場合とアクセスエラーの切り分け

まず「想定したルールに一致していない」場合と「ルールには一致したが接続できない」場合を区別します。前者ではGlobal Routing、現在の設定ファイル、ルールの順序を優先して確認し、後者では名前解決と接続の過程を確認してください。Home → Connectivity Testの結果だけで、特定ドメインへのすべてのWebリクエストが完了できるとは判断できません。

エラー:NSURLErrorDomain Code=-1003

原因:Appleのネットワークエラーで、ホスト名が見つからない場合に使われるコードです。診断ログにこのコードがある場合は、プロキシポリシーの誤りと決めつけず、まずドメインの綴りと名前解決の結果を確認してください。

対処:実際のリクエスト先ドメインを確認し、現在の設定の[General]にあるDNS関連の設定と、[Host]に誤ったマッピングがないかを確認してから、新しいリクエストを実行してください。

エラー:NSURLErrorDomain Code=-1001

原因:Appleのネットワークエラーで、リクエストがタイムアウトした場合に使われるコードです。タイムアウトだけでは、直接接続、プロキシ経由の外向き接続、接続先サービスの無応答のどれが原因かは判断できません。

対処:まず今回のリクエストに適用されたポリシーを確認し、次に対応する外向き接続の疎通を確認します。同じ宛先を使って再現テストを行い、設定は一度に1項目だけ変更してください。

ここで説明したのはAppleのネットワークエラーコードの意味であり、Shadowrocketのすべての画面に固定表示されるエラー文ではありません。ログに同じコードがない場合は、実際のエラー内容に沿って原因を確認してください。画面の読み込みが続いているだけで、同じエラーだと判断しないでください。

DOMAINを設定したのに、サブドメインがプロキシ経由になるのはなぜですか?

DOMAIN,example.com,DIRECTがマッチするのはルートドメインだけです。サブドメインも同じように処理するには、DOMAIN-SUFFIX,example.com,DIRECTに変更し、Configで保存してファイルを有効にした後、新しいリクエストを実行してください。

より具体的なルールが下にあるのに、先に適用されないのはなぜですか?

ルールは「具体性」に基づいて自動的に並べ替えられません。DOMAIN,login.example.com,DIRECTを、その範囲を含むDOMAIN-SUFFIXより前に移動し、新しいリクエストがこの例外ルールに一致することを確認してください。

サブスクリプションを更新したのに、ルールが変わらないのはなぜですか?

サーバーのサブスクリプションと振り分け設定は別のものです。Configで現在のファイルの[Rule]の内容を確認し、Home → Global RoutingでConfigが選択されていることを確認してください。Homeのサーバー一覧が更新されたかどうかだけで判断しないでください。

ルールを変更したのに、再生中の動画に反映されないのはなぜですか?

既存の接続では、接続確立時の外向き経路が引き続き使われる場合があります。再生を停止し、対象のページを閉じてからリクエストをやり直してください。必要に応じてShadowrocketの接続を再確立し、新しい接続ログでルールの効果を確認します。

ShadowrocketをApp Storeでダウンロード