DNSリークとは?検出方法とV2Rayクライアントの漏洩対策設定

DNSリークの原因と影響を解説し、オンライン検出の手順と、デスクトップ・AndroidでのDNS設定を紹介。最後に再検証で効果を確認します。

この記事の要点

ノードには接続できるのに、検出ページで日本国内の通信事業者DNSが表示される場合に適しています。まず直結時の基準を作り、ブラウザーの安全なDNS、システムキャッシュ、クライアントのルーティングによる影響を確認します。その後、v2rayN、v2rayNG、v2flyNGのDNSとトラフィック取り込みを調整し、3回の再検証で想定どおりの問い合わせ経路か確認します。

DNSリークの判断基準

DNSはドメイン名を接続可能なIPアドレスに変換します。ブラウザーでサイトを開くと、通常は先にドメインを問い合わせ、その結果のアドレスへ接続します。プロキシノードがWeb通信を転送していても、システムのDNS問い合わせまで同じ経路を通るとは限りません。別々のコンポーネントが処理するため、直結とプロキシに分かれることもあります。

DNSリークとは、検出ページに複数のリゾルバーが表示されること自体ではありません。本来、指定したリゾルバーやプロキシ経路で処理すべき問い合わせが、想定した経路を迂回する状態です。よくある症状は、Webの出口アドレスは変わっているのに、現在のネットワーク事業者やルーターから通知されたリゾルバーが表示され続ける、またはテスト用ドメインがローカルネットワークの53番ポートで直接解決されることです。

検出結果 考えられる原因 対処のポイント
出口アドレスは変わったが、リゾルバーは国内通信事業者のまま システムDNSまたはUDP 53番ポートがクライアントに取り込まれていない TUN、VPNサービス、ローカルDNSの設定を確認
ブラウザーによって表示されるリゾルバーが異なる いずれかのブラウザーで独立した安全なDNSが有効になっている ブラウザー設定を統一して基準を取り直す
検出結果にルーターのアドレスが時々表示される システムのフォールバック、キャッシュ、ネットワーク切り替えで代替DNSが使われた キャッシュを削除して3回連続でテスト
プロキシ側のリゾルバーだけが表示される ドメイン問い合わせがリモートまたは指定したリゾルバーで処理されている ルーティングがルールどおりか引き続き確認

結論:まず想定経路を確認してからリークを判断

重要なのはリゾルバーの数ではなく、所属先と問い合わせ経路です。会社のネットワーク、家庭用ルーター、ブラウザーの安全なDNSによって結果は異なります。どのリゾルバーを使う想定なのかを先に明確にしてこそ、再検証で判断できます。

オンライン検出と直結時の基準を作る方法

設定を変更する前に、クライアントを完全に切断した状態で1回、ノード接続後にもう1回テストします。各回は同じブラウザー、同じネットワーク、同じ検出モードを使い、ブラウザーの違いをクライアントの不具合と取り違えないようにします。標準検出と拡張検出に対応したDNSテストページがおすすめです。拡張検出ではランダムなサブドメインへの問い合わせが増えるため、代替リゾルバーを見つけやすくなります。

  1. 直結時の結果を記録

    v2rayNを終了するか、Android側のVPNサービスを停止し、ブラウザーの安全なDNSを無効にしてから、検出ページで拡張検出を1回実行します。出口ネットワークの所属、リゾルバー数、リゾルバーが属するネットワークを記録し、一時的なテスト用ドメインは記録不要です。

  2. 対象ノードに接続

    クライアントで利用可能な設定を1つ選びます。v2rayNではシステムプロキシまたはTUNモードを有効にし、v2rayNG・v2flyNGでは「接続」をタップして、システムのステータスバーにVPNサービスが実行中と表示されることを確認します。

  3. 古いキャッシュを削除

    デスクトップではDNSキャッシュを更新し、その後ブラウザーを完全に終了して再起動します。Androidではクライアントをいったん切断して再接続し、ブラウザーが古い結果を使い続ける場合はブラウザーのプロセスを終了します。

  4. 3回連続で検出

    各回の間隔を少なくとも30秒空け、検出ページを再読み込みします。3回とも想定したリゾルバーだけが表示されれば、キャッシュ、代替DNS、一時的なネットワーク切り替えの影響を単発の結果より確実に除外できます。

  5. 出口アドレスの変化を比較

    Webの出口アドレスが変わっていない場合は、まずプロキシの取り込みを確認します。出口は変わったのにリゾルバーが直結時の基準と同じ場合は、クライアントのDNS設定を調べます。

Windowsで確認するコマンド

以下のコマンドで、システムが現在使用しているDNSの確認、キャッシュの削除、ローカルで53番ポートを待ち受けているプログラムの確認ができます。これだけで問い合わせの外向き経路を証明することはできませんが、誤ったネットワークアダプター設定やポート競合の特定に役立ちます。

ipconfig /all
ipconfig /flushdns
nslookup example.com
powershell -NoProfile -Command "Get-NetUDPEndpoint -LocalPort 53 -ErrorAction SilentlyContinue"

v2rayNデスクトップ版のDNSリーク対策

以下はv2rayN 7.xとXray Coreを基準にしています。マイナーアップデートで項目の位置が変わることはありますが、確認の流れは同じです。まずCoreの種類を確認し、DNSを設定してから、システムプロキシとTUNのどちらを使うか決めます。システムプロキシが取り込めるのは主にHTTPまたはSOCKSプロキシに対応したアプリで、すべてのプログラムが送信するUDP 53番ポートの問い合わせを自動的に取り込むとは限りません。より広範囲のシステム通信を対象にするなら、TUNモードを優先して確認します。

  1. コアを確認

    「設定」→「パラメーター設定」→「Coreタイプ」を開き、現在の設定でXrayが使われていることを確認します。保存後にコアを再起動し、以前に生成された設定を古いプロセスが使い続けないようにします。

  2. DNSを設定

    「設定」→「DNS設定」→「Xray DNS」を開き、まず使用中のバージョンに付属する基本テンプレートを選択します。その後、ルーティングに合わせて直結用DNSとプロキシ用DNSを設定します。直結するドメインにはローカルネットワークから到達できるリゾルバーを使い、プロキシ対象のドメインはプロキシ経由でアクセスできるリゾルバーに任せます。

  3. ルーティングを確認

    「設定」→「ルーティング設定」で現在のルールを確認します。ドメインが先にIPへ解決されると、後続処理ではIPルールだけに一致する可能性があります。ドメイン単位で振り分ける場合は、問い合わせのポリシーとルーティングルールを組み合わせ、DNSアドレスだけを変更しないでください。

  4. TUNを有効化

    システムプロキシに従わないプログラムも取り込みたい場合は、「設定」→「パラメーター設定」→「Tunモード設定」を開き、DNSハイジャックと自動ルーティングの項目を確認してから、メイン画面でTUNを有効にします。初回有効化時は、システムの案内に従って必要な権限操作を完了してください。

  5. 再起動して再検証

    古いコアを停止し、ipconfig /flushdnsを実行してからv2rayNを再起動します。まず通常のWebページを開いて接続を確認し、その後DNS拡張検出を3回実行します。

システムプロキシとTUNの違い

エラー:failed to find an available destination

原因と対処:アウトバウンドサーバーのドメインを解決できないか、利用可能なアドレスがルーティングルールですべて除外されています。まずノードアドレスの入力ミスとシステム時刻を確認し、基本DNSテンプレートに戻してコアを再起動します。

エラー:lookup server.example: no such host

原因と対処:現在のリゾルバーがノードドメインの結果を返していないか、問い合わせが誤って利用できないアウトバウンドへ送られています。一時的にノードサーバーのドメインを直結DNSで解決し、ノード接続を確認してからルーティングを戻します。

エラー:bind: Only one usage of each socket address is normally permitted

原因と対処:ローカルDNSまたはプロキシポートを別のプロセスがすでに使用しています。ポート確認コマンドでプロセスを特定して競合サービスを停止するか、「設定」→「パラメーター設定」で待ち受けポートを変更し、そのポートに依存する設定も合わせて修正します。

v2rayNG・v2flyNG Android版の設定

Android版は通常、システムVPNサービスで通信を取り込みます。DNSがクライアントを通るかどうかは、ローカルDNS、仮想DNS、ルーティング設定によって決まります。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用するため、設定名や利用できる項目はコアの機能によって異なる場合があります。別のクライアントの高度なJSON設定をそのまま流用せず、まず現在のバージョンに組み込まれたDNS項目で動作する基準を作ってください。

  1. クライアントを更新

    まず、現在のダウンロードページで案内されている安定版を使用しているか確認します。アップデート後はアプリを再起動して設定移行を完了させ、接続確認済みのノードを1つ選択します。

  2. ローカルDNSを有効化

    v2rayNGで「設定」→「ローカルDNS」を開き、DNSをクライアントで処理する項目を有効にします。待ち受けポートが他のローカルサービスと競合していないことも確認してください。DNSの待ち受けポートは53番またはクライアントが割り当てた高位ポートが一般的ですが、画面の表示を優先します。

  3. 仮想DNSを確認

    「設定」→「VPN設定」を開き、FakeDNSまたは対応する仮想DNS項目を確認します。ドメイン単位のルーティングが必要で、通常の名前解決では対象ドメインが早期に露出する場合に有効化できます。LAN機器や一部アプリの接続に問題が出たら、まず無効にして結果を比較してください。

  4. アプリ別ルールを確認

    アプリ別プロキシを有効にしている場合は、検出に使うブラウザーがプロキシ対象に含まれていることを確認します。ブラウザーが除外されていると、WebリクエストもDNS問い合わせも直結経路で処理されます。

  5. 切断して再接続

    設定を保存したらホーム画面に戻るだけにせず、現在の接続を停止して5秒待ってから再接続します。その後ブラウザーのプロセスを終了し、検出ページを開き直して3回テストします。

設定項目 v2rayNG v2flyNG
主なコア Xray v2fly
トラフィックの取り込み システムVPNサービス システムVPNサービス
優先して確認する項目 ローカルDNS、FakeDNS、アプリ別プロキシ ローカルDNS、ルーティングルール、アプリ別プロキシ
変更後の操作 接続を停止してサービスを再起動 接続を停止してサービスを再起動

結論:まず問い合わせを取り込み、リゾルバーを選ぶ

DNSアドレスをあるパブリックリゾルバーから別のものへ変えるだけでは、クライアントを迂回する問い合わせは直せません。Androidでは、まず検出に使うブラウザーがVPNとアプリ別プロキシの対象に含まれていることを確認し、その後ローカルDNS、FakeDNS、ルーティングルールを調整します。

再検証に失敗したときの切り分け

設定後もローカルリゾルバーが表示される場合、ノードやDNSアドレスを次々に変更しないでください。ノードとブラウザーを固定し、ブラウザーの安全なDNS、クライアントの取り込みモード、システムキャッシュ、ルーティングルールを1項目ずつ確認します。複数の変数を同時に変えると、結果が一時的に正常になっても、どの設定が効いたのか判断できません。

症状:出口は変わったが、3回とも国内通信事業者のDNSが表示される

原因と対処:Web通信はプロキシを通っていますが、DNSはシステムのネットワークアダプターから送信されています。デスクトップではTUNに切り替えて確認し、AndroidではローカルDNS、VPNサービス、アプリ別プロキシの対象範囲を確認します。

症状:1回目は正常だが、2回目に別のリゾルバーが表示される

原因と対処:代替DNS、ブラウザーの安全なDNS、ネットワーク切り替えが原因の可能性があります。ネットワークを固定し、ブラウザー独自の名前解決を無効にしてキャッシュを削除した後、30秒間隔で3回連続してテストします。

症状:FakeDNSを有効にするとLAN内のドメインにアクセスできない

原因と対処:LAN内のドメインが仮想的に解決され、ローカルDNSへ渡されていません。LAN内ドメインとプライベートアドレス用の直結ルールを追加するか、FakeDNSを一時的に無効にして差を確認します。

症状:DNSを変更するとすべてのWebサイトで名前解決エラーが表示される

原因と対処:リゾルバーへ到達できない、DNSアウトバウンドがブロックされている、または現在のコアが設定形式に対応していない可能性があります。クライアント内蔵のテンプレートに戻し、基本接続を確認してからカスタムルールを1つずつ追加します。

適切な再検証記録に含める項目

  1. クライアント名、バージョン系列、コアの種類。たとえばv2rayN 7.xとXrayの組み合わせであり、「V2Ray接続済み」だけでは不十分です。
  2. システムプロキシ、TUN、AndroidのVPNサービスのうち、どの方式で通信を取り込んだか。
  3. 検出に使ったブラウザーで独立した安全なDNSが有効か、アプリ別プロキシの対象に含まれているか。
  4. 直結時の基準と接続後でリゾルバーの所属がどう変わったか、3回のテスト結果が一致したか。
  5. 再検証の時刻、現在のネットワーク種別、Wi-Fiの切り替えがあったか。ネットワーク環境の変化を除外しやすくなります。

リゾルバーが2つ検出されたらDNSリーク?

必ずしもそうではありません。同じDNSサービスが複数の出口アドレスを使うこともあり、負荷分散によって地域の異なるリゾルバーが返される場合もあります。まず所属先が想定どおりか確認し、直結時の基準にある通信事業者のリゾルバーが混ざっていないかを確認します。

ノードを変更してもDNSの結果が変わらないのはなぜ?

DNSはクライアントが指定した固定リゾルバーで処理され、ノードの切り替えに連動しないことがあります。問い合わせが想定した経路を迂回していなければ、リゾルバーが変わらないのは正常です。

システムプロキシを有効にしてもTUNは必要?

ブラウザーなどシステムプロキシに従うアプリだけを使うなら、まずシステムプロキシで対応できます。ゲーム、独立したアップデーター、UDP問い合わせを直接送信するアプリまで対象にする場合は、TUNを有効にしてDNSハイジャック設定を確認します。

ブラウザーの安全なDNSは常に無効にすべき?

切り分け中は、クライアントの処理経路を確認しやすくするため無効化をおすすめします。問題解決後に再び有効化する場合は、ブラウザーが選ぶリゾルバーとプロキシポリシーが想定どおりか、3回テストして確認してください。

サブスクリプションの更新失敗もDNSが原因?

可能性があります。サブスクリプションサーバーのドメインを解決できないと、更新はそのままタイムアウトします。まずサブスクリプション更新を利用可能なプロキシ経由にするか、そのドメインを直結DNSで解決できるようにしてから、コアのログにあるlookupとtimeoutの情報を確認します。

GUIクライアントを入手 プラットフォームに合わせてv2rayNまたはv2rayNGを選択