すでにノードへ正常に接続できていて、中国本土のサイトを直結に切り替えたいユーザー向けです。読み終えると、正しい順序のルール一覧を自分で組めるようになります。ブロックを最前、LAN と中国本土ドメインの直結を中間、残りのトラフィックをプロキシで受ける構成です。あわせて、各ルールがどんな条件で効かなくなるのか、そのときにどこを確認すべきかも把握できます。
振り分け判定の 2 軸:ドメインと IP
ルーティングルールの基本構造は「条件 + アウトバウンド」です。条件は主にドメイン、IP、ポート、ネットワーク種別の 4 種類、アウトバウンドはプロキシ、直結、ブロックの 3 つだけです。中国本土と海外の分割振り分けでは、2 種類の条件でそれぞれ 1 セットずつ書くのが一般的です。ドメインが geosite:cn に一致したら直結、IP が geoip:cn に一致したら直結、残りのトラフィックはプロキシに渡します。
判定はカーネル内部で行われ、順序は固定です。宛先アドレスはまず本来の形式のままマッチングに参加します。アプリがカーネルに渡したのがドメインなら、まずドメインルールと照合します。ドメインルールがすべて外れた場合にのみ、カーネルはドメイン戦略に従って IP へ解決するかどうかを決め、その IP を IP ルールと照合します。
この順序はよくある現象を説明できます。geoip:cn だけを書き、geosite:cn を書いていない設定は、ドメイン戦略が AsIs のときほとんど機能しません。カーネルがドメインを解決していないため比較できる IP が存在せず、リクエストはすべて最下部のデフォルトアウトバウンドに落ちます。
逆に、ドメインルールだけを書く場合にも限界があります。アプリ側が先に DNS 解決を行い、IP 形式のアドレスをカーネルに渡した場合、ドメインルールには照合対象がありません。振り分けが正確になる前提は、ドメインをドメインの形式のままカーネルに入れることです。
マッチ順序:上から下へ、最初に一致した時点で確定
ルール一覧は集合ではなく順序付き配列です。カーネルは先頭から順に照合し、最初に一致した時点でマッチングを終了し、以降のルールは関与しません。順序そのものがロジックであり、ブロックは直結より前、直結はフォールバックより前に置きます。
v2rayN の「設定」→「ルーティング設定」で管理しているのがこの配列です。アウトバウンドのドロップダウンにある「プロキシ」「直結」「ブロック」は、カーネル設定の proxy、direct、block の 3 つのアウトバウンドタグに対応します。各行は 1 つの条件の組み合わせだけを表し、前後関係は上下移動で調整します。
多くの場面をカバーできる順序は次のとおりです。最終行はルールではなく、どのルールにも一致しなかったときにカーネルが使うデフォルトアウトバウンドです。
| 順序 | 条件 | アウトバウンド | 役割 |
|---|---|---|---|
| 1 | geosite:category-ads-all | ブロック | 広告・統計ドメインを直接拒否 |
| 2 | geosite:private | 直結 | LAN ドメインをプロキシ経由にしない |
| 3 | geoip:private | 直結 | 192.168.0.0/16 などのアドレス帯を直結 |
| 4 | geosite:cn | 直結 | 中国本土サイトをドメインで判定 |
| 5 | geoip:cn | 直結 | ドメインルールでカバーされない中国本土 IP のフォールバック |
| 6 | 一致するルールなし | プロキシ | デフォルトアウトバウンド、残りのトラフィックをノード経由に |
順序を誤った代償は具体的です。IP ルールをドメインルールより前に置くと、IPOnDemand 戦略では接続ごとに必ず 1 回ドメイン解決が走り、初回パケットの遅延が増えるだけでなく、CDN の解決結果が海外の IP になって誤判定する可能性もあります。ブロックルールを最後に置くと、広告ドメインは先に直結やプロキシのルールに取られてしまい、ブロックが読まれることはありません。
ドメインルールの 4 つの書き方
ドメイン条件は 4 種類のプレフィックスに対応し、粒度は広い順から狭い順になります。プレフィックスの書き間違いは、振り分けが不正確になる最も一般的な原因です。
| 書き方 | マッチ範囲 | 例 |
|---|---|---|
| 裸の文字列 / domain: | そのドメインとすべてのサブドメイン | domain:qq.com は www.qq.com に一致 |
| full: | 完全に同一のドメイン | full:www.example.cn は a.www.example.cn に一致しない |
| keyword: | ドメイン内にその文字列を含む | keyword:doubleclick はその文字列を含む任意のドメインに一致 |
| regexp: | 正規表現 | regexp:.*\.google\.com$ はそのサブドメインに一致 |
プレフィックスの書き方以外に、geosite コレクションを直接参照する方法もあります。geosite:cn は一般的な中国本土ドメインをカバーし、geosite:geolocation-cn はより広い範囲、geosite:private は LAN ドメイン、geosite:category-ads-all は広告・統計ドメインの集合です。コレクションのデータはルールファイルと一緒に配布されるため、新しく登場したドメインには遅れが出ます。これも「ルールを書いたのに漏れる」よくある原因です。
1 つのルールに複数の条件をカンマ区切りで書けます。いずれか 1 つが一致すればマッチと見なされます。
"domain": [
"domain:qq.com",
"full:www.example.cn",
"keyword:doubleclick",
"regexp:.*\\.google\\.com$",
"geosite:cn"
]
注意が必要なのは、keyword: と regexp: が Xray カーネルの拡張記法であり、v2ray カーネルでは機能しない点です。v2rayN は「設定」→「パラメータ設定」でカーネルを切り替えられます。v2rayNG は Xray カーネル固定、v2flyNG は v2fly カーネルを使用します。カーネルをまたいでルールを移行する前に、この 2 種類の記法がサポートされているか確認してください。
IP ルールと geoip:cn の適用範囲
geoip:cn が判定するのは IP の帰属であり、ドメインの帰属ではありません。中国本土のドメインが海外 CDN の IP に解決されると非中国本土と判定され、海外ドメインが中国本土のノード IP に解決されると中国本土と判定されます。そのため IP ルールはフォールバック向きで、主要な判定基準には向きません。
LAN アドレスは明示的に直結させる必要があります。geoip:private は 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8 などのアドレス帯をカバーします。geoip:cn だけを書くと、ルーターの管理画面、NAS、LAN 内のプリンターへのアクセスがプロキシに送られ、ノードはつながっているのに LAN のサービスが開けないという症状になります。
ドメイン戦略が解決のタイミングを決める
AsIs はドメインを解決しないため、IP ルールは形骸化します。IPIfNonMatch はドメインルールがすべて外れたときにだけ 1 回解決し、その解決結果を携えて先頭のルールから再マッチングします。IPOnDemand は IP ルールに遭遇した時点で即座に解決します。v2rayN の既定テンプレートは IPIfNonMatch です。IP による厳密な判定が必要でない限り、IPOnDemand に変更しないでください。
見落としやすい点がもう 1 つあります。IPIfNonMatch の 2 回目のマッチングは、IP を携えて先頭からやり直されます。リスト前方にある IP ルールが、本来ドメインルールで一致すべきリクエストを 2 回目で「横取り」することがあります。調査時にログのアウトバウンドが想定と違う場合は、まずその一致が何回目のマッチングで起きたかを確認してください。
結論:精度はドメインルール、フォールバックは IP ルール
geosite:private、geosite:cn を geoip:cn より前に置き、さらに geoip:private で LAN を受けるようにすれば、中国本土と海外の分割振り分けの誤差は CDN と DNS の 2 項目だけになります。この 2 項目は順序の調整では解決できず、DNS 設定で収束させる必要があります。
そのまま使えるルールの雛形と適用手順
ここまでの結論を組み合わせると、順序が完全な雛形になります。広告・統計ドメインのブロック、LAN の直結、中国本土ドメインの直結、中国本土 IP の直結、残りはプロキシです。v2rayN のルーティング設定にそのまま貼り付けても、カスタムルールセットとしてインポートしてもかまいません。
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{ "type": "field", "domain": ["geosite:category-ads-all"], "outboundTag": "block" },
{ "type": "field", "domain": ["geosite:private"], "outboundTag": "direct" },
{ "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" },
{ "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" },
{ "type": "field", "ip": ["geoip:cn"], "outboundTag": "direct" }
]
}
直結グループ
- ドメイン
- geosite:cn, geosite:private
- IP
- geoip:cn, geoip:private
- アウトバウンド
- direct
- 位置
- ブロックルールの後
ドメイン条件を前に、IP 条件を後ろに置き、中国本土サイトはドメインで優先的に判定します。
プロキシグループ
- ドメイン
- geosite:geolocation-!cn
- アウトバウンド
- proxy
- 位置
- ルール一覧の末尾
- フォールバック
- 未一致時のデフォルトアウトバウンド
この行は省略でき、デフォルトアウトバウンドに任せられます。明示しておくと、後から例外を追加しやすくなります。
v2rayN での適用手順は次のとおりです。
- v2rayN のメイン画面を開き、「設定」→「ルーティング設定」に進みます。7.x 系では「設定」→「パラメータ設定」→「ルーティング」タブで同じリストを管理します。
- 条件欄に
geosite:category-ads-all、geosite:private、geoip:private、geosite:cn、geoip:cnを順に入力し、アウトバウンドはそれぞれ「ブロック」または「直結」を選び、備考に用途を明記します。 - 「ドメイン戦略」を IPIfNonMatch に設定します。IP による厳密な判定が必要な場合を除き、IPOnDemand は選ばないでください。接続ごとに余分な解決が 1 回増えます。
- 保存後にカーネルを再起動し、新しい設定を config.json に書き込んで反映させます。
- SOCKS ポート 10808(HTTP ポート 10809)で中国本土のサイトと海外のサイトにそれぞれアクセスし、「ログ」タブで 2 つのリクエストのアウトバウンドタグが direct と proxy になっていることを確認します。
検証ではページが開けるかどうかだけを見ないでください。中国本土のサイトもプロキシ経由で開けます。判断材料はログのアウトバウンドタグです。direct と表示されれば直結、proxy と表示されればプロキシです。中国本土のサイトが proxy と表示される場合はルールが一致していないので、ドメイン戦略、ルール順序、DNS の順に確認してください。
よくある問題と確認手順
以下の 4 つでほとんどの振り分け異常をカバーできます。確認順序は固定で、まずドメイン戦略、次にルール順序、最後に DNS です。
中国本土のサイトがプロキシ経由になり、ページは開けるが明らかに遅い
まずドメイン戦略を確認します。AsIs ではカーネルがドメインを解決しないため、geoip:cn のような IP ルールは機能しません。IPIfNonMatch に変更し、カーネルを再起動してからログのアウトバウンドタグを確認してください。
geosite:cn を追加したのに新しいドメインが漏れる
geosite コレクションはパッケージ済みデータのため、新規ドメインには遅れがあります。漏れたドメインを domain: プレフィックスで直結ルールとして 1 行追加し、フォールバックより前に挿入して再テストします。
LAN 内のデバイスの管理画面が開けない
geoip:private の直結ルールを追加し、リストの最前へ置きます。geoip:cn だけでは 192.168.0.0/16 のようなアドレス帯をカバーできず、リクエストがノードに送られます。
ルールを保存しても何も変わらない
v2rayN はルーティング設定を保存した後にコア設定を再生成するため、反映にはカーネルの再起動が必要です。あわせて、ログで読み取られたルール件数が画面の表示と一致しているか確認してください。
ルールを変更したら 1 回の結果だけで判断しないでください。中国本土のサイトと海外のサイトをそれぞれ 2〜3 個ずつ試し、ログを開いてアウトバウンドタグを確認し、direct と proxy が想定どおりの位置に現れることを確かめて、はじめてルールが確定します。