この記事の概要

ノードの追加が済み、プロキシ経由でWebページを閲覧できるものの、中国本土への直接接続と海外向けプロキシのルールを調整したい方に向けた記事です。V2Ray/Xrayのルーティング項目を例に、ドメインリスト、IPリスト、ルールの評価順、デフォルトのアウトバウンドの関係を解説し、v2rayNのルーティング設定に反映する方法を紹介します。設定後はログを使い、ルール不一致、DNS名前解決エラー、リクエストがコアに届いていない場合を切り分けられます。

1. まずリクエストがコアに届いているか確認

ルーティングルールが処理するのは、プロキシのコアに届いた接続だけです。ブラウザーがシステムプロキシを使っていない場合や、アプリが独自に直接接続している場合、geosite:cnを変更しても通信経路は変わりません。まずv2rayNのメイン画面で「システムプロキシ」→「システムプロキシを自動設定」を選択し、ブラウザーの独自プロキシ拡張機能がシステム設定を上書きしていないことを確認してください。

アプリの接続 ローカルインバウンド ルールの照合 アウトバウンドの選択 接続先サービス

ポートは現在のクライアントに表示されている値を使います。たとえばローカルの混合プロキシポートが10808の場合、手動設定したアプリの接続先は127.0.0.1:10808です。ノードサーバーのリモートポートをローカルプロキシのポートに指定しないでください。「設定」→「パラメーター設定」で待ち受けポートを確認し、まず接続可能なノードで通信をテストしてからルールを変更します。

2. geositeはドメイン、geoipは接続先IPを照合

geosite:cnはドメイン分類データのcnセットを参照し、geoip:cnはIPデータベースにある中国本土のアドレスを参照します。両者は同じルールの別表記ではなく、ドメイン末尾だけで分類結果を判断することもできません。ドメインセットの内容は使用するデータファイルに依存するため、データを更新すると一部のサイトの照合結果が変わる場合があります。

ルールの内容設定する項目用途
geosite:cndomainドメインリストで中国本土に関連するドメインを照合します。事前のIP解決は不要です。
geoip:cnip接続先IPの所在地で照合し、IPアドレスへの接続や名前解決後のアドレスを判定します。
geoip:privateipリスト内のプライベートアドレスや特殊用途アドレスを照合します。ローカルネットワークへの直接接続によく使われます。
geosite:category-ads-alldomain広告ドメインのセットを照合します。使用中のドメインデータに該当セットが含まれているか確認してください。
domain:example.comdomain指定したドメインとそのサブドメインに一致します。個別の例外ルールに使います。
full:example.comdomain完全一致したドメインだけを対象とし、ほかのサブドメインには適用しません。

同じルールのdomain配列に複数の項目を入れた場合、通常はいずれか1つに一致すれば適用されます。一方、domainとipを同じルールに含めると、それぞれの条件を両方満たす必要があります。「中国本土のドメインまたは中国本土のIPを直接接続する」には、1つのルールオブジェクトにまとめず、2つのルールに分けてください。

3. domainStrategyでルーティング時の名前解決を制御

routing.domainStrategyは、ルーティング時にドメインをIPアドレスへ名前解決するかどうかを制御します。「すべてのDNSリクエストをプロキシ経由にする」設定ではなく、アウトバウンド側の名前解決ポリシーとも異なります。この記事ではIPIfNonMatchを使います。最初にドメインなどの条件を照合し、一致するルールがなければ接続先ドメインを解決してIPルールを照合します。

AsIs:現在の宛先情報で照合

項目
domainStrategy
値
AsIs
ルーティング時の名前解決
IPルールの照合に必要なドメイン解決を行いません。
適用例
主にドメインルールを使う場合、またはインバウンドに宛先IPがある場合

ドメインのリクエストがルールに一致しなくても、geoipルールがあるだけでは自動的にアドレスを検索しません。

IPIfNonMatch:不一致の場合に名前解決

項目
domainStrategy
値
IPIfNonMatch
ルーティング時の名前解決
最初の照合でルールが見つからない場合に実行
適用例
ドメインを優先し、IP分類で補完

最初の照合で全通信に一致するフォールバックルールが選ばれると、この追加の名前解決は実行されません。

よく使われる別の値IPOnDemandは、照合時にIPが必要になると名前解決を実行します。そのため、前方にIPルールがあるとDNS問い合わせが増えることがあります。早い段階でアドレスを照合する必要がある設定に適していますが、「中国本土向けの振り分けがより厳密になる」という意味ではありません。値の名前だけで決めず、DNSの到達性とルールの順序に合わせて選んでください。

設定のポイント:IPIfNonMatchでは無条件のフォールバックを使わない

この記事の設定を使う場合は、末尾にあるTCP/UDP全通信を対象とするプロキシルールを削除し、デフォルトのアウトバウンドがプロキシであることを確認してください。フォールバックルールに最初の照合で一致すると、未登録の中国本土ドメインがgeoipによる追加の振り分けに進めないことがあります。

4. 中国本土への直接接続・海外向けプロキシ・広告ブロックの設定

以下はルーティング部分のみで、そのまま実行できるクライアント設定一式ではありません。既存の設定にproxy、direct、blockという3つのアウトバウンドタグが定義され、outbounds配列の先頭がプロキシであることを前提としています。V2Ray/Xrayはルーティングルールに一致しない場合、先頭のアウトバウンドを使います。そのため、ここでは「海外向けプロキシ」を末尾の全件一致ルールではなく、デフォルトのアウトバウンドで処理します。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}
  1. 広告ドメインを先に照合:category-ads-allに一致した通信は拒否アウトバウンドに渡され、後続の直接接続ルールには進みません。
  2. ローカルIPは直接接続:192.168.1.1などのプライベートアドレスに接続する場合、宛先はもともとIPアドレスなので、プライベートアドレスのルールに直接一致します。
  3. 中国本土のドメインは直接接続:geosite:cnに登録されているドメインは、IP分類を待たずに直接接続アウトバウンドを選択します。
  4. 中国本土のIPを補完:ドメインで最初の照合に一致しなかった場合、コアのDNSで取得したアドレスを使ってgeoip:cnを照合します。
  5. それ以外はデフォルトのプロキシへ:ドメインとIPのどちらにも一致しない場合、確認済みの先頭プロキシアウトバウンドが使われます。

「上から順に最初の一致を使う」という動作は、名前解決のタイミングも考慮する必要があります。宛先がドメインだけの場合、IPIfNonMatchは前方にあるプライベートIPルールのために直ちに名前解決することはありません。最初の照合でドメインが別のルールに一致すると、後から得られたIPを使った再判定も行われません。したがって、イントラネットのドメインには明示的な直接接続ルールを追加し、geoip:privateだけに頼らないでください。

5. v2rayNでルーティング設定を作成して有効化

まず現在のルーティング設定をバックアップし、「設定」→「ルーティング設定」を開きます。バージョンによって編集画面のレイアウトが異なる場合があるため、現在の画面にある「ドメイン戦略」「ルール一覧」とアウトバウンドの選択項目を確認してください。完全なroutingオブジェクトを、ルール配列だけを受け付ける入力欄に貼り付けないでください。また、実行時に生成され、再起動後に上書きされる設定ファイルを直接編集しないでください。

  1. テスト用の設定を作成:「設定」→「ルーティング設定」で設定を追加するか、既存の設定を複製します。「中国本土への直接接続テスト」など、用途が分かるメモを付けてください。元の設定は復元できるように残しておきます。
  2. ドメイン戦略を設定:「ドメイン戦略」をIPIfNonMatchにします。編集画面に英語の値が表示されている場合は、そのまま選択してください。この値を個別のドメインルールに記入するものではありません。
  3. ルールを1つずつ追加:広告ドメイン、プライベートIP、中国本土のドメイン、中国本土のIPの順に設定します。ドメインセットはドメイン条件に、IPセットはIP条件に入力し、アウトバウンドには拒否または直接接続を選択してください。
  4. デフォルトのプロキシを確認:すべての通信を対象にする末尾ルールがないか確認します。この記事の設定では、全件一致のルールを追加してフォールバックさせるのではなく、生成される設定の先頭アウトバウンドがプロキシであることを確認してください。
  5. 保存して有効化:メイン画面に戻り、「ルーティング」で作成した設定を選びます。コアが設定を再読み込みしたことを確認してください。ログに設定エラーが表示された場合は、元の設定に戻してから、ルールを1つずつ確認します。

v2rayNの通常のノード設定から、コアが必要とするアウトバウンドが生成されます。画面上の「プロキシ」「直接接続」「ブロック」とJSONのタグは対応付けられていますが、中国語の表示名だけを見て、最終的なタグが必ずproxy、direct、blockになるとは限りません。カスタムの完全な設定を使う場合は、タグとデフォルトのアウトバウンド順を自分で整えてください。GUIのルール編集画面を使う場合は、既存のアウトバウンド選択肢を優先してください。

画面での操作設定の確認ポイント設定ミスの例
ドメイン戦略を選択routing.domainStrategyがIPIfNonMatchAsIsのままでは、IPによる追加ルールのためにドメインが自動で名前解決されません。
ドメイン分類を追加domainにgeosite:cnを含めるIP条件に誤って入力すると、設定を読み込めない場合があります。
アドレス分類を追加ipにgeoip:privateを含めるドメイン条件に誤って入力しても、接続先アドレスによる振り分けはできません。
デフォルトのプロキシを設定先頭のアウトバウンドがプロキシで、最初の照合で全件一致するルールがリクエストを先取りしない海外の接続先が直接接続されたり、中国本土のIPによる追加振り分けが実行されなかったりします。

6. 固定したリクエストとログで照合結果を確認

Webページの表示速度だけで振り分けを検証することはできません。キャッシュ、接続の再利用、ノードの負荷によって所要時間は変わりますが、どのアウトバウンドが選ばれたかは分かりません。ローカルの接続方法とテスト先を固定し、v2rayNのログ画面で宛先アドレスとアウトバウンドタグを確認してください。ログに接続記録が表示されない場合は、「設定」→「パラメーター設定」でログレベルの項目を探し、一時的にinfoへ変更します。確認後は元の値に戻してください。

以下ではWindowsのcurl.exeからローカルのHTTPプロキシに明示的に接続し、ブラウザー拡張機能やシステムプロキシの状態による影響を除外します。10808はポートの例です。HTTP接続に対応した現在の待ち受けポートに置き換えてください。--max-time 15は最大15秒待機する指定であり、実際の速度測定結果を示すものではありません。

curl.exe --proxy http://127.0.0.1:10808 --max-time 15 -I https://www.baidu.com/
curl.exe --proxy http://127.0.0.1:10808 --max-time 15 -I https://example.com/

確認の順序:まずアウトバウンドを確認し、その後で接続失敗を調べる

ログに正しいアウトバウンドが記録されている場合は、その経路のDNS、接続、サービス応答を確認します。誤ったアウトバウンドが記録されている場合は、ルールの順序と分類データを見直してください。ルールを変更するたびに接続を新しく確立し、キャッシュや既存接続による混同を避けます。

7. よくある質問:ルールは有効なのに期待どおりに動作しない

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

まずメイン画面の「ルーティング」で、保存した設定が選択されていることを確認します。次に、前方のルールが先に一致してプロキシに送っていないか確認してください。ログの宛先がドメインではなくIPの場合、ドメインセットではその接続を直接判定できないため、IPルールを確認します。宛先がドメインのままなら、現在のデータファイルにそのサイトが登録されているか確認してください。

末尾に全通信をプロキシに送るルールを設定したのに、geoip:cnが機能しないのはなぜ?

IPIfNonMatchでは、全件一致のプロキシルールが最初の照合でリクエストを受け取ると、「不一致後の名前解決」は実行されません。フォールバックルールを削除し、先頭のアウトバウンドが実際にプロキシであることを確認してから、新しい接続で再テストしてください。フォールバックルールを残す必要がある場合は、geoipルールを移動するだけでなく、名前解決の戦略を見直します。

geoip:privateだけを有効にしたのに、イントラネットのドメインに接続できないのはなぜ?

イントラネットの名前は、適切なDNSで解決できる必要があります。また、ほかのドメインルールによって先にプロキシへ送られていないか確認してください。実際に使うイントラネットのドメイン末尾に明示的な直接接続条件を追加し、対応するDNSに到達できるか確認します。直接接続ルールを追加しても、パブリックDNSが社内のホスト名を認識するようにはなりません。

トラフィック検出を有効にすれば、必ずドメインで振り分けられる?

いいえ。トラフィック検出でドメイン情報を取得できるのは一部のプロトコルのハンドシェイクに限られ、ルーティングに使われるかどうかはインバウンド側の検出設定にも依存します。すべての接続からドメインを取得できるわけではありません。まずインバウンドがドメインとIPのどちらを受け取っているか確認し、必要に応じて検出設定を変更してください。DNSの修復手段として検出機能を使わないでください。

広告ブロック後にログイン画面や決済ページで問題が起きたら?

まず広告ルールを一時的に無効にして再テストし、誤ってブロックしていないか確認してください。分類が原因の場合は、必要なドメインに対して範囲をできるだけ限定した例外ルールを作り、広告ルールより前に配置します。例外の通信先は用途に応じてプロキシまたは直接接続を選び、1つのリソースを復旧させるためにサイト全体のサブドメインを許可しないでください。

最終的には、動作を説明できるルール構成にします。必要な例外を先頭に置き、続いて広告ブロック、プライベートアドレスと中国本土のドメインの直接接続、IP分類による補完を設定し、デフォルトのアウトバウンドをプロキシにします。DNSで解決されたアドレスはIPの照合結果に影響するため、名前解決が妨害されると、正しいルールでも誤った分類になることがあります。ルーティングを検証した後、DNSは別途確認してください。接続経路、名前解決、アウトバウンドを同時に変更すると、比較検証が難しくなります。