V2RayのDNS設定ガイド|ドメイン別のDNS振り分けとDNS汚染対策

v2rayN・v2rayNGのDNS設定を解説。中国国内向けドメインはローカルDNS、海外向けはリモートDNSで名前解決し、ルーティングと合わせてDNS汚染や漏えいを防ぎます。

この記事の要点

まず、アプリがドメイン名をどこへ渡すかを確認し、ローカルDNSとリモートDNSを設定します。最後にDNSリクエストと通信それぞれの接続経路を確認しましょう。設定をインポート済みなのに一部のサイトが開けない、または名前解決の結果がおかしい場合に役立つ手順です。中国国内向けの直接接続ではローカルDNS、海外向けでは必要に応じてリモートDNSを使うための確認項目を整理し、DNS汚染・DNS漏えい・通常の接続障害を切り分けます。

1. 名前解決・ルーティング・プロキシの出力先を区別する

DNSはドメイン名をIPアドレスに変換します。ルーティングは通信を直接接続にするか、プロキシ経由にするかを決めます。両者は関連しますが、同じ設定ではありません。リモートDNSのアドレスを入力しても、そのDNSリクエストが必ずプロキシ経由になるとは限りません。また、あるサイトをプロキシ経由に設定しても、ブラウザーが事前にシステムDNSで名前解決していないとは限りません。

アプリがドメイン名を送信 ルールで宛先を判定 必要に応じて名前解決 接続先の出力経路を選択 宛先サービスへ接続

この流れは確認する順序を示したもので、すべての通信で名前解決を先にローカルで行うという意味ではありません。HTTPプロキシやSOCKSプロキシは、受け取ったドメイン名をリモート側で処理できます。一方、IPアドレスで判定するルールでは、ローカルのコアが名前解決する場合があります。アプリが先に名前解決し、そのIPアドレスをプロキシへ渡す場合、クライアント側で元のドメイン名を利用できる範囲が狭まることがあります。

2. ローカルDNS・リモートDNS・通信方式を選ぶ

「ローカルDNS」は通常、直接接続に使う名前解決サーバーを指し、必ずしもPC上で動作するサービスではありません。「リモートDNS」は通常、プロキシ接続に使う名前解決サーバーを指しますが、自動的にプロキシ経由になるわけではありません。用途を分けたうえで、通信プロトコル、サーバーアドレス、実際の接続経路をそれぞれ確認しましょう。

53
従来型DNSでよく使われるUDP/TCPポート
853
DNS over TLSの標準ポート
443
DNS over HTTPSでよく使われるポート

これらは各プロトコルで一般的なポートであり、クライアントの待ち受けポートとして一律に入力するものではありません。入力欄にDoHのアドレスを指定できるかどうかは、使用中のバージョンと項目の説明を確認してください。DoHがHTTPSを使うからといって、一般的なWebサイトのトップページをDNSエンドポイントとして使えるわけではありません。DoTも、すべてのDNS入力欄で利用できる形式ではありません。

名前解決の用途設定の目安確認すること
中国国内向けの直接接続ドメイン現在のネットワークから到達できるローカルDNSを使用します。例:契約中のプロバイダーのDNS、必要に応じて223.5.5.5問い合わせが直接接続されるか、返されたアドレスが現在のネットワークに適しているか
海外向けのプロキシ接続ドメインプロキシ経由でアクセスできるリモートDNSを使用します。DoH対応の入力欄には、必要に応じてhttps://dns.google/dns-queryを指定できます。エンドポイントがサポートされているか、到達可能か、リクエストが想定どおりプロキシ経由になるか
プロキシサーバーのドメイン名プロキシ接続を確立する前から使える名前解決経路を確保するまだ接続できていないプロキシに依存していないか、循環依存になっていないか
LAN内のデバイス名ルーターや社内DNSなど、LAN内DNSの名前解決機能を優先して使うLAN内の名前がパブリックDNSへ誤って送信されていないか

判断のポイント:DNSリクエストの経路を確認してからサーバーを変更する

リモートDNSへの接続が干渉を受ける直接接続経路を通っている場合、アドレスだけを変更しても解決しないことがあります。まずログや接続記録で経路を確認し、そのうえでサーバーや通信方式を調整してください。

3. v2rayNのDNS・ルーティング設定を確認する

現在の動作モードとコアを記録してから、「設定」→「DNS設定」を開きます。リリースによっては、関連項目が設定画面のDNSタブにまとめられています。実際の画面に表示される項目の説明に従ってください。意味の異なる入力欄に、ネット上のJSONを丸ごと貼り付けないでください。また、コアを切り替えてもDNS設定の意味がすべて同じままとは限りません。

  1. 現在の設定を記録する。ローカルDNS、リモートDNS、ルーティングモード、使用中のコアの設定を保存します。カスタムDNS設定を有効にしている場合は、テスト後に元へ戻せるよう、設定内容を事前にバックアップしてください。
  2. 直接接続用のDNSを設定する。ローカルDNSまたは直接接続用DNSの項目に、到達可能なサーバーを指定します。223.5.5.5を使う場合は、現在のネットワークからアクセスできることを確認してください。社内ネットワークの内部ドメインは、一律にパブリックDNSへ変更せず、社内DNSを優先して使用します。
  3. リモートDNSを設定する。現在のコアがサポートする形式で、リモートDNSの項目を設定します。DoHに対応している場合は、必要に応じてhttps://dns.google/dns-queryを使用できます。このアドレスは設定例であり、すべてのネットワークからアクセスできるとは限りません。
  4. ルーティングルールを確認する。「設定」→「ルーティング設定」を開き、中国国内向けドメイン、プロキシ接続するドメイン、デフォルトの出力先に関するルールを確認します。ドメイン別に振り分ける場合、IPルールだけを残してドメインルールを無視しないでください。
  5. 保存してコアを再起動する。新しい設定を読み込ませ、DNS設定の形式エラー、名前解決タイムアウト、サーバー接続失敗などがログに出ていないか確認します。画面上で保存に成功しても、実際の通信経路が正しいとは限りません。

実行設定でV2Ray/Xrayのrouting.domainStrategyを使用している場合は、代表的な3つの値の違いを確認してください。AsIsは、ルーティング時に元のドメイン名を使い、IPルールのための名前解決を行いません。IPIfNonMatchは、ドメインルールに一致しなかった場合に名前解決を試み、その後のルール判定を続けます。IPOnDemandは、IPが必要なルールを判定する際に、必要に応じて名前解決します。これらは「直接接続・プロキシ・グローバル」の言い換えではありません。

4. v2rayNGのVPN取り込みとDNSを確認する

v2rayNGのサイドメニューから「設定」を開き、「リモートDNS」「ローカルDNS」と、使用中のバージョンにあるローカルDNSの有効化項目を確認します。項目名はバージョンによって異なる場合があります。ローカルDNSを入力しただけで有効になったと判断せず、対応する機能のスイッチも確認してください。

  1. 接続モードを確認する。設定を起動し、システムのVPN接続状態を確認します。プロキシモードだけを使っている場合、そのプロキシを経由しないアプリは、このDNS設定の対象になりません。
  2. ローカルDNSを確認する。現在のネットワークで直接接続に使えるDNSを指定し、機能が有効になっているか確認します。LAN内の名前解決も考慮してください。社内ネットワークの名前や家庭内デバイス名は、通常パブリックDNSでは解決できません。
  3. リモートDNSを確認する。使用中のバージョンがサポートするアドレスを指定し、保存後に接続を停止してから再起動します。暗号化DNSを使う場合は、該当する通信方式が入力欄でサポートされていることを確認してください。アドレスの先頭に独自の文字列を付け加えないでください。
  4. ルーティングとアプリごとの設定を確認する。「設定」→「ルーティング設定」で、中国国内向け通信の処理方法を確認します。あわせてアプリごとのプロキシ設定も確認してください。除外されたアプリは、システムのネットワークとDNSを引き続き使う場合があります。
  5. システムとブラウザーを確認する。Androidの「プライベートDNS」と、ブラウザーの「セキュアDNS」が有効かどうかを記録します。トラブルシューティングでは、一度に変更する項目を1つに絞り、接続を再確立してログと名前解決の動作を比較してください。

AndroidのプライベートDNS、ブラウザー内蔵のDoH、コアのDNSによって、複数の名前解決経路が生じることがあります。あるスイッチが別のスイッチを必ず上書きすると決めつけず、VPNで取り込まれる範囲、対象アプリが除外されているか、実際の接続記録を確認しましょう。特にブラウザー独自のDoHは、通常のHTTPS通信としてルーティングされても、クライアント内蔵のDNSを使用しない場合があります。

5. DNSルールと接続ルールをセットで設定する

「中国国内向けドメインはローカルDNS、海外向けドメインはリモートDNS」という設定には、DNS層とルーティング層の両方が必要です。DNS層では名前解決サーバーを選び、ルーティング層では通信の出力先を選びます。DNSだけを変更しても通信が自動的にプロキシ経由になるわけではありません。通信ルールだけを変更しても、アプリがすでにシステムへ送信したDNS問い合わせを取り消すことはできません。

プロキシサーバー自体のドメイン名も個別に考慮する必要があります。ノードへの接続に事前の名前解決が必要なのに、その名前解決もまだ確立していないプロキシ経由に限定すると、起動時に循環依存が発生します。リモートDoHサーバーがドメイン名で指定されている場合も、初回接続にあたって名前解決が必要になることがあります。すべてのDNSを一律にプロキシ経由にするのではなく、現在のコアが初回接続をどう確立するか確認してください。

判断のポイント:接続可能な起動経路を確保してから振り分けを厳密にする

まずノードのドメイン名とDNSサーバーに、利用可能な初期接続経路を確保します。その後、通信先ドメインの名前解決ルールを段階的に調整してください。変更のたびに再接続してテストすれば、起動失敗をノードの障害と誤認しにくくなります。

6. ログ・キャッシュ・比較用クエリで確認する

検証では、問い合わせ先、問い合わせが通る経路、通信の出力先という3点を分けて確認します。IPアドレスを取得できても、DNSが想定外の経路を通っていないとは限りません。ブラウザーでWebページを開けても、すべてのアプリの通信が取り込まれているとは限りません。

  1. テスト対象を決める。中国国内の一般的なドメイン、プロキシ経由でアクセスするドメイン、実際に使用するLAN内の名前をそれぞれ選びます。毎回同じ対象を使い、テスト結果を比較できるようにしてください。
  2. 接続を確立し直す。DNS設定を保存したらクライアントの接続を再起動し、テスト対象のアプリも終了してから開き直します。ブラウザー、システム、コアにはそれぞれキャッシュがあるため、1か所だけ消去しても古い結果が再利用されることがあります。
  3. クライアントのログを確認する。まず設定の読み込みに失敗していないか確認し、次に名前解決エラーと出力先の記録を調べます。DNSの詳細がログに表示されるかどうかは、コアとログレベルによって異なります。ログに記録がないからといって、DNS問い合わせがなかったとは限りません。
  4. システム側の結果と比較する。Windowsのターミナルで次のコマンドを実行し、既定のDNSサーバーと指定したDNSサーバーの結果を比べます。これらが確認するのはシステム側の問い合わせであり、クライアントコアのDNSを検証する代わりにはなりません。
nslookup www.qq.com
nslookup www.qq.com 223.5.5.5
ipconfig /flushdns

1つ目のコマンドは通常、現在のシステムDNSを使います。2つ目は指定したアドレスに問い合わせます。3つ目はWindowsのDNSキャッシュを消去します。DNSサーバーによって異なるCDNアドレスが返るのはよくあることで、アドレスが一致しないだけでDNS汚染とは判断できません。アドレスの妥当性、名前解決の安定性、宛先への接続可否、クライアントログをあわせて確認してください。

7. 症状別にDNSの問題を切り分ける

リモートDNSを変更したのに、Webページが開けないのはなぜ?

まずログで名前解決のタイムアウトと接続タイムアウトを区別します。リモートDNSのアドレス形式がサポートされているか、サーバーに到達できるか、リクエストが正しい経路を通るか確認してください。IPアドレスを取得できている場合は、DNSを何度も変更せず、ノードへの接続と通信のルーティングを確認します。

ブラウザーは使えるのに、ほかのアプリで名前解決に失敗する場合は?

まず、そのアプリがVPNやアプリごとのプロキシ設定から除外されていないか確認し、独自のDNSを使用していないか調べます。デスクトップでシステムプロキシだけを有効にしている場合は、アプリがシステムのプロキシ設定を参照するかどうかも確認してください。ブラウザーで接続できても、端末内のすべてのアプリが通信対象になっている証拠にはなりません。

DNSを変更したら、中国国内のサイトが遅くなったのはなぜ?

中国国内向けのドメインがリモートDNSへ送られていないか、通信自体は直接接続になっているかを確認してください。名前解決を行う場所と通信の出口が一致しないと、適切でないCDNアドレスが返されることがあります。中国国内向けの名前解決をローカルDNSに戻し、接続を確立し直して、同じサイトで速度を比較してください。

一部のサイトだけ開けない場合、IPv6を無効にすべき?

まずAレコードとAAAAレコードそれぞれの接続状況を比較し、現在の接続経路でIPv6が利用できるか確認します。比較のためにIPv6の名前解決設定を一時的に変更してもかまいませんが、元の値を記録してください。IPv6を無効にするだけで、IPv6のルーティングや通信の取り込み範囲を確認しないままにしないでください。

サブスクリプションを更新すると、DNS設定も同期される?

一般的なノードのサブスクリプションはサーバー設定を更新するもので、クライアント全体のDNSやルーティング設定まで含むとは限りません。更新後にローカル設定を確認してください。カスタム設定全体を使用している場合は、実行設定が画面上のDNS項目を上書きしていないかも確認します。

復元できる設定記録を残しましょう。使用中のコア、通信の取り込み方式、ローカルDNSとリモートDNS、ルーティング方針、ブラウザーのDNS設定、変更日を記録します。次に問題が起きたときは、ノード・DNS・ルーティングを同時に変更するより、最後に変更した項目から戻すほうが原因を特定しやすくなります。

v2rayNをダウンロードプラットフォームに合わせてクライアントを選択