ノードへの接続ができ、これから振り分けルールを調整する方向けの記事です。まずドメインリストとIPアドレスリストの違いを確認し、中国本土のサイトやLAN内の通信を直接接続し、それ以外をデフォルトでプロキシ経由にする設定を組み立てます。IPIfNonMatchでの名前解決条件、先頭のアウトバウンドによるフォールバック、クライアントログで実際の出口を確認する方法を解説。「ページが開ける」だけで振り分けが正しいと判断しないためのポイントも紹介します。
1. geositeとgeoipの違い
geositeはドメインの分類データ、geoipはIPアドレス範囲のデータです。どちらもサイトの運営元を自動判定するサービスではなく、運営主体をリアルタイムに調べるものでもありません。ルーティング結果は、端末上のデータファイル、コアに渡されるリクエストの宛先情報、ルールの順序によって決まります。
| 設定方法 | 照合対象 | 利用上の注意 |
|---|---|---|
geosite:cn | データ内のcn分類に登録されたドメイン | コアがドメイン名を取得できる必要がある。中国語サイトすべてを指すわけではない |
geoip:cn | データ内の中国本土のIPアドレス範囲 | 宛先IPに依存するため、サイトの運営会社までは判定できない |
geoip:private | プライベートアドレスや予約済みアドレスなどの集合 | LAN内の通信を直接接続するときによく使う。範囲は使用するデータファイルによって異なる |
domain:example.com | 指定したドメインとそのサブドメイン | 分類タグに依存せず、個別サイトを手動で追加する場合に使う |
full:example.com | 完全一致するドメイン | www.example.comには一致しない |
サイトによっては複数地域のCDNを利用しています。同じドメインでも、ネットワークによって異なるIPアドレスに解決されます。そのため、「ドメインがcnに一致する」ことと「解決されたIPがcnに一致する」ことは別の判定です。ブラウザーが先に名前解決し、IPアドレスをプロキシに渡す場合、ドメインルールで直接照合できないこともあります。スニッフィングで一部のプロトコルのドメイン情報を補える場合はありますが、すべてのリクエストでドメイン名を取得できるとは限りません。
2. routing設定例とデフォルトの出口
以下はroutingオブジェクトの設定例で、ノードに接続できる完全な設定ファイルではありません。既存のV2RayまたはXray設定に組み込む前に、アウトバウンドのタグを確認してください。この記事では、directはfreedomプロトコルを使う直接接続のアウトバウンド、proxyは接続テスト済みのプロキシアウトバウンドを指します。タグは単なる名前であり、自動的に出口が作成されるわけではありません。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:localhost",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
この設定例では、既存設定のoutboundsの先頭にプロキシアウトバウンドがあることを前提としています。この記事のような一般的なルーティング設定では、どのルールにも一致しない通信は先頭のアウトバウンドを使います。proxyというタグ名で自動的に決まるわけではありません。先頭が実際には直接接続なら、ルールに一致しない海外サイトも直接接続されます。順序を合わせるためだけに、サーバー情報がないプロキシアウトバウンドを複製しないでください。
- 宛先がcn分類のドメイン:最初のドメインルールに一致し、
directを選択します。 - 宛先が
192.168.1.1のようなプライベートアドレス:IPルールに一致し、directを選択します。 - 宛先ドメインがどのルールにも一致しない場合、ほかに一致するルールがなければ、IPIfNonMatchが名前解決を試みてIPルールとの再照合を行います。
- 解決されたIPアドレスも直接接続の範囲に一致しない場合は、事前に確認したプロキシアウトバウンド、つまり先頭のアウトバウンドが使われます。
ここでいう「海外サイトはプロキシ経由」とは、上記の直接接続ルールに一致しない通信がデフォルトでプロキシ経由になる、という意味です。国や地域をリアルタイムかつ完全に判定する機能ではありません。特定のドメインに使う出口を厳密に指定する場合は、IPアドレスの地域判定に頼らず、ドメインルールを明示的に追加してください。
ポイント:分類を調整する前にフォールバックを確認
ルールを保存する前に、生成された設定のoutbounds[0]で、実際のプロトコルとタグを確認してください。デフォルトの出口を確かめたら、ドメインの例外ルールを1つ使ってルール順をテストします。出口が間違っていれば、分類リストを細かく調整しても、どのルールにも一致しない通信が誤った出口に送られる可能性があります。
3. domainStrategyの選び方とフォールバックの注意点
routing.domainStrategyは、IPルールとの照合のためにルーティング段階でドメインを名前解決するかどうかを指定します。DNSサーバーの選択や、アウトバウンド接続時のアドレス選択とは別の設定です。同じ名前の設定項目が異なる階層にある場合は、まずどのオブジェクト内の設定か確認してください。
IPIfNonMatch
推奨まず既に取得している宛先情報でルールを照合し、一致しなければドメインを名前解決して再照合します。この記事の設定例ではこの方法を採用し、末尾に全件一致ルールを追加せず、先頭のアウトバウンドをフォールバックとして使います。
おすすめの構成:中国本土のIPアドレスによる直接接続も必要で、ドメイン分類を優先したい場合。
AsIs
ルーティング段階ではドメインのIPアドレスを追加で名前解決しません。宛先IPが既に分かっていればIPルールに一致しますが、ドメイン名だけで届いたリクエストはgeoip分類の対象になりません。接続段階では、別途名前解決が必要になる場合があります。
おすすめの構成:ドメインルールを中心に使い、ルーティング段階での追加DNS問い合わせを抑えたい場合。
IPOnDemand
照合中にIPルールの判定が必要になると、ドメインの名前解決が行われる場合があります。IPルールを上位に置くほど、早い段階で問い合わせが発生しやすくなります。すべてのリクエストで必ず最初に名前解決されるわけではありません。
おすすめの構成:ルール処理の早い段階でIP判定を行う必要があり、それに伴う問い合わせの増加を許容できる場合。
よくある誤りは、IPIfNonMatchを設定したうえで、末尾にnetwork: "tcp,udp"のプロキシルールを追加することです。このルールは最初の照合でリクエストに一致するため、「どのルールにも一致しなかった」という条件が成立しなくなる場合があります。その結果、ドメインがgeosite:cnに含まれないと、geoip:cnに一致するか名前解決を試す前に、プロキシ経由になる可能性があります。
ルーティング時の名前解決には、プライバシーや接続性への影響もあります。どのドメインをどのDNSサーバーに問い合わせるかは、dns設定全体、DNS問い合わせの通信経路、ブラウザー独自の名前解決方法をあわせて確認してください。domainStrategyの値を変更するだけでは、DNS問い合わせが必ずプロキシ経由になるとは限らず、DNS汚染も解決できません。
4. ルールの順序:例外を先に、分類ルールを後に
1回のルール照合では上から順に評価され、最初に一致したルールで出口が決まります。1つのルールオブジェクトにdomainとipなど複数の条件が含まれる場合、それらすべてを満たす必要があります。同じdomain配列内の複数項目は、いずれか1つに一致すれば対象です。「ドメインまたはIPのどちらかが一致したら直接接続」する場合は、この記事のようにルールを2つに分けてください。
たとえばcn分類に含まれるサイトでも、動作確認のためにプロキシ経由に固定したい場合は、次のオブジェクトをrules配列の先頭に挿入できます。example.comは記法を説明するための予約ドメインです。実際に使うときは、対象のドメインに置き換えてください。
{
"type": "field",
"domain": [
"domain:example.com"
],
"outboundTag": "proxy"
}
- 手動の例外ルールを先頭に:出口を変更する必要があるドメインだけを対象にすれば、元に戻しやすくなります。
- 次にドメイン分類:既知のサイトを、明示したドメインルールで処理します。
- IP分類で補完:IPアドレスを直接指定したリクエストと、設定上、名前解決後に判定されるリクエストに適用します。
- 最後にフォールバックを確認:この記事では先頭のアウトバウンドを使い、全件一致ルールは追加しません。
「プライベートIPは必ず最優先で照合する」という考え方が、すべての状況に当てはまるわけではありません。ドメインの例外ルールを解決先IPより優先したい場合は、その順序を維持してください。プライベートアドレスを必ず直接接続する場合は、ドメイン例外、DNSの応答、名前解決のポリシーとの関係も考慮する必要があります。特に企業内ネットワークでは、まずアドレス設計を確認してください。一般向けの設定例を既存のポリシーにそのまま適用するのは避けましょう。
5. クライアントに設定し、実際の動作を確認
v2rayNはデスクトップ向けクライアントです。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。クライアントの画面から設定を生成または読み込み、ルール自体は選択したコアが実行します。完全なカスタム設定と通常のノードモードでは、設定画面や適用範囲が異なります。両方の設定を変更して、どちらが反映されたか推測するのは避けてください。
-
現在の設定をバックアップ
現在有効なノード、ルーティング設定、ローカルの待ち受けポートを記録し、既存のカスタム設定を保存します。ルーティングを変更する前にノードへ接続できることを確認してから、振り分け設定を調整してください。
-
ルーティング設定を開く
v2rayNでは通常「設定」→「ルーティング設定」、v2rayNGではサイドメニュー→「ルーティング設定」から開きます。項目名はバージョンによって異なるため、現在の画面を確認してください。まず既存のルールを確認し、設定一式をすぐに削除しないようにしましょう。
-
設定方法を選ぶ
画面上のルールエディターを使う場合は、ドメイン、IP、接続先を個別に入力し、順序を確認してください。完全なカスタム設定を使う場合に限り、この記事のroutingオブジェクトを組み込みます。ドメインリスト専用の入力欄に、JSONオブジェクト全体を貼り付けないでください。
-
実際のタグを確認
生成または読み込んだ設定を確認し、directとproxyが存在することと、先頭のアウトバウンドを確かめます。画面上の「直接接続」「プロキシ」という選択肢が別のタグに対応する場合もあります。実際の設定ファイルに記載されたタグ名を確認してください。
-
再起動してログを確認
設定を保存し、該当するルーティング設定を有効にしたら、接続を停止してから再起動します。ルールの解析エラー、リソースファイルのエラー、アウトバウンドタグのエラーがログに出ていないか確認してください。編集画面で保存しただけでは、実行中のコアに設定が再読み込みされない場合があります。
コアごとの動作を比較する場合は、クライアントのバージョンだけでなく、使用したコアの種類とバージョンも記録してください。v2rayNGとv2flyNGは、同じコアの別画面として扱えません。カスタム設定の拡張フィールドやリソースの読み込み方法も、それぞれ確認が必要です。基本項目の詳細は、こちらのJSONマニュアルをご覧ください。
6. リクエストとログで振り分け結果を確認
テストでは、まずリクエストがコアに届いていることを確認し、次に想定した出口が選ばれたことを確かめます。ブラウザー拡張機能、システムプロキシの除外リスト、ターミナルの環境変数によって、通信の入口が変わることがあります。以下は、ローカルで127.0.0.1:10808のSOCKS待ち受けが有効になっている前提です。10808はテスト用のポートで、すべての環境の初期値ではありません。実行前に現在の待ち受けポートに置き換えてください。
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
socks5hを使うと、curlがドメイン名をプロキシ側に渡すため、ドメインルールの動作確認に便利です。ただし、DNS問い合わせが必ずリモートプロキシ経由になるという意味ではありません。1つ目のリクエストではcnドメイン分類、2つ目では直接接続の対象外となる通信のフォールバック動作を確認します。HTTPレスポンスが成功しても、接続が完了したことしか分かりません。実際の出口は、アクセスログに記録された宛先アドレスとアウトバウンドタグで確認してください。
| テスト項目 | 想定される結果 | 問題がある場合にまず確認する点 |
|---|---|---|
| データ上でcnに分類されているドメイン | ログで直接接続のアウトバウンドが選択される | geositeデータ、ドメイン名が渡されているか、前段のルール |
| 実際に存在するLAN内のアドレス | ログで直接接続のアウトバウンドが選択される | privateデータ、IPルール、LAN内の接続性 |
| 直接接続の対象外となるドメイン | ログでプロキシのアウトバウンドが選択される | 先頭のアウトバウンド、追加ルール、名前解決の結果 |
| プロキシ経由を手動指定した例外ドメイン | 例外ルールが優先して一致する | 例外ルールの位置、domainとfullの違い |
LAN内のアドレスをテストするときは、ルーターの管理アドレスが192.168.1.1のように、自分のネットワークで実際に使われている機器を指定してください。このアドレスはあくまで例です。機器でWebサービスが動いていない場合、接続に失敗してもルーティングルールが間違っているとは限りません。ログでどのアウトバウンドが選ばれたかを確認し、宛先サービスが応答するかどうかは別途調べてください。
geoip:cnを設定しているのに、一部の中国本土のサイトがプロキシ経由になるのはなぜですか?
まずリクエストの宛先がドメイン名かIPアドレスかを確認し、domainStrategyの設定を調べます。AsIsの場合、IPルールの照合用にドメインが追加で名前解決されることはありません。IPIfNonMatchの場合は、末尾にリクエストを先に処理する全件一致ルールがないか確認してください。最後に、実際に解決されたIPアドレスが、使用中のcnデータに含まれているか確認します。
中国本土のドメインなのに、海外のIPアドレスへ接続されるのはなぜですか?
ドメイン分類では、サーバーの所在地は保証されません。geosite:cnに一致して直接接続された場合、その後のgeoipルールで出口が変更されることはありません。IPアドレスを基準に判断する必要がある場合は、ポリシーとルール順を明示的に見直し、CDNの名前解決結果を再テストしてください。
ルールを保存したのに、ログに以前の出口が表示されるのはなぜですか?
編集したルーティング設定が有効になっているか確認し、コアを停止してから再起動してください。完全なカスタム設定では、通常のノードモードで編集したルーティング設定が使われないことがあります。編集画面だけでなく、今回実際に読み込まれた設定を確認してください。
すべてのリクエストが直接接続される場合、まずどこを確認すればよいですか?
まずoutboundsの先頭が直接接続になっていないか、手前に全件一致ルールがないか確認してください。次に、SOCKSポートを明示した上記のcurlコマンドを使い、通信がコアに届いているか確かめます。該当するアクセスログがなければ、ルールを増やす前に通信の入口を確認してください。