この記事の要点

この記事は、サブスクリプションを追加して接続できるものの、どの通信がプロキシ経由になるのか分からない方に向けた内容です。まずドメインリストとIPアドレスデータベースの違いを確認し、「個別の例外」「通常ルール」「デフォルトの出口」の順に整理します。最後に、v2rayN・v2rayNGで生成された設定と接続ログを確認します。例ではXrayのルーティング項目を使用します。ネイティブJSONの断片を、どのクライアントにも使えるインポートファイルとして扱うものではありません。

ルーティングの前提:通信がコアに届いているか確認する

v2rayNはデスクトップ向けGUIクライアント、v2rayNGはXrayコアを使用するAndroidクライアントです。画面上でノードや設定を管理し、ルールの照合はコアが行います。VMessやVLESSなどのプロトコルはプロキシ接続の確立方法を決めるもので、特定のサイトを直接接続するかプロキシ経由にするかを決めるものではありません。

アプリの通信 コアに到達 宛先を識別 ルールを照合 出口を選択

システムプロキシの設定が適用されるのは、その設定に従うアプリだけです。TUNやAndroidのVPN方式ならより多くの通信を取り込めますが、アプリの除外設定、ルーティング設定、システム権限の影響を受けます。ブラウザーからクライアントへ接続が渡っていなければ、geositeルールをいくつ追加しても通信経路は変わりません。

geositeとgeoip:ドメインとIPアドレスをそれぞれ照合

geosite.datにはタグ別に分類されたドメイン一覧、geoip.datにはタグ別に分類されたIPアドレス範囲が保存されています。ルール内のgeosite:cnやgeoip:cnはデータセットを参照する記述です。ネットワークに問い合わせるコマンドでも、クライアントが最新リストを自動取得するという意味でもありません。

ドメインルール:geosite

データファイル
geosite.dat
よく使われる参照形式
geosite:cn
ルール項目
domain
照合対象
コアが認識した宛先ドメイン

利用できるタグは、実際に読み込むルールファイルによって異なります。データセットごとに分類範囲も異なる場合があります。

IPアドレスルール:geoip

データファイル
geoip.dat
よく使われる参照形式
geoip:cn
ルール項目
ip
照合対象
宛先IPアドレスまたは名前解決後のIPアドレス

IPアドレスの割り当て先は振り分けの判断材料であり、サイト運営者の所在地やコンテンツの言語を示すものではありません。

ドメインを直接指定する場合、full:example.comは完全一致のみ、domain:example.comはそのドメインとサブドメインに一致します。接頭辞のない文字列は通常、部分一致となるため、関係のないドメインまで対象になる可能性があります。特定の例外にはfull:またはdomain:を使いましょう。

ルールリソースが不足していると、ログにgeositeやgeoipの読み込み失敗、タグが見つからないといったエラーが出ることがあります。使用中のクライアントにあるリソース更新機能を使い、実行中のコアが実際に読み込む保存先も確認してください。ファイルを任意のダウンロードフォルダーにコピーするだけでは不十分です。また、geosite:任意のタグがすべてのデータセットで使える固定の記述だと考えないでください。

判断のポイント:ドメインが分かる場合は、ドメイン指定の例外を優先

同じサイトでも、複数の地域のCDNアドレスが使われることがあります。特定のサイトだけ出口を変えるなら、共有IPアドレスの範囲全体を直接接続にするより、ドメインルールを追加するほうが制御しやすくなります。

ルールの順序:最初に一致したルールが適用され、デフォルトの出口は別途確認

通常のルーティングルールは配列の上から順に照合され、最初に一致したルールで出口が決まります。後続のルールが結果を上書きすることはありません。同じルール内の異なる条件項目は、通常すべて満たす必要があります。一方、同じdomain配列内の複数のドメイン項目は、いずれか1つに一致すれば適用されます。

  1. 特定サイトの例外:プロキシ経由にしたいサイトなど、明確な例外ルールは広範囲の直接接続ルールより上に配置します。
  2. ローカルネットワークとプライベートアドレス:ルーターやLAN内サービスなどへの通信は直接接続にします。対象範囲は使用するプライベートアドレスのセットによって異なります。
  3. 一般的なドメインセット:たとえばgeosite:cnを直接接続に設定します。
  4. IPアドレスの割り当て先によるルール:たとえばgeoip:cnを直接接続に設定し、適用条件をドメイン判定の設定とあわせて確認します。
  5. どのルールにも一致しない場合:ネイティブ設定では最初のoutboundが使われます。クライアント側で追加のフォールバックルールが生成されることもあります。

「すべてのTCP・UDPをプロキシ経由にする」フォールバックルールを先頭に置かないでください。通常の通信に先に一致してしまい、後続の直接接続ルールが適用されなくなります。さらに、IPIfNonMatchを使っている場合、広範囲のフォールバックルールが先に一致すると、「不一致の場合にドメインを名前解決する」処理も実行されません。

domainStrategy:ルーティング時にドメインを名前解決するかどうか

ここで扱うのはrouting.domainStrategyです。ルーティングの照合時にドメインをどう扱うかを指定します。direct outbound内にある同名の設定とは異なり、DNSリクエストをどの出口から送るかを単独で保証するものでもありません。

戦略ルーティング時の動作使用上の注意
AsIs元の宛先を照合し、IPルールのためにドメインを積極的に名前解決しない宛先がもともとIPアドレスなら、IPルールに一致する
IPIfNonMatchドメインの通信が最初の照合で一致しない場合、名前解決して再照合するまずドメインルールを使い、IPアドレスの割り当て先で補完する場合に適する
IPOnDemand照合中にIPアドレスが必要なルールに到達した場合、名前解決を試みる前方にIPルールがあると、早い段階でDNS問い合わせが発生する場合がある

あるドメインがどのドメインセットにも含まれておらず、名前解決後のIPアドレスがgeoip:cnに該当するとします。先に一致する別のルールがなければ、IPIfNonMatchでは名前解決後に直接接続ルールへ一致させられます。一方、AsIsでは、そのドメインをこのように積極的に名前解決しません。

DNSの応答結果はIPルールの判定に影響します。リゾルバーによって異なるCDNアドレスが返ることがあり、IPv4とIPv6で割り当て先が異なる場合もあります。「同じサイトなのに直接接続とプロキシ経由が切り替わる」場合は、実際の宛先アドレス、DNS設定、一致したルールをあわせて確認しましょう。すぐにgeositeの不具合と決めつける必要はありません。

ネイティブ設定の例:ドメインルールを優先し、IPルールで補完

以下はrouting部分のみの例です。生成された設定の確認や、ネイティブ設定の編集時に参考にしてください。設定にはproxyとdirectの2つのoutboundがあり、先頭のoutboundがproxyであることが前提です。例にあるexample.comとexample.orgはドキュメント用のドメインであり、特定の出口に設定する必要があるサイトを示すものではありません。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["full:example.org"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

この断片には、ノードの認証情報、待ち受け用のinbound、DNS、outbound全体の定義は含まれていません。クライアント設定全体の置き換えには使えません。GUIの「ルールをインポート」機能が独自のデータ形式を使う場合もあります。JSON形式だからといって、そのまま貼り付けられるとは限りません。

v2rayN・v2rayNG:GUIでルールを設定する

バージョンによってメニュー名に「設定」や「カスタム」などの語が付く場合があります。以下では一般的な日本語UIでの操作順を紹介します。項目名が異なる場合は機能から探してください。デスクトップ版から書き出したルーティングファイルを、Android版でも使える共通形式として扱わないようにしましょう。

v2rayN:設定を複製してから優先順位を編集

  1. 「設定」→「ルーティング設定」を開き、現在使える設定を残したうえで、テスト用の設定を複製するか新規作成します。
  2. ルールエディターでドメインまたはIPの条件を選び、domain:example.com、geosite:cn、geoip:cnなどを入力します。出口には画面で選択できるプロキシまたは直接接続を指定します。
  3. 明示的なドメイン例外は、広範囲のセットより上に移動します。ドメイン戦略の設定項目がある場合は、対応するルーティング動作も確認してください。
  4. 保存後、メイン画面のルーティング設定でその設定を有効にします。保存しただけで選択していなければ、通常、現在の接続には反映されません。
  5. テスト接続をやり直し、ログまたは生成設定の表示機能で、ルールの順序、デフォルトの出口、実際のタグを確認します。

v2rayNG:コアのルーティングとアプリの振り分けを分けて考える

  1. サイドメニューから「設定」→「ルーティング設定」を開き、現在のルーティングモード、ドメイン戦略、プロキシ・直接接続・ブロックルールの設定項目を確認します。
  2. 該当するカスタムルール欄にドメインを追加します。geosite参照、ルールの並べ替え、JSON編集に対応しているかどうかは、使用中のバージョンの画面で確認してください。
  3. 対象アプリがVPNの対象になっていない場合は、まずアプリごとの振り分け設定を変更します。これはgeositeによるドメイン振り分けとは別の設定です。
  4. 保存後にいったん切断して再接続し、新しい通信を開始します。すでに確立された長時間接続は、以前の出口を使い続ける場合があります。

ルールごとに細かく並べ替えたいのに、使用中のバージョンがカテゴリ別の入力欄しか用意していない場合は、最終的に生成されるルールの順番を確認してください。画面上で「プロキシ用ドメイン」と「直接接続用ドメイン」が分かれていても、競合時にどちらが先に照合されるかは分かりません。

振り分けの確認:ページが開くかだけでなく、ログで出口を確認

ページが開いたことから分かるのは接続が完了したことだけで、想定した出口を使った証拠にはなりません。テスト対象は、LAN内のアドレス、明示的に指定したドメイン例外、どのセットにも一致しない一般的なドメインの3つがおすすめです。一度に変更する項目は1つに絞り、接続し直してから宛先と出口を記録します。

10808
ローカルSOCKSテスト用ポートの例
443
HTTPSテスト先のポート
192.168.0.0/16
代表的なプライベートIPv4アドレス範囲のひとつ

上記の10808はテスト例で、現在のクライアントの待ち受けポートと一致するとは限りません。実際の待ち受け設定を確認してください。システムにcurlがインストールされている場合は、デスクトップのターミナルから次のリクエストを実行できます。宛先ドメインをSOCKS経由でコアに渡すことで、アプリ側で先に名前解決した場合の違いを抑えられます。

curl --proxy socks5h://127.0.0.1:10808 --head https://example.com

socks5hは、名前解決済みのIPアドレスだけを渡す方法とは異なり、ドメインをプロキシ側に渡します。速度を比較するためではなく、ログに記録される宛先とルールの入力を一致させるためのテストです。ログの詳細度が足りない場合は、一時的にログレベルを上げても構いません。確認後は元に戻し、ログを共有する前にサブスクリプションURL、ノードの認証情報、個人のアクセス履歴を削除してください。

設定のポイント:再現可能なドメイン例外を1つ作る

まず、特定のドメインが指定したoutboundに安定して一致する状態にしてから、geositeやgeoipを追加します。単一ルールも効かない場合は、通信の入口、有効な設定、outboundタグを優先して確認してください。分類リストを増やし続けても解決しません。

よくある問題:ルールを保存しても想定どおりに振り分けられない

直接接続のドメインを追加したのに、なぜプロキシ経由になる?

編集した設定が現在有効になっているか確認し、そのうえで前方に広範囲のプロキシルールがないか確認してください。既存の接続を切断してから再試行します。ログに宛先IPしか記録されていない場合は、アプリの名前解決方法と通信のスニッフィング設定も確認してください。

geoip:cnを追加したのに、なぜ一部の中国国内サイトはプロキシ経由になる?

routing.domainStrategyがAsIsになっていないか、実際の名前解決先が使用中のIPアドレスデータベースに含まれているか確認してください。IPIfNonMatchを使う場合は、先に一致するフォールバックルールを削除するか、ドメインを明示した直接接続ルールを使用してください。

サブスクリプションの更新でカスタムルーティングも上書きされる?

通常のノードサブスクリプションでは主にサーバー項目が更新され、ルーティングはクライアント側で個別に管理されます。一方、設定全体をインポートまたは置き換えると、ルーティングが変わる場合があります。更新前に現在の設定を保存し、更新後に有効なルーティングを確認してください。2種類のインポート方法を同じ操作として扱わないようにしましょう。

geositeのタグが見つからないと表示された場合、どうすればよい?

まずエラーに記載されたタグ名を確認し、クライアントのリソース更新機能でルールファイルを更新して、コアが更新後のファイルを読み込んでいることを確かめます。そのデータセットに該当タグがない場合は、実際に提供されているカテゴリを使うか、明示的なドメイン一覧で代用してください。

TUNを有効にしているのに、なぜコアのルーティング設定が必要?

TUNはより多くのアプリの通信をクライアントに取り込むための仕組みで、コアのルーティングは取り込んだ通信の出口を選ぶ仕組みです。まず通信が取り込まれていることを確認し、その後、LANへの直接接続、ドメイン例外、デフォルトのプロキシをそれぞれ検証します。通信を取り込めたことと、正しく振り分けられることは別です。