V2Rayのルーティング振り分け実践:中国国内は直接接続、海外はプロキシ経由にする完全設定ガイド

中国本土のネットワーク環境を例に、geositeとgeoipで中国国内サイトを直接接続し、海外サイトをプロキシ経由にするrouting設定、ルールの優先順位、トラブルシューティングを解説します。

この記事の要点

ノードへ正常に接続できるものの、中国国内へのアクセスで遠回りを減らしたいユーザー向けの記事です。リクエストの照合処理から始め、確認しやすいroutingルール、v2rayNの操作場所、DNSの組み合わせ方、ログによる切り分け手順を紹介し、中国国内のドメインとIPは直接接続、それ以外の通信はプロキシ出力へ送る構成を実現します。

まず振り分けの目的と処理順を決める

V2Rayのルーティング振り分けは、ネットワークを2つの独立した接続に分ける機能ではありません。同じ入方向の接続でアプリからのリクエストを受け取り、ドメイン、宛先IP、ポート、ネットワーク種別に応じて出力先を選択します。一般的な設定では、directというタグの直接接続用出力と、proxyというタグのプロキシ出力を用意します。routingルールはこれらのタグを参照するだけで、接続自体を作成することはありません。

中国国内は直接接続し、それ以外はプロキシ経由にする基本方針は、3段階の判定にまとめられます。ローカルネットワークと予約済みアドレスは直接接続し、中国本土のドメインとIPも直接接続します。前のルールに一致しないリクエストはプロキシへ送ります。最後のフォールバックルールは省略できません。省略すると、一致しなかった通信はoutbounds配列の先頭の出力先に送られ、設定の並び順に依存するため分かりにくくなります。

アプリのリクエスト宛先を読み取る順番に照合出力先を選択接続を確立

ルールは配列の上から順に評価され、最初に一致した時点で処理が止まります。具体的なドメインルールは広範なルールより前に、ローカルネットワークのアドレスはパブリックアドレスのルールより前に置きます。最後のtcp,udpフォールバックは末尾に配置してください。すべてのネットワーク種別を対象にするプロキシルールを先に置くと、後続の中国国内向け直接接続ルールは実行されません。

geosite、geoip、domainStrategyの関係

geositeはドメイン分類データ、geoipはIPアドレス範囲の分類データです。ドメイン付きURLへアクセスすると、V2Rayが最初に受け取るのは通常ドメインです。続けて宛先IPを解決し、IPルールを実行するかどうかはdomainStrategyで決まります。そのため、geoip:cnだけを追加しても、中国国内のドメインがすべて安定して直接接続されるわけではありません。

10808
よく使われるローカルSOCKSポート
10809
よく使われるローカルHTTPポート
3層
プライベートネットワーク、ドメイン、IPを直接接続
2ファイル
geosite.datとgeoip.dat

AsIsは元のドメインのままルーティングを実行し、ドメインルールに一致しなくてもルーティング判定のためにIPを自動解決しません。IPIfNonMatchは、まずドメインルールを試し、一致しなかった場合だけIPを解決してIPルールの確認を続けます。IPOnDemandは、IPを必要とするルールに遭遇した時点で、より早く解決を開始します。中国国内を直接接続する構成では、ドメイン分類とIPアドレス範囲によるフォールバックを両立できるIPIfNonMatchが一般的です。

ポリシー 照合動作 適したケース 注意点
AsIs 元のドメインを優先し、IPルーティングのために自動解決しない 主にドメイン分類に依存するルール geoipルールしかない場合、ドメインリクエストに一致しない可能性がある
IPIfNonMatch ドメインルールに一致しない場合のみ解決してIPを確認する 中国国内のドメインとIPを二重に直接接続 DNSが正常に結果を返す必要がある
IPOnDemand ルーティング判定でIPが必要になった時点で解決する 宛先IPに依存するルールが多い DNSクエリの回数が増える可能性がある

結論:まずはIPIfNonMatchを使う

geosite:cngeoip:cnを併用している場合、IPIfNonMatchはまずドメイン分類を使い、未分類のドメインについては解決結果で補完できます。どちらか一方のデータだけに依存するより、問題を切り分けやすくなります。

実用的なrouting設定

以下は完全なroutingオブジェクトで、既存のV2RayまたはXray設定に統合できます。outboundsにdirectproxyという2つのタグがすでに存在することを前提としています。貼り付ける前に、元の設定にroutingフィールドがあるか確認してください。同じ階層のJSONオブジェクトに同名フィールドを2つ残すことはできないため、置き換えるか統合し、単純に追記しないでください。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

1つ目のルールにより、192.168.0.0/1610.0.0.0/8などのプライベートネットワーク宛先をローカル接続に保ちます。2つ目はDNS解決前にドメイン分類で直接接続を決定します。3つ目は、ドメイン分類の対象外でも、解決先が中国本土のアドレス範囲に入るケースを処理します。4つ目にはドメインもIPも指定していないため、残りのTCPおよびUDPリクエストを受け取ります。

  1. まず、元の設定にある直接接続用出力のタグを確認します。よくある構成では、プロトコルがfreedomで、タグがdirectです。
  2. プロキシ出力のタグが現在のノードを指していることを確認します。例ではproxyを使用していますが、実際の名前は異なる場合があります。
  3. routingオブジェクトは設定のルート階層に置き、inboundsoutboundsdnsと同じ階層にします。
  4. JSONの検証に対応したエディターで、カンマ、角括弧、波括弧を確認してから、コアを再起動して設定を読み込みます。
  5. 実行ログを開き、LANの管理アドレス、中国国内のサイト、海外のサイトへ順にアクセスして、実際の出力タグを確認します。

v2rayNで対応するルールを作成する

v2rayNではグラフィカルインターフェースからルーティングを管理できます。「設定」→「ルーティング設定」を開き、ルールセットを新規作成して有効にしてください。バージョンによって画面上の表記は多少異なりますが、確認すべき項目は同じです。ドメインポリシー、ルールの順序、出力タグ、最後のフォールバックを確認します。変更後は設定を再読み込みするかコアを再起動してください。ウィンドウを保存するだけでは、現在の接続にすぐ反映されない場合があります。

順序 ルール内容 出力先 目的
1 geoip:private direct LANとローカルサービスへのアクセスを維持
2 geosite:cn direct 中国本土のドメインを直接接続
3 geoip:cn direct 中国本土のIPアドレス範囲を直接接続
4 tcp,udp proxy その他のリクエストをプロキシノードへ送る

ローカルプロキシのポートもアプリの設定と一致させる必要があります。よくある構成ではSOCKSポートに10808、HTTPポートに10809を使いますが、この2つの番号は必須の標準ではありません。「設定」→「パラメーター設定」で現在のローカル待受ポートを確認し、ブラウザー、ダウンロードツール、システムプロキシが同じポートを参照しているか確認してください。ポートが一致しない場合、リクエストはV2Rayに入らないため、ルーティングルールも適用されません。

結論:まずリクエストがコアに入っていることを確認する

振り分けを調べる前に、ログから対象ドメインまたは対象IPを見つけます。ログにリクエストがまったくない場合は、まずシステムプロキシ、TUNの状態、10808/10809ポートを確認し、いきなりgeositeルールを変更しないでください。

DNSによってgeoipルールが適用できるかどうかが決まる

domainStrategyIPIfNonMatchを指定すると、ドメインルールに一致しなかった後、DNSがアドレスを返して初めてgeoip:cnを実行できます。DNSクエリが失敗した場合、アプリが独自に暗号化処理を行っている場合、またはブラウザーがドメインをプロキシへ渡していない場合、DNSとルーティングが認識する宛先は異なる可能性があります。同じサイトが直接接続されたりプロキシ経由になったりする、あるいはログにIPだけが記録されドメインが表示されない、といった症状が典型例です。

最も管理しやすい方法は、中国国内のドメインには直接アクセスできるDNSを使い、それ以外の問い合わせは管理された経路で処理することです。同時に、システムDNS、ブラウザー独自のDNS、コアのDNSが複数のポリシーで互いに上書きし合わないようにします。V2Rayのdnsフィールドは名前解決を担当し、routingは接続方向を選択します。両者には関係がありますが、同じ機能ではありません。

geosite:cnを設定したのに、中国国内のサイトがプロキシ経由になるのはなぜ?

まず、プロキシのフォールバックルールが先頭に置かれていないか確認し、次にgeosite.datをコアが読み込めることを確認します。ルーティングログを開いて一致したルールを確認し、出口アドレスだけで判断しないでください。

ドメインでアクセスするとプロキシ経由なのに、IPを直接入力すると接続できるのはなぜ?

これは通常、geoip:cnは機能している一方で、ドメインルールに一致していないことを示します。設定にgeosite:cnと記述されていることを確認し、そのドメインが現在のデータで分類されていないCDNアドレスを使っていないか調べてください。

振り分けを有効にしたらLANの管理画面が開けなくなった?

geoip:privateを1つ目のルールに置いてdirectへ送り、TUNまたはシステムプロキシでLANバイパスが設定されているかも確認します。テストではルーターの実際のアドレスへ直接アクセスしてください。

ログにDNSタイムアウトが表示された場合、最初にどこを変更すべき?

まずシステムコマンドで現在のDNSに到達できることを確認し、次にコアのDNS設定と出力経路を調べます。ノード、ルール、DNSを同時に変更しないでください。どの手順で復旧したのか分からなくなります。

サブスクリプション更新後にカスタムルーティングが消えた?

ルールをv2rayNの「設定」→「ルーティング設定」に保存し、対応するルールセットを有効にします。Androidクライアントで完全なカスタム設定を使う場合は、サブスクリプションを更新する前に、現在の実行設定の読み込み元を確認してください。

アプリがIPを直接送信する場合、V2Rayは接続情報だけから元のドメインを復元できません。その場合に実行されるのは、IP、ポート、ネットワーク種別のルールだけです。反対に、リクエストにドメインが含まれ、geosite:cnに一致していれば、2回目のルーティング判定のためにIPを解決することはありません。これが、ルールの順序とdomainStrategyをセットで理解する必要がある理由です。

ログを層ごとに確認して振り分け結果を切り分ける

トラブルシューティングでは、いきなり大幅なルール変更から始めないでください。まず、LANアドレス、中国国内の分類に属することが確認できるドメイン、プロキシ経由が必要なドメインの3つを固定して選びます。変更する変数は毎回1つだけにし、接続を再確立して、ログの対象、ヒットしたルール、出力タグを記録します。こうすれば、入口、分類、DNS、ノードのどこに問題があるかを切り分けられます。

  1. 入口を確認:ログにテストリクエストが必ず記録されている必要があります。記録がない場合は、システムプロキシ、アプリのプロキシ、TUNの状態を確認します。
  2. 宛先を確認:ログに記録されているのがドメインかIPかを確認します。IPしかない場合、今回の照合にgeositeは参加できません。
  3. 順序を確認:より広範なルールが先に一致していないか、特に先頭にあるグローバルプロキシルールを確認します。
  4. データを確認:geosite.datgeoip.datがコアから読み取れる場所に存在するか確認し、更新後はコアを再起動します。
  5. タグを確認:routingのoutboundTagは、outbounds内のtagと一字一句一致している必要があります。
  6. DNSを確認:IPIfNonMatch使用時は、ドメインが一致しなかった後に正常に解決できなければ、IP分類を続行できません。
  7. 接続の再確立を確認:テストページまたはアプリの接続を閉じてからリクエストを再実行し、古い接続の再利用による影響を避けます。

Androidでv2rayNGまたはv2flyNGを使う場合、サブスクリプションのノードから実行設定がクライアントによって生成されることが一般的です。ノードが利用できるかだけを確認するなら、まずデフォルトのルーティングを維持してください。カスタム振り分けを長期的に適用する場合は、現在のクライアントがサブスクリプション生成設定とインポートした完全設定のどちらを使っているか確認します。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用するため、実際の実行ログとコアが対応するデータ形式を基準にしてください。

テスト1:192.168.1.1
期待される結果:geoip:private → direct に一致

テスト2:中国国内サイトのドメイン
期待される結果:geosite:cn → direct に一致

テスト3:中国国内の分類に一致しないドメイン
期待される結果:解決したIPを引き続き確認し、最終的にproxyまたはgeoip:cnへ進む

テスト4:UDPアプリのリクエスト
期待される結果:直接接続ルールに一致しない場合、tcp,udpのフォールバックでproxyへ送る

設定後に判断すべき基準は、すべてのサイトが開けることではなく、各種リクエストが想定した出力先へ進むことです。中国国内のサイトが開けなくてもログでdirectに一致しているなら、ローカルネットワークとDNSを確認します。海外サイトがproxyに一致しても接続できない場合は、ノード、通信パラメーター、リモート側への到達性を確認します。ルーティング判定と接続品質を分けて扱えば、正しいルールを何度も変更せずに済みます。

例外ルールはどこに置くべきか

実際の利用では、中国国内の特定ドメインだけプロキシ経由にしたい場合や、未分類のドメインだけ直接接続したい場合があります。そのときは対象範囲をできるだけ絞った例外を追加し、一般的な分類ルールより前に置きます。ドメインの完全一致にはfull:、特定のドメインとそのサブドメインにはdomain:を使用できます。1つのサイトのためにトップレベルドメイン全体へ範囲を広げないでください。

{
  "type": "field",
  "domain": [
    "full:service.example.net"
  ],
  "outboundTag": "proxy"
}

上の構成は、完全一致のドメインルールを置く位置と書き方を示すものです。実際の設定では、対象となる実際のドメインに置き換えてください。例外をgeosite:cnの後ろに置くと、対象がすでに国内分類に一致した時点で例外は実行されません。強制的に直接接続するドメインも同様に、最後のプロキシフォールバックより前に置きます。

一時的なDNS障害、ノードの利用不能、サイト側の障害を、そのまま恒久的なルーティングルールにしないでください。まずログでリクエストが本当に誤った出力先を選んだことを確認してから、例外を追加します。この手順で検証した設定は短く保ちやすく、geositeとgeoipのデータを更新した後も、手動ルールのどれを削除できるか判断しやすくなります。

V2Rayクライアントをダウンロード Windows、macOS、Android、Linux