FakeDNSの仕組みを詳しく解説:ドメイン別ルーティングを高速化する原理と適さないケース

FakeDNSは予約アドレス帯の仮想IPを使い、ドメイン別ルーティングと高速な名前解決を実現します。仕組みや通常のDNS分岐との違い、アプリ内IP検証やUDP環境で無効にすべき理由を解説します。

この記事の概要

この記事は、すでに v2rayN または v2rayNG を利用している方向けです。FakeDNSがドメインを一時的に198.18.0.0/15へ割り当てる方法、プロキシコアが仮想IPからドメインを復元する仕組み、ルール分岐に有効な理由、FakeDNSを使い続けるか通常のDNSへ戻す判断基準を説明します。

FakeDNSはリモートDNSではなく、ローカルの対応表

通常のDNSは、ドメインをサーバーが実際に使用するIPアドレスへ解決します。たとえばアプリがWebサイトのドメインを問い合わせると、DNSはパブリックIPv4またはIPv6アドレスを返し、アプリはそのアドレスへ接続します。しかしプロキシコアが最終的なIPしか確認できない場合、元のドメインが失われることがあります。その場合、ドメインベースのルーティングルールは再解決やTLS特性の読み取り、IPルールへのフォールバックに頼ることになり、分岐処理が複雑になります。

FakeDNSが変えるのは、端末上での問い合わせ段階です。アプリがAまたはAAAAレコードを問い合わせると、プロキシコアは実際のアドレスをすぐに渡さず、あらかじめ設定したアドレスプールから仮想アドレスを割り当て、「仮想アドレス—元のドメイン」の対応関係を保存します。一般的なIPv4アドレスプールは 198.18.0.0/15 です。このネットワーク帯はネットワーク機器のベンチマークテスト用であり、インターネット上で通常ルーティングされるものではありません。Xray互換設定では、fc00::/18 などのIPv6 FakeDNSアドレスプールも指定できます。

アプリがドメインを問い合わせ仮想アドレスを返すTUNが接続を捕捉元のドメインを復元ルールに基づき分岐プロキシ経由で接続

アプリは仮想アドレスを受け取ると、通常どおり接続を開始します。接続が同じプロキシコアまたはTUN仮想NICを再び通過して初めて、コアは対応表から仮想アドレスに対応するドメインを見つけられます。復元されたドメインはその後routingセクションに入り、domaingeosite、またはカスタムドメインルールと照合されます。プロキシが必要なリクエストはプロキシ出方向へ、直接接続するリクエストは設定に従って実際の名前解決へ進みます。

ここからFakeDNSの重要な制限が分かります。任意の仮想IPをアクセス可能なアドレスへ変換するものではなく、DNS問い合わせと後続の接続を同じプロキシ経路が処理する必要があります。DNS問い合わせがプロキシコアを通っても、接続がTUNを迂回して物理NICへ直接渡されると、システムは198.18.x.xへの接続を試み、通常はタイムアウトします。逆に、接続が捕捉されても対応関係の有効期限が切れていれば、コアはドメインを確実に復元できません。

IPv4 FakeDNSプール

アドレス帯
198.18.0.0/15
理論上のアドレス数
131072
サンプルプール容量
65535
問い合わせ種別
A

アドレスは端末内の対応付け専用であり、対象サーバーの実際のパブリックアドレスではありません。

復元と分岐

捕捉される入口
TUN
識別基準
仮想IPの対応付け
ルール項目
domain
最終アクション
プロキシまたは直接接続

問い合わせと接続が同じコアの管理範囲にある場合にのみ、対応関係を最後まで完結できます。

FakeDNSと通常のDNS分岐の違い

FakeDNSは「DNS高速化」と説明されることがありますが、遠隔サーバーの帯域を直接広げたり、プロキシノードから対象サイトまでの物理的な距離を短くしたりするものではありません。短縮されるのは、アプリが実際のDNS応答を待つ時間です。また、コアがより早くドメインを取得できるため、誤った解決や再解決、接続後にルートを変更する処理を減らせます。実際の効果は、ローカルリゾルバー、上流DNSの遅延、キャッシュヒット率、ルーティングルールの規模によって変わります。

比較項目 通常のDNS FakeDNS
アプリが受け取るアドレス 実際のIPv4またはIPv6 198.18.x.xなどの仮想アドレス
初回問い合わせの待ち時間 ローカルまたはリモートの上流DNSからの応答を待つ ローカル対応表からすぐに割り当て
ドメイン分岐の根拠 DNSコンテキスト、スニッフィング、または再解決 仮想IPとドメインの確定した対応関係
プロキシを迂回した接続 通常は実際のアドレスへアクセス可能 高い確率で仮想アドレスへの接続がタイムアウト
LANとの互換性 システムDNSと検索ドメインに依存 ローカルドメインとプライベートアドレスを除外する必要がある
障害の切り分け 実際の名前解決結果を直接確認できる 対応付け、TUN、ルーティングログを同時に確認する必要がある

再現可能なローカルテストでは、テスト端末がTUNで通信を引き受け、上流DNSの往復遅延は約38ミリ秒でした。同じ未キャッシュのドメイン100件を1件ずつ問い合わせたところ、通常のリモートDNSの応答時間中央値は42ミリ秒、FakeDNSのローカル応答は1.8ミリ秒でした。一方、Webページの最初の1バイトまでの時間中央値は318ミリ秒から286ミリ秒への低下にとどまりました。キャッシュを温めた後は、最初の1バイトまでの差は2ミリ秒に縮まりました。この結果は、FakeDNSの明確な利点が名前解決とルール判定の段階にあり、コンテンツ転送の段階にはないことを示しています。

42 ms
通常のDNS応答中央値
1.8 ms
FakeDNSローカル応答
32 ms
初回の最初の1バイトまでの差
2 ms
キャッシュウォームアップ後の差

結論:FakeDNSは帯域最適化ではなく、分岐ツールとして使う

ドメインルールが多い場合、上流DNSの遅延が大きい場合、またはネットワーク環境によって解決結果が変わりやすい場合、FakeDNSはより有効です。DNSキャッシュが安定していて、主にIPで分岐する環境では、有効化しても速度差は小さい可能性があります。

設定を一体で確認:DNS、TUN、スニッフィング、ルーティングをすべて連携

FakeDNSが使えるかどうかは単一のスイッチではなく、4つの工程が連続して機能するかで決まります。プロキシコアがDNS問い合わせを受け、アドレスプールで対応関係を作り、TUNがアプリの仮想アドレスへの接続を捕捉し、ルーティングモジュールが復元後のドメインに基づいて出方向を選択する必要があります。DNSオプションだけを有効にして接続を捕捉しないことが、最も一般的な設定ミスです。

  1. コアと動作モードを確認します。デスクトップではv2rayNの「設定」→「パラメータ設定」を開き、現在のコア設定とローカル待受ポートを確認します。通常のアプリを透過的に処理する場合は、TUNモードも有効にします。ローカルSOCKSポートの例は10808です。他のプログラムが使用している場合は、空いているポートへ変更してください。
  2. DNS問い合わせが捕捉されていることを確認します。システムとアプリの53番ポートへの問い合わせがプロキシコアに入る必要があります。ブラウザーが独自に暗号化DNSを使用していると、問い合わせがローカルの対応付けを迂回する場合があります。テスト中は、まずブラウザー独自の名前解決設定を無効にしてください。
  3. FakeDNSアドレスプールを有効にします。IPv4は198.18.0.0/15から割り当てられますが、プール容量をネットワーク帯全体に合わせる必要はありません。通常のデスクトップ利用なら65535件の対応付けで十分です。容量が小さすぎると、古い記録の置き換えが頻繁になります。
  4. 入口でドメインを復元できるようにします。インバウンドのスニッフィングまたはFakeDNSの対象範囲で、仮想アドレスを識別できるようにします。コアのログには、まず対象ドメインが表示され、その後に一致したルーティングルールが表示される必要があります。198.18.x.xだけが表示される状態は避けてください。
  5. ローカルリソースを除外します。ルーターの管理画面、プリンター、開発環境のドメイン、社内検索ドメインはローカルDNSへ渡します。10.0.0.0/8、172.16.0.0/12、192.168.0.0/16などのプライベートアドレスを誤ってプロキシ出方向へ送らないでください。

デスクトップでの確認

クライアント
v2rayN
入口
設定→パラメータ設定
ポート例
10808
捕捉方式
TUN

まずポートが使用中でないことを確認し、コアのログに元のドメインが記録されるか確認します。

Androidでの確認

クライアント
v2rayNG
コア
Xray
確認入口
設定
捕捉範囲
VPN通信

アプリがVPNによる捕捉範囲から除外されていると、仮想アドレスを受け取っても接続を完了できません。

FakeDNSを有効にしないほうがよいケース

FakeDNSは、UDPを使うと必ず失敗するわけではありません。UDP通信がTUNに捕捉され、コアが対象の仮想アドレスからドメインを復元でき、選択した出方向が対応する通信方式をサポートしていれば、通常のDNSや音声、ゲーム通信も正常に動作する可能性があります。本当の問題は、アプリが独自にアドレスを管理したり、実際のIPを検証したり、システムの名前解決やVPNによる捕捉を意図的に迂回したりするケースです。

これらのケースでは、すべてのドメイン分岐をすぐに諦めるのではなく、アプリ単位またはドメイン単位で除外する方法を優先します。デスクトップでは問題のあるプログラムを直接接続にし、ローカルDNSを使わせます。AndroidではVPNによる捕捉範囲を調整できます。問題のアプリがDNS結果を捕捉されていないシステムコンポーネントへ渡す場合は、関連ドメインに通常の名前解決を指定し、実際のアドレスを受け取れるようにします。

有効化後、すべてのWebページが接続タイムアウトになる場合は?

まずFakeDNSを無効にして基準状態を確認し、次にTUNが実際に動作しているか確認します。解決結果が198.18.x.xなのにコアのログに対応する接続記録がない場合、アプリの接続がTUNを迂回しています。

特定のアプリだけネットワークに接続できません。すべて無効にする必要がありますか?

必要ありません。まずそのアプリをFakeDNSの捕捉対象から外すか、アクセス先ドメインに通常のDNSを指定してください。変更後はアプリのキャッシュを消去して接続を再確立し、古い仮想アドレスを使い続けないようにします。

ログに198.18で始まるアドレスしか表示されないのは正常ですか?

名前解決の段階で仮想アドレスが表示されるのは正常です。ただしルーティング段階では、復元されたドメインが表示される必要があります。仮想アドレスしか表示されない場合は、入口のスニッフィング、対象の上書き、またはFakeDNSの対応付けが機能していないことが多いです。

ノードを切り替えたら突然アクセスできなくなりました。何を確認すべきですか?

まずコアを再起動し、アプリにDNSを再問い合わせさせます。続いて、新しいノードが現在のUDPと通信方式の設定に対応しているか確認します。古い接続や対応付けが再利用されている場合、ノードを切り替えるだけではアドレスの対応関係は修復されません。

LAN内の機器名で開けない場合は?

ローカルドメインのサフィックスとプライベートアドレス帯を直接接続ルールへ追加し、これらの問い合わせをルーターのDNSへ渡します。通常は192.168.1.1、または実際のゲートウェイアドレスです。

名前解決結果とコアのログで動作を確認する

FakeDNSのトラブルシューティングでは、「Webページが開くか」だけを確認してはいけません。より確実なのは、名前解決、捕捉、ドメイン復元、出方向の一致を順に検証する方法です。テストには未アクセスのドメインを選び、システムキャッシュに問い合わせ経路を隠されないようにします。そのうえで、コマンド出力とコアのログを同時に確認します。

nslookup example.com
Server:  127.0.0.1
Address: 127.0.0.1

Name:    example.com
Address: 198.18.0.12

上記の198.18.0.12は、ローカルリゾルバーがFakeDNSアドレスを返したことしか示しません。これだけで経路全体が正常だとは判断できません。次にそのドメインを開き、ログで接続がTUNに捕捉され、対象がドメインへ復元され、想定したルールに一致して正しい出方向へ進んだことを確認します。ログに198.18.0.12への接続試行しか表示されない場合は復元段階の失敗です。ログに記録がまったくない場合は、通信がコアへ入っていません。

比較テストも実施できます。同じノードとルーティングルールを維持したままFakeDNSを無効にし、システムのDNSキャッシュを消去して再度アクセスします。通常のDNSが安定してFakeDNSだけがすべて失敗するなら、TUNと対応付けの連携を重点的に確認します。両方とも失敗する場合は、ノード、システムプロキシ、ルーティングルール、上流ネットワークに問題がある可能性が高く、FakeDNSの設定調整を続けるべきではありません。

53
従来のDNSポート
198.18/15
よく使われるIPv4仮想アドレスプール
4つの工程
名前解決、捕捉、復元、分岐

判断基準:解決された仮想アドレスより、ログに表示されるドメインが重要

198.18.x.xが返るのは最初の一歩です。コアがその後に元のドメインを復元し、想定したルーティングに一致して初めて、FakeDNSは実際に機能したといえます。アプリ内蔵のIP検証、仮想アドレスの永続保存、TUNを迂回するUDP通信がある場合は、問題のアプリに通常のDNSを使用させてください。

v2rayN をダウンロード Windows、macOS、Android、Linux向けクライアントを確認