V2RayのDNSリーク検出と対策|v2rayNのリモートDNS・FakeDNS設定ガイド

DNSリーク検査で問い合わせ先を確認し、v2rayNのリモートDNS・直接接続DNS・FakeDNSとルーティングを設定して、意図しないDNS流出を防ぎます。

この記事の概要

「Webサイトはプロキシ経由なのに、DNS検査では利用中の回線事業者が表示される」という場合の確認手順を紹介します。ブラウザー、システム、コアの名前解決経路を切り分け、通常のプロキシ、リモートDNS、TUN、FakeDNSの順に設定します。一度に変更する項目は1つに絞り、最後に検査ページ、コマンド、ログで確認しましょう。通常の直接接続による名前解決をリークと誤認しないことも大切です。

DNSリークとは?Web通信と名前解決の経路を分けて確認

DNSはドメイン名をIPアドレスに変換します。Web通信がプロキシ経由でも、ドメイン名の問い合わせまでプロキシ経由とは限りません。本来プロキシで処理したいドメイン名をアプリがローカルネットワークのDNSサーバーに問い合わせると、利用中のネットワークに検索内容が知られる可能性があります。対処すべきなのは、この経路の食い違いです。

v2rayNはデスクトップ用クライアントです。DNSの動作は、使用中のコア、インバウンド方式、生成された設定によって異なります。VMessやVLESSなどのプロトコル名だけでは、DNSリークの有無は判断できません。プロトコルを変えても、ブラウザー独自の名前解決やルーティング規則の順序は通常改善しません。

アプリがドメイン名を送信 インバウンドでリクエストを受信 ルールに基づいて経路を選択 ドメイン名を名前解決 接続先アドレスへ接続

この流れはトラブルシューティングの考え方であり、すべてのリクエストが必ず同じ順序で処理されるわけではありません。アプリが端末上で先に名前解決する場合も、IPルールとの照合のためにコアが先に名前解決する場合もあります。確認するのは「誰が問い合わせたか」と「どのアウトバウンド経由で送信されたか」の2点です。

DNSリークを検査する:基準値を記録してプロキシ接続時と比較

DNSLeakTestなどの検査ページを開き、標準テストまたは拡張テストを実行して、DNSリゾルバーのアドレス、運営ネットワーク、所在地を記録します。検査ページに表示されるのは通常、最終的な再帰リゾルバーの出口であり、PCが直接接続しているDNSサーバーとは限りません。所在地データベースにも誤差があるため、「国が違う」という理由だけで判断しないでください。

  1. 基準値を記録:プロキシとTUNをオフにし、ブラウザーを再起動して、個人情報を入力しないDNS検査ページにアクセスします。このときのパブリックIPとDNSリゾルバーの運営ネットワークを記録してください。
  2. 通常のプロキシを有効化:接続できることを確認済みのノードを起動し、v2rayNのトレイメニューで「システムプロキシ」→「システムプロキシを自動設定」を選択します。表示名はバージョンによって異なる場合があるため、実際の画面に従ってください。
  3. 同じテストを再実行:Webアクセス時のパブリックIPが変わったことを確認してから、DNS検査を実行します。できる限りブラウザー、ノード、検査ページは変更しないでください。
  4. ブラウザー設定を切り分け:現在の「セキュアDNS」の設定を記録し、一時的にオフにして再検査します。ノードとルーティングを同時に変更すると、どの操作が結果に影響したか判断できません。
  5. ほかのアプリも確認:ブラウザーで問題がなければ、対象のアプリでも確認します。システムプロキシは端末上のすべての通信を制御するものではありません。ブラウザーで問題がなくても、ほかのアプリも正常とは限りません。

ポートとコマンドで確認:端末上の名前解決とプロキシ経由を切り分ける

まず「設定」→「パラメーター設定」で、現在のローカル待ち受けポートとインバウンドの種類を確認します。以下ではSOCKSインバウンドの例として10808を使用します。すべてのバージョンの既定値を示すものではありません。該当ポートがSOCKSに対応していることを確認してから、対応するコマンドを実行してください。

53
DNSで一般的なUDP/TCPポート
443
DNS over HTTPSで一般的なポート
10808
この記事で使用するSOCKS待ち受けポートの例

WindowsではPowerShellで以下のコマンドを実行できます。最初のコマンドはローカルポートへのTCP接続を確認するだけです。後の2つで、ドメイン名がどこで名前解決されるかを比較します。環境によってcurlが別のコマンドのエイリアスになっている場合があるため、curl.exeを使用してください。

Test-NetConnection 127.0.0.1 -Port 10808

curl.exe --socks5 127.0.0.1:10808 --connect-timeout 10 -I https://example.com

curl.exe --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 -I https://example.com

結論:DNSを調整する前に、リクエストがプロキシに届くことを確認

ローカルポートに接続できない場合や、アプリが直接接続している場合、リモートDNSを変更してもそのリクエストは処理されません。先にインバウンドとアプリのプロキシ設定を修正し、その後に名前解決の経路を比較すると、不要な変更を減らせます。

v2rayNのリモートDNSと直接接続DNS:アドレスとアウトバウンドをセットで設定

変更前にクライアント設定をバックアップし、現在のノード、ルーティングモード、DNS設定を記録します。「設定」→「DNS設定」を開き、使用中のコアに対応する項目を確認してください。バージョンによってDNS項目がパラメーター設定にある場合は、実際の画面にあるDNSの項目から操作します。コアごとに設定構造は異なります。1つのJSONをすべてのコアに貼り付けないでください。

用途設定例確認する経路
プロキシ経由のドメイン名解決https://1.1.1.1/dns-query対応する形式のリモートDNS欄に入力し、問い合わせがプロキシ経由で送信されることを確認します。
直接接続を許可するドメイン223.5.5.5明確に直接接続すると決めた問い合わせにのみ使用します。従来型DNSの問い合わせは通常、暗号化されません。
プロキシノードのドメイン名サブスクリプションに登録されたサーバーアドレスのドメイン名プロキシ接続の確立前にも利用できる名前解決経路を用意し、循環依存を避けます。

表中のアドレスは設定の関係を説明する例であり、必ず使用すべきサービスの一覧ではありません。リモートDNSにDoHを選んでも、HTTPS暗号化で保護されるのは通信内容です。DoHの問い合わせが直接接続される場合、ローカルネットワークにはDNSサービスへの接続が見えます。DNS通信もローカル回線の外に出したい場合は、ルーティングも確認してください。

  1. 対象範囲を決める:原因の切り分け中は、クライアントのグローバルプロキシモードを一時的に使用すると、ルーティングによる変数を減らせます。テストが終わったら通常のルーティングに戻し、一時的な設定を最終設定と混同しないでください。
  2. リモートDNSを設定:使用中のコアが対応する形式でDNSアドレスを入力します。通常のDoHと、一部のコアにあるローカル直接接続の名前解決モードは別物です。HTTPSと表示されるだけでプロキシ経由と判断しないでください。
  3. ルールの順序を確認:「海外IPは直接接続」やリゾルバーのアドレスに適用される直接接続ルールがある場合、先に一致していないか確認します。通常、ルールは上から順に評価されます。先に一致した直接接続ルールを、後続のプロキシルールで上書きすることはできません。
  4. ノードの初期名前解決を設定:ノードにドメイン名を使用している場合は、独立した到達可能な名前解決経路を用意します。ノード自身を使わないとノードのドメイン名を解決できない設定は避けてください。
  5. 保存してコアを再起動:ログに設定エラーがないことを確認し、同じテストをもう一度行います。通常のルーティングに戻すと問題が再発する場合は、ドメインルールとリゾルバーのアウトバウンドルールを重点的に確認してください。

FakeDNSとTUN:IPで受信した通信からドメイン名を特定

FakeDNSはドメイン名に実際のサーバーアドレスを直接返すのではなく、合成IPアドレスを割り当て、ドメイン名と合成アドレスの対応を保存します。後続の接続がこのアドレスに届くと、コアがドメイン名を復元して処理を続けられます。解決するのはドメイン名の伝達に関する問題であり、独立した暗号化DNSサービスではありません。また、プロキシのアウトバウンドルールの代わりにもなりません。

Xrayでよく使われるFakeDNSのIPv4アドレス範囲は198.18.0.0/15ですが、実際の生成設定を確認してください。この範囲はベンチマーク用であり、実際のWebサイトのパブリックIPではありません。問い合わせと後続の接続の両方が、FakeDNSに対応する同じ経路で処理されて初めて、マッピングが有効になります。

  1. まず基本のプロキシを確認:FakeDNSを有効にせず、先ほどのリモートDNSテストを完了させます。ノードに接続できない状態で、複数の高度な設定を同時に有効にしないでください。
  2. 実装の対応状況を確認:現在のTUN実装とコアが、該当するFakeDNSまたはfake-ipモードに対応しているか確認します。名前が似ていても設定を共用できるとは限りません。通常のSOCKS環境では、検査のために無理に有効にする必要はありません。
  3. DNSの取り込みを有効化:使用中のクライアントが提供するTUNとDNS取り込みの項目を設定します。仮想ネットワークアダプターを有効にしただけでは、すべてのDNS問い合わせがコアに渡るとは限りません。
  4. ドメイン名の復元を確認:生成された設定がFakeDNSマッピングの識別に対応しているか確認し、必要に応じてFakeDNSのスニッフィング関連設定も確認します。通常のスニッフィングでHTTPやTLSの識別を有効にしただけでは、設定が完了したことにはなりません。
  5. キャッシュを消して再テスト:テスト対象のアプリを再起動し、必要に応じて以下のキャッシュ削除コマンドを実行します。ブラウザー独自のキャッシュがある場合は、ブラウザーも再起動してください。
ipconfig /flushdns

ブラウザー内蔵のDoH、アプリ独自のDNS、IPv6は見落としやすいポイントです。UDP 53を取り込むだけでは、すべてのHTTPSによる名前解決を処理できません。IPv6ルーティングが取り込み対象でなければ、アプリが別のネットワーク経路で通信する可能性もあります。IPv6は実際の対応状況に応じて設定してください。切り分けのため一時的に対象ネットワークアダプターのIPv6を無効にして結果を比較する方法もありますが、一般的な解決策として無効化を続けないでください。

DNS設定後にWebサイトを開けない場合:ログから失敗箇所を特定

まずログの接続先アドレス、使用されたアウトバウンド、失敗時刻を確認し、次にエラーのキーワードを調べます。以下はよくあるエラーの例で、毎回まったく同じ文面が表示されるとは限りません。一時的にログの詳細度を上げると原因の特定に役立ちます。ログを共有する前に、サブスクリプションURL、ノードの認証情報、個人のアクセス先ドメインを伏せてください。

エラー:i/o timeout

原因:リクエストがタイムアウトしています。DNSサービスに到達できない場合や、プロキシからDNSサービスへの接続に失敗した場合などが考えられます。

対処:このログ行の接続先がDNSアドレスか確認します。直前に使えていた設定に戻し、ノードが正常なことを確かめてから、リゾルバーのアドレスとアウトバウンドルールを1つずつ確認してください。

エラー:no such host

原因:ドメイン名の問い合わせで有効な結果を得られていません。ドメイン名の入力ミス、リゾルバーの応答、ノードのドメイン名の初期名前解決などが原因として考えられます。

対処:まず失敗しているのがノードのドメイン名かWebサイトのドメイン名かを切り分けます。前者ならプロキシ接続前のDNSを確認し、後者なら別のドメインやDNSリゾルバーで結果を比較してください。

エラー:context deadline exceeded

原因:処理が制限時間を超えています。DoHリクエスト付近で発生している場合は、接続、TLSハンドシェイク、プロキシ経路をさらに確認してください。

対処:システム時刻とログの前後関係を確認し、DNSサービスに到達できるか調べます。証明書や時刻の問題を隠すために、証明書検証を無効にしないでください。

変更後に一部のWebサイトだけ開けない場合は、まずルーティングルールとIPv6を確認します。すべてのWebサイトがすぐに開けなくなった場合は、DNSアドレスの形式、ノードの初期名前解決、TUNルーティングを優先して確認してください。クライアントで設定を正常に読み込めない場合は、ルールを追加し続けず、まず今回の変更を元に戻します。

よくある質問:検査結果とDNSリーク対策の確認方法

パブリックIPは変わったのに、DNSにローカル回線事業者が表示されます。どう確認すればいいですか?

まずブラウザーのセキュアDNSの状態を記録し、一時的に無効にして再検査します。次にSOCKSでドメイン名をプロキシに渡すコマンドを使って比較し、リクエストがプロキシに届いているか確認します。TUNモードだけで問題が起きる場合は、DNSの取り込みとIPv6ルーティングを調べてください。

複数の国のDNSが検出されたら、必ずリークしていますか?

必ずしもそうではありません。パブリックDNSは複数の出口を使う場合があり、IPアドレスの所在地情報も正確とは限りません。アドレスの数だけで判断せず、プロキシをオフにしたときの基準値と運営ネットワークを比較し、ログも確認してください。

リモートDNSにDoHを設定しても、直接接続されるのはなぜですか?

DoHで決まるのは通信方式であり、アウトバウンド経路ではありません。DNSサービスのアドレスが直接接続ルールに一致していないか、使用中のコアがルーティングを迂回するローカル名前解決モードを使っていないか確認します。修正後、コアを再起動して再テストしてください。

FakeDNSを有効にした後、LAN内のデバイス名で接続できなくなった場合は?

LAN内の名前や内部ドメインには、適切なローカル名前解決と直接接続ルールを設定してください。まずFakeDNSを無効にして問題が解消するか確かめてから、例外ルールを調整します。内部ドメインを一律にパブリックDNSへ問い合わせないでください。

Android端末にも、このv2rayN設定をそのまま使えますか?

トラブルシューティングの考え方は応用できますが、設定をそのまま流用することはできません。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。それぞれのDNS、VPNの取り込み範囲、使用中のバージョンにある設定項目を確認してください。

まとめ:同じテスト一式で設定を確認

修正後は通常のルーティングに戻し、ブラウザーと対象アプリを再起動して、パブリックIP、DNS検査、コマンドによる確認をもう一度行います。プロキシ経由にする予定の問い合わせがローカルの名前解決経路に流れず、直接接続するWebサイトやLANへのアクセスも正常であれば、今回の調整は完了です。

クライアントのダウンロードとインストール