V2Rayのカスタムルーティング設定|domain・ip・geositeの書き方と優先順位

domain・full・regexp・ip・geosite・geoipの書き方と、上から順に適用されるルールの優先順位を解説。設定ミスの確認方法も紹介します。

この記事の概要

サブスクリプションを追加済みで、特定のサイトやネットワークだけ経路を分けたい方に向けた解説です。まずドメイン条件とIP条件を区別し、次にルールの順序とDNS名前解決のタイミングを確認します。読み終えると、対象を絞った例外ルールを作成し、ログからマッチした理由・しなかった理由を判断できるようになります。

ルーティングの優先順位:最初にマッチしたルールが適用される

V2RayとXrayの通常のルーティングルールは、routing.rules配列の先頭から順に確認されます。ルールにマッチすると指定されたアウトバウンドが使われ、それ以降のルールは確認されません。つまり、より具体的なドメインを広範な分類ルールの後に書いても、自動的に優先されるわけではありません。例外ルールは前に配置してください。

同じルール内のdomain配列に複数の項目がある場合、通常はいずれか1つにマッチすれば条件を満たします。一方、異なる条件フィールドは通常「かつ」の関係です。domainとportを指定すると、ドメインと接続先ポートの両方が一致する必要があります。ドメインとIPを同じルールに書いても、「どちらか一方に一致すれば適用」という意味にはなりません。

1件
マッチすると、この接続のルール選択は終了
443
例のルールで指定している接続先ポート
/32
単一のIPv4アドレスを表すCIDRプレフィックス

以下は「指定したホストの443番ポートだけをプロキシ経由にする」コアのルールです。ここでのproxyはアウトバウンドのタグであり、組み込みキーワードではありません。設定全体に同じタグのアウトバウンドが必要です。また、ノードの表示名でもないため、サブスクリプションにあるノード名へ確認せず置き換えないでください。

{
  "type": "field",
  "domain": ["full:portal.example.com"],
  "port": "443",
  "outboundTag": "proxy"
}

domain・full・regexp:ドメインの書き方とマッチ範囲

domainはルールのフィールド名で、domain:はフィールド値に使うマッチ用プレフィックスです。両者は異なる階層にあります。正しいフィールド表記は"domain": ["domain:example.com"]です。fullやregexpを、domainと並ぶルールフィールドとして扱わないでください。

記述例意味範囲に関する注意
full:example.comこのホスト名に完全一致www.example.comは含まれない
domain:example.comルートドメインとサブドメインにマッチa.example.comは含むが、notexample.comは含まない
regexp:^api[0-9]+\.example\.com$正規表現でマッチここではマッチ用の正規表現を表示しています。JSONに記述する際は、バックスラッシュをさらにエスケープしてください
example.comプレフィックスのない文字列は部分一致想定より広い範囲にマッチすることがあり、特定の例外指定には不向き
geosite:cnドメインデータベースの分類を参照分類内容は、読み込まれているデータファイルによって異なる

特定サイトだけに例外を設定するならfull:、ルートドメインとすべてのサブドメインを同じ経路にするならdomain:を使います。正規表現は、ホスト名に明確な規則性がある場合に限って使用してください。ドメイン項目にはhttps://、パス、クエリパラメーターを含めないでください。ルーティングが判定するのは接続先のホスト名であり、ブラウザーのアドレスバーに表示される完全なURLではありません。

{
  "type": "field",
  "domain": [
    "full:portal.example.com",
    "domain:static.example.net",
    "regexp:^api[0-9]+\\.example\\.com$"
  ],
  "outboundTag": "proxy"
}

この配列の3項目は、それぞれ代替条件です。api12.example.comへのアクセスは正規表現で、img.static.example.netへのアクセスはドメインのサフィックスでマッチします。JSON内の\\.は、解析後に正規表現の\.になります。エスケープが1段足りないと、設定を読み込めないことがあります。

ip・geoip・geosite:IP範囲と分類データを使い分ける

ip配列には接続先IPの条件を指定し、単一アドレス、CIDR範囲、geoip:分類を記述できます。geosite:はドメイン条件なので、domain配列に記述します。この2種類の分類プレフィックスを入れ替えても、ドメインとアドレスの両方を使った想定どおりのルーティングにはなりません。

{
  "type": "field",
  "ip": [
    "192.168.10.0/24",
    "10.0.0.8/32",
    "geoip:private"
  ],
  "outboundTag": "direct"
}

ウェブサイトが複数のコンテンツ配信ネットワークを使っていたり、同じドメインでもネットワーク環境によって異なる地域のIPに名前解決されたりすることがあります。ドメイン分類とIP分類で異なる経路が選ばれても、必ずしもルールの不具合とは限りません。「このサイトへの接続を常にプロキシ経由にする」のか、「このIP範囲を直接接続にする」のかを確認し、条件を選んでください。

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

routing.domainStrategyは、ルーティング時にドメインとIPのルールをどのように扱うかを指定します。DNSサーバーのアドレスでも、アウトバウンド接続時のアドレス選択方式でもありません。以下の3つはV2Ray/Xrayで一般的なルーティング設定の値です。具体的な動作は、実行中のコアのバージョンで確認してください。

AsIs

推奨

ドメイン名で渡された接続先について、ルーティング判定のためのIP名前解決を行いません。IPアドレスで渡された接続先は、引き続きIPルールにマッチできます。まずドメインの例外ルールと順序を調整したい場合に適しており、切り分け時の変数を減らせます。

適した用途:ドメインルールを優先する場合、カスタムルーティングの初回検証

IPIfNonMatch

既存ルールでドメインにマッチしなかった場合に、IPへ名前解決して後続ルールの判定に使います。先行する広範なルールが接続を処理した場合、後ろにgeoipの項目があるだけで名前解決が行われるわけではありません。

適した用途:主要な通信をドメインルールで振り分け、IP分類を補助的なフォールバックとして使う場合

IPOnDemand

判定中に接続先IPが必要なルールに達すると、ドメインを名前解決します。IPルールを前方に置くと、より早い段階でDNS問い合わせが発生し、後続のドメイン例外より先に経路が決まる場合があります。

適した用途:IP条件を優先して判定する必要が明確な場合

ポイント:まずルール順を整え、次に名前解決の方針を変える

まずAsIsで特定ドメインの例外がマッチすることを確認します。ドメインで指定された接続にgeoipの判定も必要な場合は、次にIPIfNonMatchを試し、変更前後のログで接続先アドレスとアウトバウンドタグを記録してください。

アプリが先にドメインを名前解決し、IPアドレスだけをプロキシに渡すと、コアから元のドメインが見えない場合があります。一部のプロトコルではトラフィックのスニッフィングでドメイン情報を補えることがありますが、すべての接続で有効とは限りません。有効にする場合も、「ルーティングにのみ使う」設定と「接続先を書き換える」設定の違いを確認してください。スニッフィングを有効にすればドメインルールが必ず適用される、とは考えないでください。

ルーティング設定の全体例:特定ドメインの例外を分類ルールより前に置く

以下は、完全な設定に組み込むrouting部分のみを示した例で、単独で起動できる設定ファイルではありません。directとproxyの2つのアウトバウンドタグが設定済みであることを前提とします。ルールは、ローカルネットワークのアドレス、特定ドメインの例外、ドメイン分類、IP分類、最後にTCP/UDPのフォールバックの順です。

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

この例で見落としやすいのは、最後のnetworkルールが通常のTCP/UDP接続を処理する点です。IPIfNonMatchでは、ドメインの接続がこのルールにマッチすると、それ以前のIP分類にマッチしなかったとしても、「どのルールにもマッチしなければ名前解決する」処理には進みません。したがって、この例のgeoip:cnが主に処理するのは、接続先IPがすでに指定されている通信です。残りすべてのドメインをIP分類する設定と捉えないでください。

デフォルトのアウトバウンドは、クライアント画面で「現在選択中のノード」を見るだけで判断せず、設定全体で確認してください。v2rayNは実行用設定を生成するため、一時生成ファイルを手動編集しても、ノードの切り替えや再起動で上書きされることがあります。長期間使うルールはクライアントのルーティング設定に保存してください。

v2rayNのカスタムルーティング:ルールを1つずつ検証する

v2rayNはデスクトップクライアントで、実際の通信処理は選択中のコアが行います。以下の手順は「設定」→「ルーティング設定」の項目があるデスクトップ画面を対象としています。バージョンによってボタンの位置や項目名が異なる場合があります。編集前に現在のルーティング設定名を記録し、既存ルールを残しておくと、サブスクリプションのノードとルーティングの問題を切り分けやすくなります。

  1. ルーティング設定を開く

    「設定」→「ルーティング設定」を開き、現在使用中の設定を記録します。例外ルールを追加する前に、既存のルールをエクスポートするかコピーして保存してください。

  2. ドメイン条件を入力する

    ルール編集画面のドメイン条件にfull:portal.example.comを入力します。GUIの入力欄には通常、個々のルール項目を入力します。routingのJSON全体を貼り付けないでください。

  3. 適用するアウトバウンドを選ぶ

    要件に合わせてプロキシまたは直接接続を選びます。コアのJSONを編集する場合は、outboundTagとoutbounds内のタグが一字一句一致していることを確認してください。

  4. ルールを上へ移動して有効にする

    例外ルールをドメイン分類や広範なフォールバックより上に移動します。保存後、メイン画面のルーティング選択でこの設定を有効にしてください。保存しただけで、以前の設定を使い続けないように注意します。

  5. テスト接続を作り直す

    テスト中のページを閉じ、既存の接続を切ってから新しいリクエストを送ります。コアのログで接続先ホスト、ポート、アウトバウンドタグを確認し、一度に変更する条件は1つだけにしてください。

検証では、実際のテスト対象ホストをfull:の例外として指定し、マッチを確認してからdomain:や分類へ広げると確実です。ブラウザーが接続を再利用すると、古い接続では以前の経路が使われるため、ページを再読み込みするだけでは新しい接続が作られないことがあります。コマンドラインツールで試す場合も、クライアント画面に表示されたローカルプロキシポートを明示してください。環境ごとにポートが同じとは限りません。

ルーティングルールが適用されないときの原因と確認方法

ドメインは正しいのに、なぜ直接接続になる?

特定ドメインのルールを分類ルールより前に移動し、変更後のルーティング設定が有効になっていることを確認してください。ログにIPアドレスしか表示されない場合は、アプリが事前に名前解決していないか、コアがドメイン情報を取得できるかを調べます。

geositeを設定すると、なぜコアが起動しない?

ログにドメインデータファイルが見つからない、または分類を読み込めないといったエラーがないか確認します。geosite.datの配置先と分類名を確認し、まずfullを使ったドメインルールで基本設定を検証してから、分類ルールを戻してください。

ウェブサイト本体はプロキシ経由なのに、画像は違うのはなぜ?

ブラウザーのネットワークパネルで、画像リクエストの実際のホスト名を確認します。画像が別のルートドメインから配信されている場合、サイト本体のdomain項目では対象になりません。用途を確認して、画像配信用ドメインに個別のルールを追加してください。

ポート443にマッチしているのに、ダウンロードできないのはなぜ?

ポート条件が決めるのは通信経路であり、接続先への到達性ではありません。ログでアウトバウンドタグを確認したうえで、ノードの接続性、DNSの結果、UDPへの対応を個別に調べてください。443番ポートはTCPにもUDPにも使われます。

クライアントを再起動したら、カスタムルールが消えたのはなぜ?

変更が一時生成されたコアの設定ファイルだけに保存されていないか確認してください。「設定」→「ルーティング設定」に戻ってルールを保存し、該当する設定を有効にします。独立したカスタム設定を使っている場合は、実際に読み込まれるソースファイルを編集してください。

最後に、接続がコアに届いているか、コアが認識しているのはドメインかIPか、最初にマッチしたルールがどのアウトバウンドを指定しているかを確認しましょう。この3点を先に調べると、DNSの変更、コアの切り替え、サブスクリプションの再設定を同時に行うより、原因を特定しやすくなります。各フィールドの説明はプロトコルとコアのリファレンスを、用語の確認には用語集をご覧ください。

v2rayNをダウンロード