ShadowrocketのREJECTルール設定方法|ブロックの仕組み・マッチ順序・注意点

ShadowrocketのREJECTルールの仕組みや書き方、ルールの順序による違いを解説。ドメイン指定でブロックできないケースも紹介します。

この記事の概要

この記事は、Shadowrocketで手元の設定を使っており、ブロックルールを少し追加したい方を対象としています。まずルールの条件とREJECTポリシーを区別し、「設定をバックアップする」「対象を絞ったルールを追加する」「順序を確認する」「新しいリクエストで検証する」の手順で進めます。例には予約済みドメインと文書用アドレスを使い、構文を説明します。既存の設定とそのまま置き換えられるブロックリストではありません。

1. REJECTはポリシーであり、ドメインのマッチ条件ではない

ルールは通常、マッチタイプ、マッチ対象、処理ポリシーで構成されます。たとえば DOMAIN-SUFFIX,ads.example.com,REJECT の場合、DOMAIN-SUFFIX がマッチ方法を指定し、ads.example.com が照合するドメインサフィックス、REJECT が一致した場合の処理ポリシーです。REJECT だけでは、どのドメインを拒否するのか指定できません。

リクエストがShadowrocketの処理対象となり、現在の設定に基づいてルールが照合されると、REJECTに一致した接続は拒否されます。そのリクエストに本来適用される可能性があったDIRECTやプロキシ経由の処理には進みません。ウェブページの要素を削除したり、空白になった領域を再レイアウトしたりする機能ではありません。アプリ側では読み込みエラーやプレースホルダー、再試行の案内が表示される場合があります。

アプリがリクエストを送信 処理対象に入る 設定ルールを照合 拒否ポリシーに一致 今回の接続を拒否

ルールの照合は接続処理中に行われますが、「REJECTに一致すればDNS問い合わせが一切発生しない」とは限りません。実際の挙動は、名前解決やキャッシュ、IPルールの照合に必要なアドレスの取得などに左右されます。REJECTの役割は一致した接続を拒否することであり、単独のDNSプライバシー設定ではありません。

2. よく使う書き方:ドメイン指定、サフィックス、IP範囲

まずはドメインを完全一致で指定し、サブドメイン全体も拒否すべきと確認できた場合に限ってDOMAIN-SUFFIXへ範囲を広げます。ルールのドメインに https://、パス、クエリパラメーター、末尾のスラッシュは付けません。以下の各行は構文の説明用です。同じ設定にすべて追加する必要はありません。

[Rule]
DOMAIN,ads.example.com,REJECT
DOMAIN-SUFFIX,metrics.example.com,REJECT
IP-CIDR,192.0.2.0/24,REJECT,no-resolve
IP-CIDR6,2001:db8::/32,REJECT,no-resolve
ルールタイプマッチ範囲使用上の注意
DOMAIN指定したドメインと完全一致。確認済みのホスト名を1つだけ拒否する場合に適しています。
DOMAIN-SUFFIX指定したドメインとそのサブドメイン。metrics.example.com は a.metrics.example.com にも一致しますが、othermetrics.example.com には一致しません。
IP-CIDRIPv4アドレスの範囲。共有アドレスには正常なサービスも同居する可能性があります。ドメインの名前解決で得たアドレスを、専用アドレスとみなさないでください。
IP-CIDR6IPv6アドレスの範囲。IPv4ルールだけでは、IPv6の宛先アドレスを対象にできません。

no-resolve は、このIPルールのためにドメイン名をIPアドレスへ積極的に名前解決するのを避ける指定です。すべてのDNS名前解決を無効にする意味ではなく、宛先がすでにIPアドレスのリクエストの照合も妨げません。例にある 192.0.2.0/24 と 2001:db8::/32 は文書用アドレスです。実在するサービスがブロックされることを期待しないでください。

4種類
上の表では、ドメインのマッチ方法2種類とIP範囲のマッチ方法2種類を区別しています。
/32
IPv4アドレス1つを指定するプレフィックス長(例:192.0.2.8/32)。
/128
IPv6アドレス1つを指定するプレフィックス長(例:2001:db8::8/128)。

判断の基本:マッチ範囲を絞ってからブロック範囲を広げる

不要なリクエストを送信するホスト名が1つだけ確認できた場合は、まずDOMAINルールを追加します。サブドメインごとの用途を確認してからDOMAIN-SUFFIXに切り替え、共有ネットワーク全体を先にブロックするのは避けてください。

3. ルールの順序:例外を先に、FINALを最後に

通常のルールリストでは、リクエストは上から順に照合され、最初に一致したルールで処理ポリシーが決まります。REJECTをリストの末尾に置いても、前にある許可ルールを上書きするわけではありません。同様に、先に広範囲なブロックルールに一致すると、後続の例外ルールで取り消すことはできません。

[Rule]
DOMAIN,assets.ads.example.com,DIRECT
DOMAIN-SUFFIX,ads.example.com,REJECT
IP-CIDR,192.0.2.0/24,REJECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT

この例では、assets.ads.example.com は先に完全一致の例外ルールに一致し、video.ads.example.com は次のサフィックスブロックルールに一致します。GEOIPは宛先IPの地理的な割り当てに基づいて照合するもので、コンテンツの用途は判別しません。ブロックルールより前に置くと、条件に一致するリクエストが先にDIRECTになる場合があります。FINALは前のルールに一致しなかった場合のフォールバック項目なので、ルールリストの末尾に置きます。

完全一致の例外

タイプ
DOMAIN
対象
assets.ads.example.com
ポリシー
DIRECT
配置
対象を含むサフィックスブロックルールより前に置きます。

DIRECTは直結を意味するだけです。実際の例外には、その通信に必要な利用可能なポリシーを指定してください。

サフィックスによるブロック

タイプ
DOMAIN-SUFFIX
対象
ads.example.com
ポリシー
REJECT
配置
完全一致の例外の後、広範囲な許可ルールとFINALの前に置きます。

ここでのFINAL,DIRECTはフォールバックの説明用です。既存のルーティングポリシーを置き換えるものではありません。

ルールを統合する場合は、既存の [Rule] セクションに該当する行を挿入します。セクション全体を重ねて貼り付けたり、既存のプロキシポリシー、ルール参照、フォールバック設定をそのまま削除したりしないでください。外部ルールの参照がある場合は、参照位置を含めて全体の順序を確認します。追加した数行だけを見て判断しないでください。

4. Configで編集して動作を確認する

ルールは設定に保存されます。すでに利用しているノードのサブスクリプションは主に接続情報を提供するもので、更新してもルール編集の代わりにはなりません。作業前に現在利用できる設定を保存し、Configを開いて、編集中の設定と使用中の設定が同じものか確認してください。リモート設定の更新でローカルの変更が置き換わることがあるため、カスタムルールのコピーを保管します。

  1. 現在の状態を記録する。Home → Global Routingの現在の選択項目と、Configで有効になっている設定を記録し、元のファイルを保管して復元できるようにします。
  2. テストルールを1つだけ追加する。Configで対象設定の編集画面を開き、[Rule]内に確認済みの対象を指定するDOMAINルールを追加します。先に一致する可能性のある広範囲なルールより前に置き、保存して設定を有効にします。
  3. ルールモードを使う。Home → Global RoutingでConfigを選択します。ProxyとDirectはグローバルな処理方法が異なるため、同じConfigルールの動作確認には使えません。Sceneを使っている場合は、シーンで実際に選ばれている設定とルーティング状態を先に確認してください。
  4. リクエストを新しく発生させる。接続が有効になっていることを確認し、対象のページを閉じてから開き直します。必要に応じて接続をいったん切って再接続し、新しい接続を開始してください。既存の長時間接続で画面を更新するだけでは、ルールの変更が反映されない場合があります。
  5. 記録を確認する。接続またはログの記録で、対象ドメイン、宛先アドレス、マッチしたルール、処理ポリシーを確認します。判断材料にするのは新しいリクエストがREJECTに一致した記録です。ページの一部が一時的に消えたことだけで判断しないでください。

5. ドメインブロックの限界と誤ブロックの原因

DOMAINとDOMAIN-SUFFIXが対象とするのはホスト名であり、ページ内の特定のコンテンツではありません。HTTPSリクエストでは、https://example.com/news と https://example.com/promo のように同じホスト上の異なるパスを、この2種類のドメインルールだけで区別できません。example.comを拒否すると、両方のパスに対応する接続に影響します。

ドメインを拒否するためにHTTPS復号を有効にする必要は通常ありません。証明書を追加したり、無関係な設定を変更したりしても、「同じドメインが複数の種類のコンテンツを配信している」というマッチ範囲の問題は解決しません。個別に区別できないリソースについては機能上の限界を踏まえ、REJECTルール1つですべての該当コンテンツを削除できるとは考えないでください。

6. よくある質問:未一致、誤ブロック、更新による巻き戻り

REJECTを追加したのに、ページがまだ開くのはなぜ?

まず、対象がページ全体のホストなのか、ページ内のリソース用ホストなのかを確認します。Home → Global RoutingでConfigを選択しているか確認し、続いてConfigで有効なファイルを確認してください。新しいリクエストを発生させてログを確認し、別のホスト名が使われていた場合は、記録に基づいて完全一致ルールを追加します。同じ行を何度も追加しないでください。

ルールに一致したら、正常な画像まで表示されなくなりました。どうすればよいですか?

まずバックアップを復元するか、直近で追加したブロック行を削除して、画像が戻ることを確認します。その後、DOMAIN-SUFFIXを確認済みのDOMAINに絞り込みます。正常なコンテンツ用に独立したホストがある場合は、その完全一致の例外をブロックルールより前に置きます。画像と拒否対象が同じホストを共有している場合、ドメインルールだけでは分けられません。

既存のサブスクリプションを更新しても、ルールが変わらないのはなぜ?

まず更新したのがHomeのノードサブスクリプションか、Configのリモート設定かを確認します。前者はルールの更新ではありません。後者はローカルの編集内容を上書きする可能性があります。Configに戻って実際に使っているファイルの[Rule]の内容を確認し、自分で管理するルールと元の設定をそれぞれバックアップして、更新後に項目ごとに照合してください。

FINALをREJECTに変えれば、ルールを個別に追加しなくて済みますか?

FINAL,REJECTは、それ以前のルールに一致しなかったすべての接続を拒否するため、ドメイン1つをブロックするよりはるかに広い範囲に影響します。明確な許可リストを管理している場合を除き、対象を指定したルールの代わりに使わないでください。まず元のFINALポリシーに戻し、対象を絞ったDOMAINまたはDOMAIN-SUFFIXを追加します。

7. 保存前の最低限のチェックリスト

管理しやすいREJECT設定では、「どの対象を拒否するのか」「なぜこのマッチ方法を使うのか」「例外はどこか」「どうすれば元に戻せるか」の4点を説明できる必要があります。未確認のルールを一度に大量に読み込むより、1回の変更でマッチ条件を1つだけ変え、変更前後の記録を残すほうが問題の切り分けが容易です。

App Storeで正規品を確認 →