V2Rayのルーティング設定ガイド|geosite・geoipで中国国内と海外を振り分ける

domainStrategyの選び方からgeosite・geoipルールの順序まで解説。中国国内の通信を直接接続し、海外向け通信をプロキシ経由にする設定や、広告をブロックする実用的な例を紹介します。

この記事の要点

この記事は、ノードへの接続ができていて、通信の振り分けルールを調整したい方向けです。まずドメインの分類とIPアドレスの分類を区別し、次に名前解決の方針を選びます。最後に、広告ブロック、中国国内向けの直接接続、プロキシへのフォールバックを順序どおりに組み合わせます。V2Ray/Xrayの標準ルーティング項目を使った設定例を示し、既存のクライアント設定への組み込み方と、ログで実際のアウトバウンドを確認する方法も解説します。Webページが開くかどうかだけでルールの成否を判断しないようにしましょう。

1. geositeとgeoipの違い:それぞれ何を判定するか

ルーティングは、通信がコアに届いた後に行われます。コアが接続先のドメイン名またはIPアドレスを取得し、routing.rulesを順番に確認します。最初に条件に一致したルールに従って、接続を対応するoutboundTagへ渡します。一致したルールをすべて合成することも、後から「より具体的な」ルールを自動で探すこともありません。そのため、ルールの内容だけでなく順序も重要です。

記法マッチ対象依存関係と注意点
geosite:cnドメインの分類geosite.datのcn分類を参照します。.cnで終わるドメインすべてに一致するわけではありません。
geoip:cn中国に割り当てられたIPアドレス範囲geoip.datを参照します。IPアドレスの割り当て先で判定するため、Webサイトの言語や運営主体は判定しません。
geoip:privateプライベートアドレスおよび特殊用途アドレスの集合主にLAN内の通信を直接接続する用途で使います。収録範囲は使用中のデータファイルを確認してください。
domain:example.com指定したドメインとそのサブドメインドメイン分類には依存しないため、独自の例外ルールを追加するのに適しています。
full:example.com完全一致するドメイン指定した名前だけに一致し、サブドメインには一致しません。

geositeは分類データであり、リアルタイム検索サービスではありません。同じ分類名でも、データの提供元や更新時期によって収録項目が異なる場合があります。起動時にcategory-ads-allが見つからない場合は、ノードのプロトコルを変更する前に、データファイルにその分類が含まれているか確認してください。XrayやV2Fly向けの一般的なデータファイルにはこれらのタグが含まれることがありますが、実際の内容は手元のファイルで確認する必要があります。

2. domainStrategy:ルーティング判定でドメインを名前解決するタイミング

routing.domainStrategyは、ルーティング判定時に名前解決をどう利用するかを制御します。グローバルなDNS設定スイッチではなく、直接接続アウトバウンドにある同名の設定とも異なります。アプリからコアに接続先IPアドレスが渡された場合、ドメイン名のルールだけでWebサイト名を特定することはできません。ドメイン名が渡された場合にIPアドレスも調べるかどうかは、以下の方針で決まります。

IPIfNonMatch

おすすめ

まず、ドメイン名などすでにある情報で判定し、一致するルールがなければ接続先ドメインを名前解決してIPルールを試します。中国国内・海外の通信振り分けを始める際に適しています。ただし、末尾に全通信に一致するルールがあると最初の判定で処理が終了するため、フォールバック方法を必ず確認してください。

適したケース:ドメイン名を優先し、分類されていないドメインもIPアドレスで判定したい場合

AsIs

ルーティング判定のための名前解決を行いません。ドメイン名はgeositeまたは明示的なドメインルールで判定し、アプリから直接渡されたIPアドレスはgeoipで判定できます。動作を予測しやすい一方、未収録のドメインをgeoip:cnで補って判定することはできません。

適したケース:ルーティング時の名前解決を抑え、ドメイン分類を主に利用したい場合

IPOnDemand

判定中にIPアドレスが必要なルールに達したとき、必要に応じて接続先ドメインを名前解決します。明示的なドメインルールをIPルールより先に置き、最後にプロキシへのフォールバックを設定すれば、ドメイン名を優先しつつ、未分類ドメインをIPアドレスでも判定できます。

適したケース:IPアドレスによる補完判定が必要で、明示的なフォールバックルールを使う場合

この記事の組み合わせ例ではIPOnDemandを使い、最後にnetwork: "tcp,udp"のプロキシフォールバックを明示的に追加します。IPIfNonMatchに変更すると、このフォールバックルールが最初の判定で一致し、未分類ドメインに対する「不一致後の名前解決」が行われません。別の方法として、全通信に一致するフォールバックを削除し、設定内の最初のアウトバウンドをプロキシにすることもできます。その場合は、クライアントが生成したアウトバウンドの順序を確認してください。方針名だけを変更すればよいわけではありません。

3. 設定前の確認:アウトバウンドタグ、ポート、データファイル

以下の設定例では、3つのアウトバウンドタグを使います。proxyは使用可能なプロキシノード、directはFreedomによる直接接続、blockはBlackholeによるブロックです。タグは大文字と小文字を区別する文字列参照であり、画面上の表示名ではありません。ノードがVMessでもVLESSでも、ルーティングでタグを参照する方法は変わりません。ノードのトランスポートやセキュリティの設定は、既存のアウトバウンドで引き続き管理します。

3つ
例で使用するアウトバウンドタグ
5件
組み合わせ例のルール順序
10808
以下の検証で使用するローカルSOCKSポート

ポート10808はこの記事のテストコマンドで使用する値であり、すべての環境の初期値ではありません。コマンドを実行する前に、クライアントのローカルリスニング設定で実際のポート番号を確認してください。異なるポートを使用している場合は、コマンド内の数字を置き換えます。リッスンアドレスは127.0.0.1のままにし、ルーティングのテストのためにLAN上の他の機器へ公開する必要はありません。

  1. 設定をバックアップ

    既存の設定とカスタムルーティングをバックアップします。まず現在のノードで、接続できることが分かっているWebサイトにアクセスし、基本的な接続が正常であることを確認してから振り分けを変更してください。

  2. ルーティング設定の場所を確認

    v2rayNでは通常、「設定」→「ルーティング設定」から開けます。現在有効なルールセットを記録しておきましょう。画面のバージョンによってメニューの場所が異なる場合は、実際に「ルーティング設定」と表示される画面を使ってください。標準設定のJSONをサブスクリプションURL欄に貼り付けないでください。

  3. アウトバウンドを確認

    エクスポートした実行設定を確認し、プロキシアウトバウンドで使われている実際のtagを調べます。proxy以外の場合は、以下の設定にある該当する参照をすべて置き換えてください。既存ノードのサーバー、認証、トランスポートの設定はそのまま残します。

  4. データファイルを確認

    コアがgeosite.datとgeoip.datを読み込めること、またこの記事で使うcn、private、category-ads-allなどの分類が含まれていることを確認します。分類が見つからない場合は、先にデータを修復するか、該当ルールを外してテストしてください。

  5. 適用して再起動

    ルールを保存したらプロキシサービスを再起動し、起動ログを確認します。Webサイトへのアクセスをテストする前に、JSONの解析エラー、存在しないタグ、データ読み込みエラーを解決してください。

4. 中国国内の直接接続、広告ブロック、プロキシへのフォールバック

以下は、標準設定のトップレベルに統合できるroutingオブジェクトです。ノードの認証情報を含む完全なクライアント設定ではありません。広告ドメインのブロック、中国国内ドメインの直接接続、プライベートアドレスの直接接続、中国国内IPアドレスの直接接続、その他のTCP/UDP通信のプロキシ経由という順で処理します。前述の3つのアウトバウンドタグが設定にあれば、既存の設定で利用できます。

{
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "domain": [
          "geosite:category-ads-all"
        ],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

すでにroutingがある場合は、同じ階層に同名のキーを2つ追加せず、既存のポリシーとルール配列を置き換えるか整理してください。以下に直接接続用とブロック用のアウトバウンドオブジェクトを示します。必要なオブジェクトを既存のoutbounds配列に追加してください。同じタグがすでにある場合は1つだけ残し、この配列で既存のプロキシノードを上書きしないでください。

[
  {
    "tag": "direct",
    "protocol": "freedom",
    "settings": {}
  },
  {
    "tag": "block",
    "protocol": "blackhole",
    "settings": {}
  }
]

設定方法は2通り:ノードはそのままにルーティングだけ変更

GUIでルールを設定する
  • ルーティング設定でカスタムルールセットを新規作成するか、既存のものを複製します。
  • 例と同じ順序で、ドメイン、IPアドレス、ネットワーク条件を入力します。
  • クライアントに用意されているプロキシ、直接接続、ブロックの出口を各タグに割り当てます。
  • そのルールセットを有効にし、生成された実行設定を確認します。
標準JSON設定
  • トップレベルにroutingオブジェクトを統合します。
  • 動作確認済みのproxyアウトバウンドを残します。
  • directとblockのアウトバウンドオブジェクトを追加します。
  • クライアントで管理対象のカスタム設定を読み込み、起動ログを確認します。

GUIによってタグやアウトバウンドの順序が変更される場合があります。最終的には、ルールセットの表示名ではなく、コアが実際に読み込んだ設定を確認してください。

この設定における「海外向け通信をプロキシ経由にする」とは、「前段のルールでブロックまたは直接接続と判定されなかった通信をプロキシ経由にする」という意味であり、海外のWebサイトをすべて個別に列挙するものではありません。フォールバックを使えば新しいドメインにも対応できますが、geoip:cnによって海外サービスの中国国内CDNアドレスが直接接続される場合があります。プロキシ経由にする必要があるサイトは、そのサイトの明示的なドメインルールをIPルールより前に追加してください。

5. ルールの順序と例外:具体的な条件から広い条件へ

広告ルールを中国国内ドメインのルールより前に置くと、広告分類に含まれる中国国内ドメインもブロックされます。必要なログイン用ドメインや静的リソースのドメインが誤ってブロックされた場合は、広告ルールの前に明示的な例外を追加してください。例外の範囲はできるだけ狭くします。特定のリソースドメインを修正するために、大きなドメイン分類全体を直接接続にしないでください。

{
  "type": "field",
  "domain": [
    "full:static.example.com"
  ],
  "outboundTag": "direct"
}

static.example.comはマッチ条件の記法を示すためのサンプルドメインであり、実際に許可すべきリソースではありません。使用時にはログで確認した接続先の完全なドメイン名に置き換え、このルールを広告ルールより前に配置します。サブドメインもすべて対象にする場合はdomain:を使います。単一のホスト名だけを対象にする場合は、full:を優先してください。

目的追加する位置確認ポイント
広告の誤ブロックを解除広告ブロックルールの前ログで確認した必要なドメインだけを許可します。
特定サイトをプロキシ経由にする中国国内ドメイン・IPの直接接続ルールの前必要に応じて、サイトの個別リソース用ドメインも対象にします。
LAN内の指定アドレスを直接接続プロキシへのフォールバックの前アプリからのリクエストが実際にコアへ渡されているか確認します。
デフォルトの出口を変更ルール配列の末尾全通信に一致するルールを前に置いて、後続ルールを無効にしないでください。

広告ドメインのブロックは、Webページ内の要素をフィルタリングする機能ではありません。広告と本文が同じホスト名を使っている場合、ルーティングで広告部分だけを削除することはできません。ドメイン単位のブロックによって、動画再生、ログイン、計測用のコールバックにも影響する場合があります。機能に問題が生じたら、まず実際に一致したドメインとアウトバウンドを確認し、ブロック対象を絞り込んでください。

6. 通信の振り分けを検証:Webページだけでなくアウトバウンドログを確認

テスト中はプロキシモードとノードを変えず、一度に変更するルールは1つだけにしてください。接続先を記録できるログレベルを一時的に有効にし、同じリクエストの接続先とアウトバウンドタグを確認します。テスト後は通常のログレベルに戻してください。ログにはアクセス先が含まれることがあります。スクリーンショットを共有する前に、サブスクリプションURL、ノードの認証情報、個人のアクセス履歴を削除してください。

  1. 中国国内のドメイン:現在のgeosite:cnに含まれていることを確認できるサイトを選び、ページの読み込み速度ではなく、接続がdirectに渡されたかを確認します。
  2. プロキシへのフォールバック:前段のルールに一致しないことを確認した接続先を選び、アウトバウンドがproxyになっているか確認します。出口IPの確認は、そのリクエストの検証を補助する手段にすぎません。
  3. 広告分類に一致:手元の分類データやアクセスログから、広告分類に含まれることを確認できるドメインを探し、blockに渡されたか確認します。見慣れないサイトを自分で開く必要はありません。
  4. プライベートアドレス:自分で管理するLAN内のサービスにアクセスし、direct経由になっているか確認します。ブラウザーがシステム設定を無視してプロキシを迂回する場合、リクエストはコアのログに記録されないことがあります。

コマンドラインで検証すると、ブラウザーのキャッシュや拡張機能による影響を抑えられます。以下のコマンドは、ローカルSOCKSリスナーが127.0.0.1:10808であることを前提とし、socks5hを使って接続先ドメインの名前解決をプロキシ側で行います。Windowsではコマンドのエイリアスによる違いを避けるためcurl.exeを使い、それ以外のシステムではcurlを使用できます。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com

この2つのアドレスは、観測可能なリクエストを発生させるためのものであり、任意のデータバージョンやネットワーク環境で最終的にどの分類に入るかを保証するものではありません。HTTPステータスコードが返っても、応答があったことしか分からず、どのアウトバウンドを経由したかは証明できません。ログもあわせて確認してください。最初のコマンドでリダイレクトが返された場合は、各接続の実際の接続先を個別に判定します。リダイレクト先の新しいドメインを、最初の接続と同じマッチ結果として扱わないでください。

7. よくある質問:DNS、モードによる上書き、分類データの不足

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

まず、実際の設定がIPIfNonMatchで、末尾に全通信に一致するルールがあるか確認します。この組み合わせでは、ドメインの名前解決前にプロキシへのフォールバックに一致することがあります。この記事の例のようにIPOnDemandへ変更し、IPルールをフォールバックより前に置いてください。そのうえで、名前解決されたアドレスが現在のgeoip:cnに含まれているか確認します。

ルールを保存したのに、ログに変化がないのはなぜ?

保存後にルールセットを有効にし、サービスを再起動したか確認してください。グローバルプロキシモードまたはグローバル直接接続モードが有効になり、カスタムルーティングを上書きしていないか確認します。また、アプリの通信が実際にローカルプロキシを経由しているかも確認してください。システムプロキシの設定が適用されるのは、その設定に従うアプリだけです。すべてのネットワーク通信が自動的に切り替わるわけではありません。

起動時にgeositeの分類が見つからない場合は?

まず、エラーに表示された不足中のタグを確認し、コアが実際に読み込んでいるデータファイルの場所と内容を調べてください。該当ルールを一時的に削除して、ほかの設定で起動できるかを確認し、その後、互換性のあるデータファイルを用意します。通常、サブスクリプションのノード一覧を更新しても、分類データの問題は解決しません。

Android版にデスクトップ用のルーティング設定をそのままコピーできますか?

v2rayNGはXrayコア、v2flyNGはV2Flyコアを使用します。この記事で紹介する基本項目は対応するコアで広く使われていますが、クライアントの画面、カスタム設定の追加場所、データ管理方法は異なります。まずアウトバウンドタグとデータ分類を確認し、クライアントが対応する方法で読み込んでください。デスクトップ版の設定ファイル全体をサブスクリプションURLとして使わないでください。

geositeを使えば、DNSを確認しなくてもよいですか?

いいえ、確認が必要です。未分類ドメインのIPアドレス判定は名前解決の結果に依存し、直接接続にも有効な接続先アドレスが必要です。routing.domainStrategyを設定しても、すべてのアプリのDNSリクエストがコアに渡されるとは限りません。また、DNSプライバシー対策全体を自動で実現するものでもありません。まずアプリからコアに渡されているのがドメイン名かIPアドレスかを確認し、名前解決の経路と実際のアウトバウンドを調べてください。

調査は「設定を読み込めるか」「リクエストがコアに届いているか」「接続先がドメイン名かIPアドレスか」「最初に一致したルールは何か」「アウトバウンドで接続できるか」の順に進めると効率的です。この5点を確認してから、分類の追加やDNSの変更を検討してください。「ルールに一致しない」場合と「ルールには正しく一致したがノードへの接続に失敗した」場合を切り分けられ、設定を何度も変更して原因を見失うことを防げます。

クライアントをダウンロード