Shadowrocket カスタムルールの設定:上から順に判定する仕組みと FINALの役割

Shadowrocketのルールは上から順に評価され、最初に一致したルールが適用されます。PROXY・DIRECT・REJECTの意味と、FINALを末尾に置く理由を解説します。

この記事の概要

本記事は、利用中のサービスプロバイダーと接続環境があり、Shadowrocketの設定を編集する方向けです。まずGlobal RoutingがConfigになっていることを確認し、「個別の例外を先に、広い範囲を後に、FINALを最後に」の順でルールを整理します。最小限の設定例、競合例、確認手順を通じて、「ルールに一致していない」場合と「一致後に接続できない」場合を切り分けます。

1. Configを確認:ルール一覧が通信を振り分ける条件

カスタムルールは接続のオン・オフを切り替えるものではなく、接続に必要なサーバー情報を提供するものでもありません。作業前に、利用中のサービスプロバイダーからサブスクリプションまたは接続情報を入手し、接続自体が使えることを確認してください。本記事ではiPhone / iPadのHome、Config、Settingsの画面名を使って説明します。他のプラットフォームでは、対応するルーティングや設定画面で同じ項目を確認してください。

HomeでGlobal Routingを確認します。Configを使う場合、通信の振り分けを調べる際に基準となるのは、現在有効な設定ファイルのルールです。ProxyとDirectはグローバルルーティングのモードであり、個別ルール末尾のPROXY、DIRECTというポリシーとは別のものです。Sceneについても、現在のシーン設定を確認して判断してください。Configと同じ意味ではありません。

リクエストがトンネルに入る 宛先情報を読み取る 上から順に照合する 一致したルールのポリシーを適用する 接続を確立または拒否する

この流れは、設定に基づいて振り分けられるリクエストについて説明したものです。すべてのシステムリクエストが必ず同じ経路で処理されるという意味ではありません。確認する際は、明確な宛先ドメインと新しい接続を使ってください。ステータスバーにVPNマークが表示されているだけで、ルールが有効だと判断しないでください。

2. ルールの構文:マッチ条件と実行ポリシーを分けて読む

一般的なルールは「タイプ、マッチ値、ポリシー」で構成され、各項目は半角カンマで区切ります。タイプは何を調べるか、マッチ値は対象範囲、ポリシーは一致した後の動作を示します。FINALにはマッチ値がないため、通常は2項目です。全角カンマを使ったり、ポリシー名の後ろに説明文を続けたりしないでください。

3項目
一般的な条件ルール:タイプ、マッチ値、ポリシー
2項目
フォールバックルール:FINAL、ポリシー
3種類のポリシー
本記事ではPROXY、DIRECT、REJECTを使用
ルールタイプ例判定する範囲
DOMAINDOMAIN,login.example.com,PROXYlogin.example.comに完全一致します。サブドメインは自動的に含まれません。
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,DIRECTexample.com自体と、そのサブドメイン(www.example.comなど)に一致します。
IP-CIDRIP-CIDR,192.168.50.0/24,DIRECT宛先IPv4アドレスが指定されたネットワーク範囲に含まれるかを確認します。/24はポート番号ではありません。
GEOIPGEOIP,CN,DIRECT宛先IPをローカルのGeoIPデータに基づいて地域分類します。
FINALFINAL,PROXYそれ以前のルールに一致しなかったリクエストを処理します。

ドメインルールのマッチ値には、https://、パス、クエリパラメーター、ポート番号を含めません。たとえば、宛先URLがhttps://login.example.com:443/accountの場合、DOMAINの値はlogin.example.comです。IP-CIDRではURLではなく、アドレスとマスク長を指定します。GEOIPが判定するのはIPの分類であり、ウェブページの言語、ドメインの末尾、サービス運営者の所在地ではありません。

3. PROXY、DIRECT、REJECTで変わること

ポリシーはルールの末尾に指定します。一致したということは処理方法が選ばれたという意味で、宛先への接続が保証されるわけではありません。PROXYは選択した接続とリモートネットワークに依存し、DIRECTはローカルネットワークに依存します。REJECTは意図的に接続を拒否します。以下の2つの設定例はルールの仕組みを説明するもので、同時に読み込む完全な設定ではありません。

ドメイン単位で例外を設定

DOMAIN
login.example.com,PROXY
DOMAIN-SUFFIX
ads.example.com,REJECT
DOMAIN-SUFFIX
example.com,DIRECT

完全一致の例外やサブドメインのブロックは、ドメイン全体を対象とするルールより前に置き、広い条件に先に一致しないようにします。

アドレス範囲で設定

IP-CIDR
192.168.50.0/24,DIRECT
GEOIP
CN,DIRECT
FINAL
PROXY

そのアドレス範囲を本当に直接接続する必要がある場合だけ該当ルールを残し、それ以外のリクエストはFINALで処理します。

同じドメインがログインと他のコンテンツの両方に使われている場合、広い範囲にREJECTを適用するとログインまでブロックすることがあります。まず実際に処理したい宛先を確認し、マッチ範囲を絞ってください。「ページの一部が表示されない」だけでルールが正しく動いていると判断せず、接続の失敗をすべてプロキシの問題と決めつけないようにしましょう。

4. マッチ順序:条件が具体的でも自動的に優先されない

ルール一覧は先頭から順に確認され、最初に一致したルールが今回のリクエストに適用されます。それ以降のルールは判定に使われません。DOMAINはDOMAIN-SUFFIXより対象が具体的ですが、その具体性によって行の順番が自動的に覆ることはありません。同様に、REJECTにも先行するDIRECTルールを飛び越える特別な優先順位はありません。

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

この順序では、login.example.comへのアクセスは最初の行に一致します。example.comのサブドメインだからです。2行目のほうが具体的でも、適用される機会はありません。ログイン用ドメインをPROXY、その他のサブドメインをDIRECTにするには、先頭2行を入れ替えます。

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

結論:例外は対象となる広い範囲のルールより前に置く

ルールを追加したら、まず上の行に同じ対象をカバーする条件がないか確認します。該当するルールがあれば、同じルールを何度も追加するのではなく、順序を変えるか、上のルールの範囲を狭めてください。

「具体的な条件を先に置く」のはルール整理に役立つ方法ですが、実際の原則は最初に一致したルールが優先されることです。たとえば、特定のIPにPROXYを適用する必要がある場合、そのIPをカバーする可能性のあるGEOIPの直接接続ルールより前に置きます。ドメインルールが必ずアドレスルールより優先される、あるいは特定のポリシーが他より強いと考えないでください。

5. FINALを最後に置く理由

FINALは特定のドメインやアドレスを照合せず、それまでのルールに一致しなかったリクエストを処理します。リストの途中に置くと、その位置で残りのルール判定が終わります。下に構文として正しいDOMAIN、IP-CIDR、GEOIPがあっても、FINALが処理したリクエストには適用されません。

[Rule]
DOMAIN,login.example.com,PROXY
DOMAIN-SUFFIX,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.50.0/24,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY

これはルールの順序を理解するための最小限の例であり、すべてのネットワークに適した既定の設定ではありません。example.comとそのサブドメインは説明用です。ローカルネットワークの範囲も、実際に必要な範囲に置き換えてください。既存の設定に[Rule]がある場合は、同じ名前のセクションを貼り付け直さず、そのセクション内でルールを整理します。

  1. login.example.comは1行目のPROXYに一致し、後続のドメインサフィックスルールには進みません。
  2. ads.example.comは2行目のREJECTに一致します。サブドメインもこのサフィックスの範囲に含まれます。
  3. www.example.comは3行目のDIRECTに一致します。ただし、リクエストから照合可能な宛先ドメインを取得できることが前提です。
  4. 宛先アドレス192.168.50.10は例示した/24ネットワークに含まれます。それまでのルールに一致しなければ、4行目で処理されます。
  5. 残りのリクエストはGEOIPの判定に進み、そこにも一致しない場合にFINALで指定したPROXYが適用されます。

FINALのポリシーは自分で選ぶ必要があります。FINAL,PROXYは分類されなかったリクエストをプロキシ経由で処理し、FINAL,DIRECTは直接接続します。ネットワークの要件を問わず、どちらかが常に正しいということはありません。運用時はFINALを明確に1つだけ残し、有効なルールの最後に配置してください。

IP系のルールはドメイン解決を伴う場合があり、判定結果は実際の宛先IP、DNSの応答、GeoIPデータにも左右されます。IPアドレスを直接指定した接続では、DOMAINの照合に使えるドメイン情報がないことがあります。そのため、ドメイン名でのアクセスとIPアドレスへの直接アクセスを、まったく同じテストとして扱わないでください。

6. 保存と確認:設定が反映されていない場合と接続できない場合を切り分ける

編集前に、現在使えている設定のコピーを保存してください。確認時は、宛先または順序を一度に1つだけ変更し、変更前後の結果を記録します。DNS、ルーティングモード、ルール一覧を同時に変更すると、どの変更が影響したのか判断できなくなります。

  1. 編集中のファイルを確認:Configを開き、現在使用中の設定を確認してから編集画面に進みます。リモート設定とローカルコピーは区別してください。
  2. ルールセクションを確認:[Rule]内を編集し、半角カンマを使います。ポリシー名のスペルを確認し、FINALを末尾に移動してください。
  3. 保存して適用:編集後に保存し、その設定が引き続き使用中であることを確認します。Homeに戻り、Global RoutingがConfigになっていることを確認してください。
  4. 新しい接続を確立:保存後に再接続し、テストするページやアプリを開き直してください。既存の長時間接続を新しいルールの結果と混同しないためです。
  5. 記録を確認:リクエストまたは接続の記録からテスト対象を探し、確認できる一致ルール、ポリシー、宛先アドレス情報を確認します。まず想定したルールに一致しているかを確認してから、接続エラーを調べてください。
  6. 問題の範囲を絞る:PROXYに一致した後もタイムアウトする場合は、選択中の接続とサービスプロバイダーの状態を確認します。REJECTに一致して失敗した場合は、そのポリシーによる想定どおりの動作です。

サブスクリプションの更新と設定ファイルの更新も区別してください。接続用サブスクリプションの更新は通常、サービスプロバイダーが提供する接続情報を更新するもので、現在の[Rule]が書き換わったことを意味しません。リモート設定を更新すると、ファイルの内容が置き換わる場合があります。長期的に維持するカスタムルールをどの設定ファイルに置くか明確にし、更新後にも内容を確認してください。

一度「開けた」だけで、通信の振り分けが正しいと判断しないでください。同じページでも、メインドメイン、画像用ドメイン、API用ドメインに接続し、それぞれ異なるルールに一致することがあります。関連するリクエストを個別に確認してください。また、調査時に認証情報を含むサブスクリプションURLや設定全体を公開しないでください。

7. ルールが反映されないときによくある質問

REJECTを追加したのに、なぜ接続できるのですか?

まず、その上に同じ宛先をカバーするDIRECT、PROXY、FINALがないか確認します。次にGlobal RoutingがConfigであることと、編集したファイルが現在有効なファイルであることを確認してください。その後、新しい接続を確立し、実際のリクエスト先ドメインを確認します。ページが使用するAPIのドメインは、アドレスバーのドメインと異なる場合があります。

FINALの後ろにルールを追加できますか?

ファイルに後続のテキストを書くことはできますが、FINALがそれまでに一致しなかったリクエストを処理した後は、通常のルールでそれらを処理する機会はありません。必要なルールをFINALより上に移し、メンテナンス時に誤解しないよう、余分なFINALは削除してください。

On Demandを有効にしているのに、なぜドメインごとに振り分けられないのですか?

Settings → On Demandは自動接続の条件を設定するもので、Global Routingの選択を置き換えるものではありません。Homeに戻ってConfigモードを確認し、Configで使用中のファイルを確認してください。自動接続のスイッチをルーティング設定の代わりに使わないでください。

サブスクリプションの更新は成功したのに、追加したルールが反映されないように見えるのはなぜですか?

まず、更新したのが接続用サブスクリプションかリモート設定かを確認します。前者はルールが更新された証拠にはなりません。後者はローカルでの変更を上書きする場合があります。現在の設定を開いて実際の[Rule]の内容を確認し、明確な宛先への新しい接続で検証してください。

昨日は同じドメインに直接接続できたのに、今日は別のルールに一致するのはなぜですか?

まず、一致記録、実際の宛先IP、現在の設定を比較してください。DNSの応答アドレスが変わると、IP-CIDRやGEOIPの判定も変わることがあります。リモート設定の更新で行順が変わっている可能性もあります。ドメイン単位で安定して処理したい場合は、該当するDOMAINまたはDOMAIN-SUFFIXルールを関連するアドレスルールより前に置いてください。

Shadowrocketの入手と設定の続き

iPhone / iPad版はApp Storeで2.99米ドルの買い切りです。Mac(Appleシリコン / Intel)、Windows、Android、Linux版は無料です。iPhone / iPadのシステム要件はApp Storeのページをご確認ください。ダウンロードページでプラットフォームを選び、ガイドに沿って手持ちの設定とサブスクリプションを読み込んでください。

アプリの買い切り購入と接続プランは別です。接続に必要なサブスクリプションは、ご利用のサービスプロバイダーから入手してください。当サイトではアプリの入手方法と設定を案内しており、接続先やサブスクリプションの提供・販売・推奨はしていません。

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