この記事は、V2RayまたはXrayのJSON設定を編集でき、ドメイン解決の異常を解決したいユーザー向けです。内蔵DNSが有効になる条件から説明し、servers、domains、expectIPsとルーティング戦略の関係を整理したうえで、確認と切り戻しがしやすい中国国内外の分離解決設定を紹介します。
まずDNSクエリが通る経路を確認する
アプリがドメインへアクセスするとき、通常はプロキシ接続より先にドメインをIPアドレスへ変換します。アプリがシステムDNSを直接呼び出す場合、クエリはV2Rayに入る前に完了している可能性があります。そのため、設定ファイルのdnsセクションだけを変更しても、アプリが受け取る結果が変わるとは限りません。内蔵DNS、DNSインバウンド、透過プロキシによる捕捉経路、またはクライアントの対応機能がクエリを引き受けた場合に限り、内蔵ルールが処理に参加します。
もう一つ混同しやすいのが、「DNSサーバーの選択」と「通信トラフィックの振り分け」は別の手順だという点です。dns.serversはドメインをどのDNSサーバーへ渡すかを決め、routing.rulesはDNSクエリと後続接続がどのアウトバウンドを通るかを決めます。ドメインを海外DoHへ振り分けても、そのDoHリクエストが不適切な直結経路から送信されれば、タイムアウトや接続リセットが発生することがあります。
経路全体は順番に確認する必要があります。アプリがクエリをクライアントへ渡しているか、ドメインが想定したサーバーに一致しているか、DNSサーバーへのリクエストがどのアウトバウンドを通るか、返されたアドレスが検証を通過しているか、最終的な通信接続がどのルートに一致したかを確認します。ウェブページを開けるかどうかだけでは、どの層で問題が起きているか判断できません。
servers、domains、expectIPsの役割
serversはDNSサーバーのリストです。各項目には通常のアドレスだけでなく、マッチ条件付きのオブジェクトも指定できます。オブジェクト形式では、サーバーごとにdomains、expectIPs、ポート、フォールバック制御を設定できます。条件のないサーバーは通常、デフォルトまたはフォールバックの解決を担うため、すべてのサーバーに同じマッチ範囲を指定するのは避けてください。
domainsは、どのクエリを現在のサーバーへ優先的に渡すかを決めます。よく使うルールにはgeosite:cn、geosite:geolocation-!cn、domain:example.com、full:host.example.comがあります。domain:は現在のドメインとサブドメインに一致し、full:は完全なホスト名だけに一致します。地域分類はクライアントが使用するデータファイルに依存するため、データが古いと新しいドメインが未分類になることがあります。
expectIPsはDNSサーバーを選ぶためのものではなく、返されたIPが想定範囲に合うかを検証します。たとえば中国国内ドメインのサーバーにgeoip:cnを設定し、返されたアドレスがその集合に含まれなければ、コアは後続の解決経路を試行できます。この項目は明らかに不自然な応答の検出に役立ちますが、ドメイン分類の代わりにはならず、地域をまたぐサービスが常に固定地域のアドレスを返すことを保証するものでもありません。
中国国内ドメインの解決
- サーバー
- 223.5.5.5
- ポート
- 53
- マッチ条件
- geosite:cn
- 想定アドレス
- geoip:cn
近距離にある中国国内サービスのアドレスを優先的に取得するのに適しています。
海外ドメインの解決
- サーバー
- 1.1.1.1 DoH
- トランスポート
- HTTPS
- マッチ条件
- geolocation-!cn
- 想定アドレス
- geoip:!cn
DoHリクエストは、そのサービスへ安定してアクセスできるアウトバウンドを通すことを推奨します。
queryStrategyは問い合わせるアドレスファミリーを制御します。UseIPv4はIPv4だけをリクエストするため、ローカルのIPv6対応が不完全な環境や、プロキシノードにIPv6のアウトバウンド能力がない環境に適しています。UseIPv6はIPv6だけをリクエストし、UseIPは両方の結果を利用できます。アドレスファミリーの選択は、ノード、システムネットワーク、ルーティングルールと一致させてください。合っていないと、DNSでは結果が得られるのに接続がタイムアウトし続けることがあります。
調整可能な中国国内外の分離解決設定
以下の例はコア設定の構造を示すもので、ノードの認証情報と完全なアウトバウンドは含みません。中国国内の分類はUDP 53のDNSサーバー、海外の分類はHTTPSベースのDNSサーバーへ渡し、最後のフォールバックとしてローカルDNSを使います。例ではIP形式のDoHアドレスを採用し、DoHホスト名の解決時にDNSクエリが再び必要になる依存ループを減らしています。
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
],
"skipFallback": true
},
{
"address": "https://1.1.1.1/dns-query",
"domains": [
"geosite:geolocation-!cn"
],
"expectIPs": [
"geoip:!cn"
],
"skipFallback": true
},
"localhost"
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"223.5.5.5"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"1.1.1.1"
],
"outboundTag": "proxy"
}
]
}
}
この例では、既存の設定にdirectとproxyという名前のアウトバウンドタグがあるものとします。実際のタグがfreedom、mainなど別の名前なら、現在の設定に合わせて変更し、そのままコピーしないでください。ルーティングルールの順序も重要です。より具体的なDNSサーバーアドレスのルールは、広範な中国国内IPの直結ルールより前に置かなければ、先にあるルールに一致してしまいます。
skipFallbackは、現在のサーバーを通常のフォールバック処理から除外します。ただし、DNSフォールバックの詳細や拡張フィールドの対応状況はコアのバージョンによって異なる場合があります。V2Ray 5.x、Xray 25.x、またはクライアントに付属する別のコアを使う場合は、実際のコア起動ログを基準にしてください。ログに未知のフィールドが表示されたら、まずそのフィールドを削除して基本動作を確認し、その後、使用中のコアのドキュメントに従ってフォールバック制御を追加します。
| 設定項目 | 例 | 主な役割 | よくある誤り |
|---|---|---|---|
domains |
geosite:cn |
DNSサーバーを選択する | 通信ルーティングのルールと誤解する |
expectIPs |
geoip:cn |
返されるアドレス範囲を検証する | 範囲を厳しくしすぎて頻繁にフォールバックする |
queryStrategy |
UseIPv4 |
問い合わせるアドレスファミリーを制御する | 実際のネットワーク能力と一致しない |
domainStrategy |
IPIfNonMatch |
ルーティング段階のドメイン解決を制御する | DNSサーバーの選択と混同する |
結論:まずDNSクエリのアウトバウンドを固定する
中国国内外のサーバーを正しく設定しても結果が安定しない場合は、まず223.5.5.5がdirect、1.1.1.1がproxyに一致しているか確認してください。DNSサーバー自体が誤ったアウトバウンドを通ると、ドメイン分類の漏れよりも一括してリクエストが失敗しやすくなります。
ログで分岐が実際に有効か確認する
検証時にDNS、ルーティング、ノード、システムプロキシを一度に変更しないでください。まず現在動作している設定をバックアップし、DNSセクションだけを置き換えてコアを再起動します。構文エラーがないことを確認してから、DNSサーバーのアウトバウンドルールを追加してください。段階的に変更すれば、「設定を起動できない」問題と「解決結果が想定と違う」問題を分けて対処できます。
v2rayNでは「設定」→「パラメータ設定」からログレベルを確認し、メイン画面でログウィンドウを開けます。診断時は一時的に情報レベルのログを使い、テスト後に元の設定へ戻してください。Androidのv2rayNGまたはv2flyNGでは、いったん接続を切り、設定を保存してから再接続します。画面だけを変更し、古いコアプロセスがキャッシュ済みの設定を使い続ける事態を避けるためです。
- 中国国内の分類に属するドメイン、海外分類のドメイン、カスタムの完全一致ドメインルールを1つずつ用意し、1つのウェブサイトだけで判断しないようにします。
- OSとブラウザで削除できる範囲のDNSキャッシュを消去し、現在のクライアントコアを再起動してテスト開始時刻を記録します。
- 各分類のドメインへ3回連続でアクセスし、ログで問い合わせ先、マッチしたサーバー、最終的なアウトバウンドタグを確認します。
- プロキシを有効にした状態と無効にした状態をそれぞれテストし、DoHリクエストがプロキシを通る必要がある場合だけ失敗するか確認します。
expectIPsを一時的に削除してもう一度テストします。問題が解消するなら、返されたアドレスと想定集合が衝突しています。むやみにノードを変えるのではなく、分類を調整してください。
遅延も層ごとに記録してください。1回のアクセスにはDNS処理時間、TCPまたはUDPの接続確立時間、TLSハンドシェイク、サーバー応答時間が含まれます。ログでDNSが40ミリ秒以内に完了しているのにページ表示が3秒を超えるなら、問題はDNS解決ではなく通信またはルーティングにある可能性が高いです。逆に、DNSリクエストが5秒前後で連続してタイムアウトするなら、サーバーへの到達性とアウトバウンドの選択を重点的に確認します。
結論:2種類のドメインと1つのカスタムルールでクロスチェックする
人気サイトだけをテストすると、キャッシュや地域別のトラフィック制御の影響を受けやすくなります。full:の完全一致ルールを追加すれば、domainsのマッチングが機能しているかを直接確認し、そのうえでgeositeデータの更新が必要か判断できます。
よくある障害と対処方法
DNS分岐で最も多い問題はJSONの形式ではなく、ルール同士が上書きし合うことです。サーバーオブジェクト内のdomainsはDNSサーバーの選択を担い、ルーティング内のdomainとipは接続の振り分けを担います。どちらもgeositeやgeoipを参照できますが、実行される段階は異なります。トラブルシューティングでは、現在見ているのがDNSクエリのログなのか、通信接続のログなのかを明確にしてください。
設定保存後、コアがすぐに起動失敗する?
まずログに表示されたフィールド名と行番号を確認し、カンマ、括弧、配列の形式を点検します。未知のフィールドが示されたら、skipFallbackなどの拡張項目を削除し、最小限のservers設定で起動してください。その後、現在のコアが対応する範囲に合わせて項目を一つずつ戻します。
海外ドメインがまだローカルDNSへ渡される?
デフォルトサーバーが先頭にあり、先にクエリへ参加していないか確認します。続いてgeosite:geolocation-!cnのデータが利用可能か確認してください。一時的にfull:対象ドメインの完全一致ルールを追加し、指定したDoHへ切り替わるか観察します。
アドレスは解決できるのに、ウェブページが開かない?
後続接続で一致したoutboundTagを確認してください。DNSが成功したことはアドレスを取得できたという意味にすぎず、通信トラフィックがproxyを通ったことを示すものではありません。システムプロキシ、ローカル待ち受けポート10808、ルーティングルールの順序も確認します。
expectIPsを有効にすると一部のサイトが遅くなる?
コンテンツ配信ネットワークは地域をまたぐアドレスを返すことがあります。厳格なgeoip:cnまたはgeoip:!cnによって、追加の試行が発生する場合があります。そのドメインにより正確なdomain:ルールを追加するか、アドレス検証を分類が安定している場合だけ使用してください。
パソコンは正常なのに、Androidクライアントの結果が異なる?
両方で使っているコアの種類、geositeデータ、問い合わせ戦略が一致しているか確認してください。v2rayNGは通常Xrayコア、v2flyNGはv2flyコアを使用します。同じJSONでも、拡張フィールドやフォールバックの詳細に違いがある場合があります。
キャッシュによって、変更が反映されていないように見えることがあります。OS、ブラウザ、クライアントコア、上流のDNSサーバーはいずれもレコードをキャッシュする可能性があります。テストでは、以前アクセスしていないサブドメインへ切り替えるか、管理できる環境でレコードの有効期限が切れるまで待つのが効果的です。クライアントを何度も再起動しても、一部のキャッシュしか消去できず、すべての上流サーバーに即時の更新を強制することはできません。
もう一つのリスクは、複数のDNS捕捉機構を同時に有効にすることです。たとえばブラウザが独自にセキュアDNSを使い、システムの通信をクライアントが捕捉している場合、2つのクエリ経路で異なる結果になる可能性があります。診断中は入口を一時的に統一し、クエリが現在のコアを明確に通るようにしてください。検証後、実際の要件に応じてアプリ独自の解決機能を残すか決めます。
- 中国国内ドメインがまれに海外アドレスを返す:まずコンテンツ配信ネットワークの振り分けを確認し、すぐに異常と判断しないでください。
- DoHが長時間応答しない:443ポートへの接続がプロキシアウトバウンドに一致しているか確認し、ノードから対象DNSサービスへアクセスできるか点検してください。
- IPv6アドレスだけ接続に失敗する:問い合わせ戦略を一時的に
UseIPv4へ変更し、ノードとローカルネットワークのIPv6対応を確認します。 - サブスクリプション更新は正常なのにウェブの解決で異常が起きる:サブスクリプションのリクエストと通信で使うDNSは同じ経路ではないため、ログを分けて確認してください。
v2rayN、v2rayNG、v2flyNGへ設定を反映する
v2rayNのデスクトップ版は、ログウィンドウとカスタム設定の編集画面を並べて確認しやすいため、完全な設定チェックに適しています。編集前に既存設定をエクスポートし、「設定」→「パラメータ設定」でコアの種類を確認してから、DNSオブジェクトをトップレベルのJSONへ統合してください。同じファイルに同名のdnsオブジェクトを2つ残さないでください。後に現れる内容が前の設定を上書きする可能性があります。
Androidクライアントでは、デスクトップ版で検証を終えてから設定方針を反映するのが適しています。全設定を直接コピーするのは避けてください。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用するため、フィールドの対応状況、デフォルトの問い合わせ戦略、クライアントが設定を生成する方法に違いがある場合があります。クライアントがサブスクリプションから実行設定を自動生成する場合、手動で加えた一時的な変更がサブスクリプション更新後に再生成されることもあります。
| クライアント | 確認する項目 | 適した操作方法 |
|---|---|---|
| v2rayN | コアの種類、ログ、ルーティングタグ、10808ローカルポート | まずカスタム設定で段階的に検証する |
| v2rayNG | Xrayフィールドの互換性、VPNモード、アプリ別プロキシ範囲 | 再接続後に実際の実行ログを確認する |
| v2flyNG | v2flyのフィールド対応、geositeデータ、問い合わせ戦略 | v2flyコアの対応範囲に合わせて設定を簡素化する |
安定した構成には、明確なフォールバック経路を1つ残してください。ただし、フォールバックによって主要サーバーの長期的な障害を隠してはいけません。まず中国国内のUDP 53と海外DoHがそれぞれ正しく一致することを確認し、その後、最後の保険としてローカルDNSを追加します。デフォルトサーバーが大半のクエリを処理しているなら、domainsの分類またはデータファイルに問題が残っています。「最終的に開ける」ことだけで、分岐が正しいと判断しないでください。