FakeDNSの仕組み:仮想IPでドメイン振り分けを行う方法と設定が向いているケース

FakeDNSが予約済みアドレスを返してドメインとの対応を記録する仕組みと、TUNモードやドメインベースのルーティングでの役割、直結アプリとの競合時の対処を解説します。

この記事のポイント

FakeDNSは仮想アドレスにドメイン情報を対応付ける仕組みです。TUNで通信を取り込んだ後もドメインに基づいて振り分けたい場合に役立ちます。通信を高速化する機能でも、通常のDNS解決に置き換わるものでもありません。アドレスの返却から通信の取り込み、ドメインの復元、接続先の選択まで順を追って解説し、利用条件や設定の確認項目、元に戻す手順も紹介します。接続が正常に動作しており、DNSやルーティングの見直しを検討している方向けです。

FakeDNSがドメイン情報を保持する仕組み

通常のDNSでは、ドメイン名を接続先サーバーのIPアドレスに変換します。その後アプリが接続を開始すると、システムのネットワーク層からは通常、接続先のIPアドレスしか見えません。複数のドメインが同じIPアドレスを使っている場合、そのIPだけから元のアクセス先を特定するのは困難です。FakeDNSは応答方法を変え、まず仮想IPを割り当て、そのIPとドメインの対応をローカルに記録します。

アプリがドメインを問い合わせる 仮想アドレスを割り当てる 接続先への通信を取り込む 元のドメインを復元する 出力先ルールを照合する

たとえば、アプリが example.com を問い合わせると、FakeDNSはアドレスプールからIPアドレスを割り当てます。アプリがそのアドレスに接続すると、プロキシのコアが対応表から example.com を復元し、ドメインを使ってルーティングを判定します。このアドレスは端末内の処理で使う目印にすぎず、Webサーバーの新しいアドレスではありません。リモートノードの接続先として直接使うこともできません。

仮想アドレスプールと通常のDNS解決の違い

XrayのFakeDNS設定では、IPv4アドレスプールの例として 198.18.0.0/15 がよく使われます。この範囲は 198.18.0.0 から 198.19.255.255 までで、ネットワーク性能測定用に予約されたアドレス空間です。インターネット上の接続先として直接アクセスできるアドレスではありません。家庭内LANで使うプライベートアドレス帯とも異なります。

198.18.0.0/15
この記事で使用するIPv4アドレスプール
131072
このネットワーク範囲に含まれるIPv4アドレス数
53
従来のDNSで一般的に使われるポート番号

アドレスプールの範囲と、保持できる対応情報の数は別のものです。ネットワーク範囲に含まれるアドレス数と、現在のコアが保持する対応情報の数が同じとは限りません。容量や解放方法、再起動後も対応情報が残るかどうかは実装によって異なります。サンプル設定の容量を、すべてのクライアントの既定値だと考えないでください。

TUNモードでドメイン振り分けを行う仕組み

TUNは、ルーティング条件に合うIP通信を仮想ネットワークインターフェースに取り込みますが、アプリが問い合わせたドメイン名を自動的に保持するわけではありません。FakeDNSを使うと、コアが接続先の仮想IPからドメイン名を復元し、ドメインルールと照合できるようになります。システムのHTTPプロキシは使わないものの、TUNで通信を取り込めるアプリに特に有効です。

TUNと仮想アドレスの連携

DNS応答
対応情報を扱えるコンポーネントが仮想IPを返す
通信の入口
仮想ネットワークインターフェースと関連するルート
ドメイン名の取得元
DNS問い合わせと接続先IPの対応情報
確認するポイント
アドレスプール宛ての通信が同じ処理経路に戻るか

TUNで通信を取り込み、対応情報からドメインを復元します。両方が正しく動作して初めて一連の処理が成立します。

システムプロキシがドメイン名を渡す

DNS応答
仮想アドレスが不要な場合もある
通信の入口
アプリが使用するHTTPまたはSOCKSプロキシ
ドメイン名の取得元
プロキシリクエストに含まれる接続先のホスト名
確認するポイント
アプリがドメイン名をプロキシに渡しているか

アプリからプロキシにドメイン名が渡されているなら、通常FakeDNSは必須ではありません。

ドメイン名を復元した後にどの出力先へ接続するかは、引き続きルーティングルールで決まります。FakeDNSがすべての通信を自動でプロキシに通すわけでも、直結用の許可リストを作るわけでもありません。ドメインルールやIPルール、その優先順位によって判定結果は変わります。IPの地理情報に基づいて振り分ける場合は、ルールが参照するアドレスが名前解決後の実際の接続先IPかどうかも確認してください。

FakeDNSの利用が向いているケース

まず、現在の接続でどの情報が失われているかを確認してから、利用するか判断します。実用上の目安は、アプリの通信を取り込めているのにコアのログには接続先IPしか表示されず、期待するドメインルールが適用されないこと、さらにアプリのDNS問い合わせも同じ処理経路に取り込めることです。この両方を満たす場合に、試す価値があります。

利用場面推奨優先して確認する項目
TUNで通信を取り込み、主にドメインルールで振り分ける有効にして試す価値ありDNS問い合わせと仮想アドレス宛ての接続をどちらも取り込めるか
ブラウザーがシステムプロキシを正常に使用している通常は現状のままでよいプロキシリクエストにドメイン名が含まれているか
業務用VPNと社内ドメインを併用している先に除外対象を計画する社内DNS、社内ネットワークのアドレス帯、ルートの優先順位
アプリが実IPの保存や検証を必要とする通常の名前解決を優先仮想アドレスによってアプリの判定が変わらないか
接続先がIPアドレスで直接指定されている対応情報からドメイン名を補うことはできないIPルールで接続を直接処理する

FakeDNSを使うと、「実際に名前解決してから転送方法を決める」必要性を減らせる場合がありますが、ダウンロード速度やアクセス遅延の改善を保証するものではありません。アプリが独自に暗号化DNSを使っている場合、問い合わせがローカルの対応情報を扱うサービスを経由しないことがあります。通常のDNS問い合わせを取り込めていても、そのアプリには仮想IPではなく実IPが返される可能性があります。

有効にする前に処理経路を4項目確認

v2rayNのデスクトップ版では、まず「設定」で現在のTUN、DNS、ルーティングの各項目を確認します。具体的なサブメニューは使用中のバージョンによって異なります。Android版のv2rayNGはXrayコアを使用しますが、VPNの許可に成功しただけでは、FakeDNSの対応情報が機能しているとは限りません。どちらも先に現在の設定を記録し、一度に複数の項目を変更しないようにしてください。

  1. 現在の設定をバックアップする。DNSサーバー、ルーティングルール、使用中のコアを記録します。まずFakeDNSを無効にした状態でノードが利用できることを確認し、既存の接続障害を対応情報の問題と誤認しないようにします。
  2. DNSの入口を確認する。対象アプリの問い合わせがどのリゾルバーを通るか確認します。従来のDNSでは通常UDPまたはTCPの 53 番ポートを使いますが、ブラウザー内蔵の暗号化DNSは、このポートを調べるだけでは判別できません。
  3. アドレスプールのルートを確認する。198.18.0.0/15 を使う場合は、該当するアドレス帯が社内ネットワークで使われていないこと、またルールによって物理ネットワークインターフェースへ迂回されていないことを確認します。特殊なネットワークでは実際にこの範囲を使用している場合があるため、競合する場合はそのまま使わないでください。
  4. ドメイン名の復元を確認する。現在のコアのインバウンド、スニッフィング、対応情報に関する設定を確認し、仮想IPからドメイン名を復元できることを確かめます。Xrayの fakedns、ipPool、poolSize などはそれぞれ役割が異なります。対応情報を利用するインバウンド設定を無視して、アドレスプールだけを追加しないでください。

スニッフィングとFakeDNSは別の機能です。スニッフィングではHTTPのホスト名やTLSハンドシェイク情報からドメインを特定できる場合があります。一方、対応情報の復元には、事前に記録されたDNS問い合わせが必要です。通信の種類によって取得できる情報は異なるため、すべての暗号化通信でスニッフィングによりドメイン名を復元できるとは限りません。クライアントが設定を自動生成する場合、生成ファイルを手動で変更しても次回起動時に上書きされることがあります。

仮想IPとルール適用を確認する方法

テストでは、一般的なドメインを1つと直結が必要な社内ネットワークの接続先を1つだけ選びます。既存の接続を終了してから、再度名前解決してアクセスしてください。開いたままのページだけで判断しないでください。接続の再利用やDNSキャッシュによって、変更前の結果が使われ続けることがあります。

直結との競合と無効化後の復旧手順

よくある失敗は、アプリには仮想IPが返されたものの、接続が対応情報を認識できない経路を通ることです。たとえば、プロセスがTUNの対象外なのに、DNSだけは取り込み対象のシステムDNSを使っている場合や、企業VPNがアドレスプールの範囲を横取りしている場合があります。こうした問題はノードの速度不足ではないため、ノードを何度も切り替えても通常は解決しません。

有効にした後、特定の直結アプリだけ接続できない場合は?

まず、そのプロセスがTUNの対象外になっていないか確認します。直結が必要な場合は、実際のDNS応答を使わせ、接続も直結経路を通るようにしてください。DNSの除外と通信の除外はセットで設定します。プロセスだけを除外しながら、仮想アドレスを返し続けないようにしてください。

FakeDNSを無効にしてもタイムアウトするのはなぜ?

アプリやシステムに古い仮想IPがキャッシュされている可能性があります。DNS設定を元に戻した後、影響を受けるアプリを再起動してください。Windowsではコマンドプロンプトで ipconfig /flushdns を実行し、システムのDNSキャッシュを削除してから再接続します。ブラウザー独自のキャッシュや既存の長時間接続も、個別に再作成が必要な場合があります。

クライアントの再起動後、一部の接続が突然失敗した場合は?

「アプリには古いDNS結果が残っている一方で、コアの対応情報は再構築された」という状態になっていないか確認します。古い接続を終了し、関連するキャッシュを削除してから再度名前解決してください。実装によっては対応情報を永続化できますが、対応状況は使用中のバックエンドによって異なります。再起動前後で対応情報が必ず同じだとは限りません。

仮想IPが表示されたら、DNS漏えいがないと言える?

いいえ。その問い合わせで仮想IPが返されたことしか分かりません。他のアプリやレコードタイプ、ブラウザー独自の名前解決経路では結果が異なる可能性があります。システムのリゾルバー、アプリの暗号化DNS、IPv6のAAAA問い合わせをそれぞれ確認し、実際のルーティング状況も合わせて判断してください。

目的が対応情報の動作確認ではなく安定した接続であれば、説明しやすく元に戻せる設定を優先してください。システムプロキシでドメイン名が正しく渡されているなら、FakeDNSを追加する必要はありません。TUNでドメイン振り分けが必要な場合に限り、DNS、対応情報、ルーティング、出力先を1項目ずつ確認しましょう。原因を特定できない接続障害は、すべてのネットワーク設定を同時に変更せず、接続トラブルの確認手順に沿って調べてください。

v2rayN ダウンロードセンター