2026-06-18 · 上級設定 · 約11分

v2rayNのDNS設定:中国国内外のドメインを分けて名前解決する汚染対策

v2rayNのDNS設定項目とコアのdns構成を分解し、中国国内ドメインにはローカルDoH、国外ドメインにはリモートDNSを使う方法を解説します。hosts、fakeDNS、キャッシュの関係も整理します。

この記事の概要

ノードには正常に接続できるものの、名前解決エラー、ウェブページが断続的に開けない、DNSテストの結果が不自然といった問題に悩むv2rayNユーザー向けの記事です。システムDNSとコアDNSを区別し、振り分け設定、確認手順、原因の切り分け方法を説明します。設定後は、各クエリの受信先、経由するアウトバウンド、現在のアドレスが返る理由を確認できます。

まずシステムDNS、コアDNS、リモートDNSを区別する

v2rayNで「設定」→「パラメーター設定」を開き、現在有効なコアの種類、システムプロキシモード、TUNの状態を確認します。DNS振り分けは、どのサーバーを入力したかだけでなく、ドメインリクエストがXrayコアに入っているかどうかにも左右されます。通常のシステムプロキシはアプリのHTTPまたはSOCKS通信を主に処理するため、一部のアプリはOSのDNSを直接利用します。TUNモードではより多くの通信をカバーできますが、DNSハイジャックとルール設定も同時に確認が必要です。

システムDNSは、ネットワークアダプターまたはOSが現在使用しているリゾルバーです。コアDNSは生成された設定の最上位にある dns オブジェクトで、ドメインルールに応じてDNSサーバーを選択します。リモートDNSとは、プロキシのアウトバウンド経由で指定したリゾルバーへ問い合わせることであり、単にサーバーアドレスを国外のものへ変更することではありません。問い合わせパケットが直結経路から送信されているなら、リモートサーバーを指定しただけではリモートDNSにはなりません。

アプリがドメインを問い合わせシステムまたはTUNが処理コアがルールを照合リゾルバーを選択アウトバウンド経由で送信
レイヤー 主な役割 確認場所 よくある問題
アプリケーション層 システムDNS、内蔵セキュアDNS、プロキシDNSのどれを使うか決める ブラウザーとアプリのネットワーク設定 システムやコアのルールを回避する
システム層 通常のUDP/TCP 53番ポートの問い合わせを指定サーバーへ渡す ネットワークアダプターとシステムのネットワーク状態 古いDNSが残っている、または複数のアダプターが併存している
コア層 ドメイン、地域タグ、問い合わせ種別に応じてリゾルバーを選ぶ v2rayNの現在の実行設定 ルールの順序が不適切、またはタグに一致していない
アウトバウンド層 問い合わせを直結するか、プロキシノード経由にするか決める ルーティングルールとコアログ リモートリゾルバーが誤って直結に設定されている
53
従来型DNSのポート
443
DoHでよく使われるポート
2種類
AとAAAAの一般的な問い合わせ
198.18/15
一般的なfakeDNSアドレスプール

結論:まず問い合わせがコアに入っているか確認する

設定前に現在の実行設定とコアログを確認します。テストドメインのDNS記録がまったくない場合は、DNSサーバーを次々に変更するのではなく、アプリ内蔵DNS、システムプロキシの適用範囲、TUNの処理範囲を優先して確認します。

中国国内向けローカルDoHと国外向けリモートDNSを設定する

まず中国国内ドメイン用に低遅延のローカルDoHを用意し、それ以外のドメイン用にプロキシ経由で接続するリモートDoHを用意します。振り分けには、解決後のIPアドレスではなくドメインセットを使います。問い合わせ前にリゾルバーを決められるため、国外ドメインを先にローカルDNSへ漏らし、不正確な結果を取得する事態を避けられます。

  1. 「設定」→「パラメーター設定」を開き、Xrayコアが有効であることを確認し、ローカルSOCKSの待受ポートを控えます。一般的なデフォルト値は 10808 ですが、実際の値は現在のパラメーター画面に従ってください。
  2. v2rayNのDNS設定画面を開き、現在のコアに対応する設定欄を選びます。バージョンによって画面名は多少異なるため、変更後は編集欄だけでなく、生成された実行設定を確認してください。
  3. 中国国内向けDoHサーバーを geosite:cn のようなドメインルールに関連付け、期待する返却アドレスを geoip:cn で制限します。
  4. リモートDoHを後続の一致位置に置き、国外ドメインおよび未一致ドメインのリゾルバーにします。同時に、そのDoHドメインまたは接続先への通信がプロキシのアウトバウンドを経由することを確認します。
  5. 設定を保存してコアを再起動します。まず明確に中国国内向けのドメインをテストし、次に国外ドメインをテストしてください。単一のサイトだけで判断しないことが重要です。

以下はXrayの dns オブジェクトの基本構造を示す例です。完全な設定をv2rayNの自動生成設定にそのまま上書きするものではありません。実際にはクライアントのカスタムDNS欄へ統合し、既存のログ、インバウンド、アウトバウンド、ルーティング設定を残してください。

{
  "dns": {
    "queryStrategy": "UseIP",
    "disableCache": false,
    "hosts": {
      "dns.local.example": "223.5.5.5"
    },
    "servers": [
      {
        "address": "https://dns.alidns.com/dns-query",
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      {
        "address": "https://1.1.1.1/dns-query",
        "domains": [
          "geosite:geolocation-!cn"
        ]
      },
      "https://1.1.1.1/dns-query"
    ]
  }
}

queryStrategyUseIP の場合、コアは利用可能なネットワークに応じてAとAAAAの結果を問い合わせます。ローカルネットワークでIPv6が安定していないのにIPv6問い合わせを強制すると、名前解決は成功しても接続がタイムアウトすることがあります。IPv4のみを使う環境では、現在のコアが対応する方式を選べますが、問い合わせ方式とルーティングのアウトバウンドを同じ項目として扱わないでください。

結論:中国国内ルールはローカルリゾルバーに限定し、リモートリゾルバーをデフォルトのフォールバックにする

範囲の狭い geosite:cn ルールを先に置き、その後にリモートのデフォルトリゾルバーを設定します。保存後はログで両方のドメインがどのサーバーに一致したか確認し、解決結果だけからルールを推測しないようにします。

リモートDNSの問い合わせを確実にプロキシ経由にする

リモートDoHも本質的にはHTTPS接続です。接続先アドレスがルーティングルールによって直結アウトバウンドへ送られると、問い合わせはローカルネットワークから発信されます。ルーティング設定でリモートリゾルバーのドメインをプロキシ経由に明示し、ローカルDoHまでプロキシへ送らないようにして、中国国内向け問い合わせの低遅延を保ちます。

切り分け時はv2rayNのログ画面を開き、コアのログレベルをDNSとルール一致を確認できる程度まで一時的に上げます。その後、システムキャッシュを消去してテストドメインへ順番にアクセスします。問い合わせ種別、DNSサーバー、ルーティングのアウトバウンドタグ、返却アドレス、タイムアウト原因を確認してください。テスト後はログレベルを下げ、日常の出力を減らせます。

テスト項目 期待する経路 観測値の例 異常の意味
中国国内ドメインの初回解決 ローカルDoH → 直結 約18~45 ms 500 msを超える場合は、誤ったプロキシ設定や連続したフォールバックがよくある原因です
国外ドメインの初回解決 リモートDoH → プロキシ 約90~260 ms すぐに不自然なアドレスが返る場合は、ローカルDNSを経由していないか確認します
同じドメインを再度解決 コアキャッシュ 通常5 ms未満 毎回問い合わせが発生する場合は、キャッシュが無効になっているかTTLが切れている可能性があります
ノードのドメイン解決 基本解決 → 接続確立 コアの起動段階で完了 起動直後にタイムアウトする場合は、名前解決の依存関係が循環している可能性があります

hosts、fakeDNS、キャッシュの優先順位を整理する

hosts は通常のDNS問い合わせ前に指定ドメインを上書きします。固定された内部サービスのアドレス、障害中の名前解決の一時回避、あるドメインから別のドメインへのマッピングに適しています。頻繁に変わる大規模サイトのアドレス管理には向きません。固定IPによって最寄りの配信先選択を迂回したり、サーバーアドレス変更後に接続できなくなったりするためです。

fakeDNSは主にTUN環境で使われます。まずアプリに合成アドレスを返し、一般的なアドレスプールは 198.18.0.0/15 にあります。コアはその後、合成アドレスから元のドメインを特定してルーティングします。これによりドメイン情報を保持でき、アプリがシステム層で実アドレスを解決し、コアにはIPだけが渡る状況を減らせます。有効化の判断は、現在のTUN設定とコアの対応状況に従ってください。

キャッシュはTTLが切れるまで解決結果を保存し、重複問い合わせやページ初回表示時の待ち時間を減らします。DNSルールを変更しても古い結果が表示される場合、新設定が無効なのではなく、システム、アプリ、コアのいずれかのキャッシュに古い記録が残っている可能性があります。まずコアを再起動し、次にOSのDNSキャッシュを消去し、テスト対象のアプリを完全終了してから再起動してください。

hostsによる上書き
通常のサーバー問い合わせ前に指定したアドレスまたは別名を返します。少数の明確で管理しやすいドメインマッピングに適しています。
fakeDNS
アプリに合成アドレスを返し、コア内に元のドメインとの対応関係を保持します。主にTUN通信でドメインを識別するために使います。
DNSキャッシュ
TTLに従って既存の結果を再利用します。遅延を下げられますが、設定変更後もしばらく古い結果が表示されることがあります。
{
  "dns": {
    "hosts": {
      "internal.example": "192.168.10.20",
      "alias.example": "target.example"
    },
    "disableCache": false,
    "disableFallback": false
  }
}

hostsを設定した後は、名前解決と実際の接続を分けて確認します。解決結果が正しいのにウェブページを開けない場合、接続先サービスが正しいTLSドメイン、リバースプロキシの入口、特定ポートを要求している可能性があります。hostsが変えるのはアドレスの選択だけで、証明書検証、HTTP Host、サーバーの待受設定は書き換えません。

結論:キャッシュは有効のままにし、切り分け時だけ一時的に消去する

キャッシュを長期間無効にすると、問い合わせ回数と初回表示の遅延が増えます。ルール変更後は「コアを再起動、システムキャッシュを消去、テストアプリを再起動」の順に処理するほうが、キャッシュを常時無効にするより安定した結果を得やすくなります。

症状から名前解決失敗とルール未一致を切り分ける

問題をまず「問い合わせが送信されない」「誤った出口を通る」「期待と異なる結果が返る」「名前解決は正しいが接続に失敗する」の4種類に分けます。ウェブページを開けるかどうかだけでDNSを判断しないでください。TLSハンドシェイク、ルーティングルール、ノードの状態、接続先サービスも同じような症状を引き起こします。

システムプロキシを有効にしたのに、なぜDNSテストではローカルDNSと表示される?

まずアプリが独自のセキュアDNSを使っていないか確認し、次にコアログにテストドメインが記録されているか確認します。ログに記録がまったくない場合は、「設定」→「パラメーター設定」でシステムプロキシモードを確認します。より多くのプログラムを対象にする必要がある場合は、現在のネットワーク環境に合わせてTUNとDNSの処理を設定してください。

国外ドメインは解決できるが、返されたアドレスが明らかに不自然な場合は?

現在の実行設定で、そのドメインがリモートDoHに一致していることを確認し、リモートDoHへの接続がプロキシのアウトバウンドを経由しているか確認します。その後、システムとアプリのキャッシュを消去し、まだ問い合わせていない別のドメインで再テストして、古い記録の影響を除外します。

TUNを有効にしたら、一部のLAN機器名を開けなくなった場合は?

LANドメインとプライベートアドレスのルールを直結範囲に入れ、LAN用リゾルバーを残します。固定機器には少数のhostsマッピングを追加し、geoip:private のルーティングがリモートプロキシルールに先回りして上書きされていないことも確認してください。

リモートDoHは常にタイムアウトするのに、ノードには接続できる場合は?

DoHドメインのルーティングルール、ポート 443、IPv4/IPv6の問い合わせ方式を確認します。ログに到達不能なIPv6アドレスが先に返っている場合は、ネットワーク環境に合わせて問い合わせ方式を調整し、プロキシのアウトバウンドからそのリゾルバーへ接続できることを確認してください。

設定を変更して再起動したのに、設定が実行設定へ反映されない場合は?

現在のコアに対応するDNS欄を編集しているか確認し、JSON構文も点検します。v2rayNは設定生成時にプリセットとカスタム内容を統合する場合があるため、起動後に表示される実行設定を基準にしてください。フィールドが欠落している場合は、まず設定階層を修正してからコアを再起動します。

コマンドラインのテストは補助的な証拠になりますが、nslookup はデフォルトでシステムDNSに問い合わせるため、必ずしもXrayコアを経由しません。OSが現在使っているリゾルバーの確認には適していますが、リモートDoH経路の証明だけに使うことはできません。コアのDNS振り分けを検証する際は、コマンド結果、v2rayNのコアログ、ネットワーク出口の状況を組み合わせて確認してください。

  1. 変更前のDNS設定、ルーティングモード、コアの種類、待受ポートを記録する。
  2. 一度に変更する変数は1つだけにする。たとえば、まずリゾルバーを調整し、その後にルーティングルールを調整する。
  3. コアを再起動し、JSON解析エラー、ポート競合、DNS初期化失敗がないことを確認する。
  4. 中国国内ドメインと国外ドメインを1つずつ使ってテストし、一致したサーバーとアウトバウンドタグを記録する。
  5. 最後に通常のログレベルへ戻し、動作する設定のコピーを保存する。
クライアントをダウンロード