2026年8月3日 · ルールと振り分け · 約8分

Shadowrocketのカスタムルールの優先順位|上から順に評価する仕組みとFINALの設定方法

Shadowrocketの[Rule]は上から順に評価され、最初に一致したルールが適用されます。DOMAIN-SUFFIXやIP-CIDRの順序、PROXY・DIRECT・REJECTの違い、FINALの設定方法を解説します。

この記事の概要

Shadowrocketのカスタムルールは、個別の例外を先に置き、対象範囲の広いルールを続け、最後にFINALで残りの通信を処理します。利用中のサービスやサブスクリプションがあり、既存の設定を調整したい方向けの記事です。Configでルールの順序を確認し、HomeでConfigを選択したうえで、一度に一項目ずつ変更して動作を確かめましょう。

1. ルールの優先順位:重要なのは行の順序

設定に基づいて通信を振り分ける場合、[Rule]セクションは上から順に評価されます。ルールに一致すると、そのルールで指定されたポリシーが適用され、後続の「より詳細なルール」は評価されません。そのため、ルールの種類だけで行の順序に代わる共通の優先順位が決まるわけではありません。DOMAINをDOMAIN-SUFFIXの後に書いても、自動的に優先度が上がることはありません。

たとえば、api.example.comはDIRECTにし、example.comのほかのサブドメインはプロキシ経由にしたい場合は、個別ドメインの例外を先に記述します。以下のドメインは構文を説明するための例であり、サービスの提供先や利用可能性を示すものではありません。

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

最初の2つのルールを入れ替えると、api.example.comも広いドメインサフィックスの条件に一致し、先にPROXYが適用されます。「DIRECTと書いたのにプロキシ経由になる」場合は、末尾に同じルールを追加するのではなく、対象ルールより前に一致するルールがないか確認してください。

3種類
この記事で扱う基本ポリシー:PROXY / DIRECT / REJECT
32ビット
IPv4アドレスの長さ。/32は単一のアドレスを表します
1行
この記事の設定例では末尾にFINALを1行記述

2. Global Routingを確認してからConfigを編集

設定ファイルにルールが書かれていても、現在の接続が必ずそのルールで振り分けられるとは限りません。Home → Global Routingを開いて現在のモードを確認し、Configで使用中のファイルを確認します。以下では、今回の検証に関係する3つのモードを比較します。Sceneはシーンごとの設定に使います。この記事のルールを調べる際は、シーン切り替えによる変数を減らすため、まずConfigを明示的に選択してください。

Config

おすすめ

現在の設定に従ってルールで通信を振り分けます。プロキシ、直接接続、拒否のいずれになるかは、一致したルールのポリシー(末尾のFINALを含む)で決まります。

用途:この記事のルール順序とドメイン例外を検証する場合。

Proxy

通信をプロキシモードで処理するため、その結果だけではカスタム振り分けルールに一致したことを確認できません。ルールの影響を切り分け、既存のプロキシ接続自体が使えるかを確かめるときに利用できます。

用途:プロキシ接続とルールによる振り分けの違いを一時的に比較する場合。

Direct

通信を直接接続モードで処理します。Directを選択している場合、設定にPROXYと書かれていても、この記事で扱うプロキシルールが適用されるとは限りません。

用途:ローカルネットワークからの直接接続と比較する場合。

確認の順序:動作条件を確かめてからルールを移動

HomeでGlobal RoutingがConfigになっていることを確認し、Configで使用中のファイルを確認してからテストします。そうしないと、現在の振り分けに使われていないファイルのルールを変更しているだけかもしれません。

  1. 設定をバックアップ

    Configを開き、まず現在のファイルを複製するか、バックアップをエクスポートして、元に戻せる状態にします。追加した数行だけを保存するのではなく、元のルール全体を残してください。

  2. 編集画面を開く

    Configで対象の設定ファイルの編集画面を開き、[Rule]セクションを探します。編集対象が設定ファイルの本文であり、Homeのサーバー接続パラメータではないことを確認してください。

  3. ルールを並べ替える

    個別ドメインの例外を、該当する広範なルールより前に置きます。続けてIP範囲とGEOIPの項目を確認し、末尾にFINALを残します。保存後、そのファイルが選択されていることを確かめてください。

  4. モードを確認

    Home → Global Routing → Configに戻り、使用するサーバーが正しく選択されていることを確認してから接続を開始します。システムのVPN構成への許可が必要な場合は、画面の案内に従ってください。

  5. 新しいリクエストを送信

    対象のページを閉じてから再度アクセスします。必要に応じて接続をやり直し、新しいルールを以前の接続で判断しないようにしてください。次の変更に進む前に、対象ドメイン、時刻、一致したルールを記録します。

3. DOMAIN-SUFFIX、IP-CIDR、GEOIPの並べ方

どの対象に一致するルールかと、何行目に記述するかは別の問題です。ドメインルールはホスト名、IPルールは宛先アドレスを確認し、GEOIPはIPアドレスのデータベース分類に基づいて判定します。ドメインのリクエストは複数のアドレスに解決されることがあり、同じドメインでもネットワーク環境によって異なるアドレスに解決されます。一度IPルールに一致したからといって、そのドメインに恒久的に当てはまる性質だと考えないでください。

キーワード構文例確認ポイント
DOMAINDOMAIN,api.example.com,DIRECT指定したドメインに一致。個別例外に使用します。
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,PROXYそのドメインとサブドメインに適用。プロトコルやパスは記述しません。
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolveIPv4のネットワーク範囲に一致。範囲はプレフィックス長で決まります。
GEOIPGEOIP,CN,DIRECTIPアドレスのデータベース分類に基づく判定で、Webページの言語による分類ではありません。
FINALFINAL,PROXYそれまでのルールに一致しなかったリクエストを処理します。ルールの末尾に置きます。

DOMAIN-SUFFIXにはexample.comを記述します。https://を含む完全なURLや、example.com/pathではありません。パスはURLの別の部分です。ドメイン欄に貼り付けても、「このページだけをプロキシ経由にする」という指定にはなりません。また、Webサイトで一般的なHTTPSのポート443を使っているからといって、ルールにポート条件が自動的に追加されるわけではありません。

no-resolveは、このIPルールとの照合のために追加のドメイン名前解決を行わない指定です。設定全体のDNSを無効にするものでも、このネットワーク範囲に今後一致しなくなるという意味でもありません。判定に使える宛先IPがすでにある場合は、引き続きアドレス範囲で判定できます。ドメインしか分からず、このルールのための名前解決も行いたくない場合は、解決を省略するとリクエストが後続のルールに進む可能性があることを理解しておきましょう。

4. PROXY、DIRECT、REJECT、FINALの設定例

ルール末尾のポリシーによって、一致した後の動作が決まります。PROXYはプロキシ経由で処理し、DIRECTは宛先に直接接続し、REJECTはリクエストを拒否します。これらはサーバーのプロトコルとは別の設定です。既存サーバーのプロトコルをShadowsocksからTrojanに変更しても、ルールを上から順に評価する基本的な仕組みは変わりません。

以下は解説用の[Rule]セクションであり、既存の設定すべてを置き換えられる完全な設定ファイルではありません。利用可能なサーバーをすでにお持ちであることを前提としています。例示ドメインはサービスを提供しません。実際の設定に統合する前に、使用中のポリシー名、ほかのルール、必要なネットワーク範囲を確認してください。

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

FINALをルールの途中に置くと、それ以降の未分類リクエストがそこで処理され、後続の項目が意図どおりに機能しなくなります。設定を管理するときは、明確なフォールバックを末尾に1つだけ残してください。既存設定に2つ目のFINALが残っていると、内容を誤解する原因になります。

5. 一度に一項目ずつ試してルールが効かない原因を特定

確認は「現在のファイル → 現在のモード → リクエスト先 → 実際に一致したルール → 接続結果」の順に行います。Webページが開けても分かるのはリクエストが成功したことだけで、どの経路を通ったかまでは判断できません。ページが開けない原因も、REJECT、接続先サービスの障害、プロキシ接続の問題などが考えられます。ルールの一致判定と接続の成否は分けて記録してください。

  1. 基準状態を記録:同じネットワーク、同じ既存サーバー、同じ接続先を使い、変更前の状態を記録します。サーバーとルールを同時に変更しないでください。
  2. 変更は1行だけ:たとえばDOMAINとDOMAIN-SUFFIXの順序だけを入れ替えます。保存してその設定が選択されていることを確かめた後、リクエストを再送します。
  3. リクエスト情報を確認:アプリの接続記録やログで、今回の宛先ホスト、宛先IP、確認できるポリシー情報を探します。IPしか表示されない場合は、ドメイン情報が取得できているかを先に確認してください。
  4. ページ全体の構成を確認:ページ本文、画像、ログイン用APIはそれぞれ異なるドメインを使う場合があります。メインサイトにルールを1つ追加しただけでは、ページが必要とする通信すべてをカバーできないことがあります。
  5. 変更前と比較:直前の変更を元に戻し、再度アクセスします。変更を繰り返しても結果が変わらない場合は、キャッシュ、以前の接続、接続先サービスの状態を引き続き確認してください。

サブスクリプションの更新と設定ファイルの編集も、分けて考える必要があります。Homeで既存のサーバーサブスクリプションを更新する操作は、主にサーバー項目を更新します。Configでリモート設定を更新すると、設定ファイルの本文が置き換わることがあります。どちらも「ルールの更新」と捉えてはいけません。リモート設定を変更する前にローカルコピーを保存し、更新後に例外ルールとFINALが残っているか確認してください。

まとめ:ルールの順序は再現できる変化で確認

2つのルールの順序だけを入れ替えたときに、同じ接続先のポリシーも変わるなら、順序の問題を特定する直接的な根拠になります。1回だけ速度が上がったり遅延が下がったりしても、ルールが正しく適用された証拠にはなりません。

6. ルールの順序とFINALに関するよくある質問

末尾にDIRECTを追加したのに、なぜプロキシ経由になりますか?

まずHome → Global RoutingでConfigが選択されていることを確認し、次にConfigでこのDIRECTより前に一致するDOMAIN-SUFFIX、IP-CIDR、FINALがないかを調べます。個別例外を、それを上書きするルールより前に移動して保存し、新しい接続でテストしてください。

FINAL,PROXYを設定すると、すべてのリクエストがプロキシ経由になりますか?

いいえ。それまでのルールに一致しなかったリクエストだけを処理します。DIRECTまたはREJECTに先に一致したリクエストはFINALに進みません。プロキシ接続自体を調べる場合は、Global RoutingのProxyモードで一時的に比較し、テスト後にConfigへ戻してください。

GEOIP,CN,DIRECTを1行目に置くと簡単ですか?

後続の例外よりも先に適用されてもよい場合に限り、その順序にします。特定の接続先を必ずPROXYにしたい場合は、そのドメインルールをGEOIPより前に置き、今回のリクエストで照合可能なドメイン情報が得られているか確認してください。

On Demandを有効にすると、ルールの順序は変わりますか?

いいえ。Settings → On Demandはオンデマンド接続の条件を管理するもので、[Rule]の順序は変更しません。接続が自動的に開始されるタイミングには影響する場合があります。問題を調べるときは、接続条件を一定に保ち、HomeのGlobal Routingも別途確認してください。

更新後にカスタムルールが見当たらない場合、どこを確認すればよいですか?

まずConfigで使用中のファイルが切り替わっていないか確認し、次にリモート設定の本文が更新されたかを調べます。変更前のバックアップと[Rule]を比較し、必要な例外だけを作業用コピーに戻してください。FINALを重複して追加して解決しようとしないでください。

App Store正規配信ページの確認