ノードを追加済みで、v2rayNのルーティングルールを編集したい方向けの記事です。ドメインとIPの条件を整理し、JSONの例を使って接頭辞、ルールの順序、ドメイン解決方針を解説します。最後にクライアントでの確認手順を紹介し、ルール不一致、出力タグの誤り、DNS解決エラーを切り分けます。
まず確認:フィールド・マッチ条件・出力タグ
V2RayやXrayの一般的なルーティング設定は、routing.rules配列に記述します。各ルールは「どの接続を条件にするか」と「条件に一致した場合、どの出力へ渡すか」を指定します。domainとipはフィールド名で、domain:、full:、geosite:はドメインのマッチ値に付ける接頭辞です。この2つの書式を混同しないようにしましょう。
以下はルーティングルールの例で、コア設定全体ではありません。宛先ドメインがexample.comと完全一致し、TCPの443番ポートを使う接続を、proxyという出力に渡します。ポートは宛先サービスのポートであり、クライアント側の待ち受けポートではありません。
{
"type": "field",
"domain": ["full:example.com"],
"network": "tcp",
"port": "443",
"outboundTag": "proxy"
}
- 同じフィールド内は通常「OR」条件:
domain配列のいずれかのドメイン条件に一致すれば、そのフィールドの条件を満たします。 - 異なる条件フィールド間は「AND」条件:上の例では、ドメイン、TCP、宛先ポート443のすべてに一致した場合に、その出力が選ばれます。
- タグは実在する必要があります:
outboundTagにはoutbounds内のtagを指定します。ノードの備考や、自由に書ける日本語の動作説明ではありません。
ドメインの接頭辞:domain・full・regexp・geosite
同じドメインでも、接頭辞によってマッチする範囲は大きく異なります。メインドメインとすべてのサブドメインを対象にする場合はdomain:、ホスト名を完全一致させる場合はfull:を使います。広範囲に一致するキーワード指定より、確認しやすい書き方です。
| 書式 | マッチする範囲 | 注意点 |
|---|---|---|
domain:example.com | example.comとそのサブドメイン(api.example.comなど) | notexample.comには一致しない |
full:example.com | example.comのみ | www.example.comは含まない |
regexp:^api[0-9]+\.example\.com$ | api1.example.com、api20.example.comなど | 正規表現のアンカーでホスト名全体を指定 |
geosite:cn | データファイル内のcnカテゴリに含まれるドメイン | カテゴリの内容は使用するデータファイルによって異なる |
example.com | ドメインに指定した文字列を含む宛先 | 接頭辞なしの文字列は、サフィックス境界での一致ではない |
geosite:が参照するのはローカルのドメイン分類データで、サイトの所在地をリアルタイムに調べるものではありません。geosite:cnも「末尾が.cnのドメインすべて」を意味するわけではありません。別の末尾のドメインが含まれることもあれば、新しいサイトがまだ登録されていない場合もあります。カテゴリ名、属性、エントリは、実際にインストールされているデータファイルを確認してください。
正規表現にはJSONのエスケープ処理も必要です。表の正規表現はマッチ用のパターンです。JSON文字列に書くとき、ドットを文字として扱うためのバックスラッシュは2つ記述します。クライアントの通常のテキスト入力欄にルールを入力する場合は、その欄の書式に従い、機械的にエスケープを重ねないでください。
{
"type": "field",
"domain": [
"domain:example.com",
"regexp:^api[0-9]+\\.example\\.net$"
],
"outboundTag": "proxy"
}
ポイント:まず完全一致で確認し、対象範囲を広げる
特定のサイトを調べる場合は、まずfull:ルールを追加します。一致を確認した後で、domain:やカテゴリルールに変更するか検討しましょう。最初から広範囲に一致する正規表現を使うのは避けてください。
IPルール:アドレス・CIDR・geoip
IP条件はip配列に記述します。単一アドレスはそのまま指定し、ネットワークはCIDR形式、地域や特殊なアドレスの集合にはgeoip:を使います。アドレスにip:を付けるのは正しい書式ではありません。配列の値にip:192.168.1.1と記述すると、設定の読み込みに失敗する可能性があります。
アドレスとネットワーク
- 設定フィールド
ip- 単一アドレス
192.168.1.1- IPv4ネットワーク
192.168.0.0/16- IPv6ネットワーク
fc00::/7
特定のデバイスアドレスや内部ネットワークを指定する場合に適しています。ドメイン分類に依存せずに設定できます。
IPデータの集合
- 設定フィールド
ip- 地域のアドレス集合
geoip:cn- プライベートアドレスの集合
geoip:private- データへの依存
geoip.dat
集合の有無や対象アドレスは、使用中のデータファイルで確認してください。
リクエストがコアに届いた時点で宛先がIPアドレスなら、IPルールをそのまま評価できます。宛先がまだドメイン名の場合、名前解決後のIPアドレスで再評価するかどうかはdomainStrategyによって異なります。ブラウザー側での名前解決、アプリによるIPアドレスへの直接接続、クライアントのスニッフィングによるドメイン名の復元なども、ルーターが最終的に取得する宛先情報に影響します。
- ドメインの末尾からサーバーの所在地を推測しない:1つのドメインが複数地域のIPアドレスに解決されることがあり、CDN経由では特によくあります。
- IPv4だけで済ませない:アプリがIPv6アドレスに接続している場合、IPv4ネットワークだけを指定しても、その接続には適用されません。
- プライベートアドレスの直結はネットワーク環境に合わせる:通常、ローカルLANへの接続は直結にします。遠隔ネットワーク経由でアクセスする内部アドレスには個別のルールを設定し、広範囲な直結ルールより前に配置してください。
マッチの優先順位:先に一致したルールが適用される
ルーティングルールは配列の先頭から順に評価され、最初に条件を満たしたルールで出力先が決まります。コアがすべての一致項目を比較し、「最も精密そうな」ルールを選ぶことはありません。例外を安定して適用するには、広範囲のルールより前に個別のドメインルールを置きます。
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": ["full:ads.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
既存の設定に組み込むためのrouting部分であり、インバウンド、アウトバウンド、DNSの設定は含みません。3つのタグがすでに定義されている場合、ads.example.comは最初のルールに一致してブロックされ、www.example.comは2番目のルールに一致してプロキシ経由になります。プライベートアドレスへの直接接続は3番目のルールに一致し、それ以外のTCP・UDP接続は最後のルールで処理されます。
- ほかのルールに優先させる例外を先に置きます。たとえば、特定ドメインのブロックや、指定サービスのプロキシ経由などです。
- 次にドメイン集合やIP集合を配置します。条件が重なる可能性がある場合は、どちらを先に適用するか決めておきましょう。
- 広範囲なフォールバックルールは最後に置きます。
network: tcp,udpに対応するルールを先頭に移すと、後続の通常のTCP・UDPルールは一致しなくなります。
どのルールにも一致しない場合、一般的なV2Ray/Xray設定では最初の出力が使われます。「中国国内は直結、それ以外はプロキシ」と自動で判断するわけではありません。明示的なフォールバックは設定を読みやすくしますが、ドメイン解決後の再評価にも影響するため、ドメイン戦略と切り離して調整しないでください。
domainStrategy:名前解決とIPルールの再評価
routing.domainStrategyは、ルーティングの評価時にドメイン名をどう扱うかを制御します。クライアント全体のDNS設定とは別のもので、アプリがドメイン名をコアに渡すことを保証する設定でもありません。まずインバウンドが受け取った宛先がドメイン名かIPアドレスかを確認し、適切な戦略を選びましょう。
| 戦略 | ルーティング時の動作 | 選択の目安 |
|---|---|---|
AsIs | ルーティングのマッチングを目的とした名前解決を行わない | 主にドメインルールを使う場合や、ルーティング時の名前解決への依存を減らしたい場合 |
IPIfNonMatch | ドメインルールに一致しなかった場合、名前解決してIPルールも評価する | ドメインルールを優先し、IPルールで補完する場合 |
IPOnDemand | 評価中にIP判定が必要なルールに到達したら、名前解決を試みる | 先行するIPルールも判定に含めたい場合 |
特に注意が必要なのは、IPIfNonMatchと無条件のフォールバックルールの組み合わせです。最初の評価でTCP・UDPの最終フォールバックルールに一致した場合、「ルールに一致しなかった」状態にはなりません。そのため、その後にドメイン名を解決してgeoip:cnに一致させることはできません。この戦略でIPルールによる振り分けを補う場合は、評価を早期終了させる広範囲なルールがないか、また未一致時のデフォルト出力が適切かを確認してください。
IPOnDemandでは、ルールの順序に特に注意してください。先行するIPルールが名前解決を開始して一致すると、後続のドメイン例外ルールが評価されないことがあります。特定のドメインを必ずプロキシ経由にするには、そのドメインの完全一致ルールを、対象を含み得るIPルールより前に置きます。
ポイント:ドメイン戦略を変えたら、フォールバックの位置も確認
戦略をIPIfNonMatchに切り替えた後は、サイトが開くかどうかだけで判断しないでください。最初の評価で対象がフォールバックに捕捉されていないか、ログに表示される最終的な出力先が想定どおりかも確認しましょう。
v2rayNでルールを編集して動作を確認する
v2rayNのルーティング編集画面は、バージョンによって変更されることがあります。一般的な設定場所は「設定」→「ルーティング設定」です。画面を開いたら、編集対象のルールセットを確認し、メイン画面で現在有効になっているルーティング設定が同じセットか確かめてください。無効なルールセットだけを編集しても、現在の接続の振り分けは変わりません。
- 現在の状態を保存:使用中のルールをバックアップし、現在のコアの種類、ドメイン戦略、最終的な出力先を記録します。この記事はV2Ray/Xray形式を扱います。他のコアで異なる設定構造に、そのままコピーしないでください。
- 確認しやすいルールを1つだけ追加:ドメイン条件に
full:と実際の宛先ホスト名を入力し、該当する出力先を選びます。その宛先に一致し得る広範囲なルールより前に配置してください。 - 適用して接続し直す:ルールを保存し、必要に応じてコアを再起動します。テストページの既存の接続を閉じてから再試行してください。すでに確立された長時間接続は、ルールを変更しても出力先が自動で切り替わりません。
- ログで動作を確認:使用中のバージョンのログ設定で、確認中だけ
infoまたは必要なレベルに引き上げます。宛先ドメイン、ポート、出力タグを確認したら、通常のログレベルに戻してください。 - ルールの対象を段階的に拡大:ドメインの完全一致で動作を確認してから、
domain:に変更するかgeosite:を追加します。変更は一度に1つに絞ると、問題の原因を特定しやすくなります。
よくある記述ミスと対処法
domain:example.comを設定したのに、別のサイトまでプロキシ経由になるのはなぜ?
ほかに接頭辞なしの文字列、カテゴリルール、プロキシへのフォールバックが一致していないか確認してください。domain:example.comが対象とするのは、そのドメインとサブドメインのみで、notexample.comには一致しません。実際に選ばれた出力先をログで確認し、ルールごとに対象範囲を絞り込みましょう。
geosite:cnを設定したのに、コア起動時にカテゴリが見つからないと表示されるのはなぜ?
使用中のコアが参照するgeosite.datが存在するか、ファイルにcnカテゴリが含まれているかを確認してください。クライアントに用意されたデータ更新機能で更新してから、もう一度試します。別形式のルール用ファイルを、そのまま名前だけ変えて置き換えないでください。
正規表現をJSONに入れたらエスケープエラーになった。どこを直せばいい?
バックスラッシュを確認してください。ドットに文字として一致する正規表現\.は、JSON文字列では\\.と記述します。半角の二重引用符と配列内のカンマも確認しましょう。設定を読み込めるのに一致しない場合は、アンカーと実際のホスト名を確認してください。
完全一致の直結ルールを追加したのに、まだプロキシ経由になるのはなぜ?
広範囲なプロキシルールより前に移動し、編集したルールセットが有効になっていることを確認してから接続し直してください。ログに宛先IPしか表示されない場合は、アプリが独自に名前解決していないか、スニッフィング設定が適用できるかを確認します。コアがドメイン名を取得できないと、ドメインの完全一致ルールは直接適用できません。
domainとipを同じルールに指定した場合、どちらか一方に一致すれば適用される?
いいえ。異なる条件フィールドはすべて満たす必要があります。「このドメインまたはこのネットワークを直結する」場合は、ルールを2つに分け、どちらにも同じ直結出力を指定してください。ドメイン条件とIP条件を個別に確認しやすくなります。