FakeDNSは、透過的に接続を取り込む際に「IPアドレスしか分からず、元のドメイン名が分からない」という問題に対処します。アプリには仮想アドレスを返し、接続がコアに渡った段階で対応表からドメイン名を復元します。この記事では、名前解決、マッピング、接続の取り込み、復元、外向き接続の順に仕組みと前提条件を解説します。TUNやドメイン別ルーティングを設定中の方、198.18帯域への接続失敗を調べている方に向けて、FakeDNSが必要か、問題発生時にどこを確認すべきかをまとめます。
FakeDNSと通常のDNS名前解決の違い
通常のDNSでは、AレコードとAAAAレコードの問い合わせによってIPv4アドレスとIPv6アドレスを取得します。アプリは通常、返されたアドレスに直接接続します。透過プロキシの入口では、元の接続に「宛先IPアドレス+ポート番号」しか残らないことがありますが、ドメインルールにはアプリが最初に問い合わせた名前が必要です。FakeDNSはこの前半部分を変え、実サーバーのアドレスをすぐに返す代わりに、制御された経路内だけで意味を持つ仮想IPを割り当てます。
たとえば、アプリが www.example.com を問い合わせると、FakeDNSは 198.18.0.2 を割り当て、両者の対応関係を保存します。その後、アプリが 198.18.0.2:443 に接続すると、接続を取り込んだコアがマッピングを参照し、宛先を www.example.com:443 に復元できます。このアドレスは仕組みを説明するための例であり、直接アクセスできるテスト用ノードでも、特定のクライアントが最初に割り当てる固定アドレスでもありません。
| 比較項目 | 通常のDNS | FakeDNS |
|---|---|---|
| 返される結果 | ドメイン名に対応する実アドレス | ローカルアドレスプールから割り当てられる仮想アドレス |
| 接続の前提条件 | 選択したネットワーク経由で実アドレスに到達できる | 仮想アドレス宛ての通信が正しく取り込まれる |
| ドメイン名の保持 | 透過プロキシの入口で元のドメイン名を取得できるとは限らない | マッピングテーブルを使って問い合わせ時のドメイン名を復元 |
| 最終的な名前解決 | 通常は接続前に完了 | ローカルからの直接接続時、またはリモートプロキシ側で行われる場合がある |
仮想IPマッピングの全体像
重要なのは「DNSが何を返したか」だけではなく、返された結果と後続の接続を再び結び付けられるかどうかです。DNS応答を返すマッピングテーブルと、宛先接続を処理するコアは、対応する状態を共有するか、この仕組みに対応した統合コンポーネントで連携する必要があります。あるインスタンスが仮想アドレスを割り当てても、マッピングを持たない別のインスタンスに接続が渡れば、後者には直接アクセスできない特殊用途アドレスしか見えません。
- 問い合わせを制御対象のDNSに送る:アプリのAまたはAAAA問い合わせが、設定済みの名前解決経路に入る必要があります。従来のDNSで使われるUDP 53番ポートだけを取り込んでも、アプリ内蔵の暗号化DNSまで制御できるとは限りません。
- マッピングテーブルに登録する:FakeDNSがドメイン名に仮想アドレスを割り当てます。アドレスプールには容量の上限があり、実装によっては容量が逼迫すると古いマッピングを再利用します。割り当て順を安定した仕様として扱わないでください。
- 仮想アドレス宛ての接続を取り込む:TUNや透過プロキシのルールで、復元に対応した入口へ接続を渡します。FakeDNS自体がTUNインターフェースを作成したり、システム全体のルートを自動設定したりするわけではありません。
- マッピングを参照して宛先を復元する:コアが仮想IPからドメイン名を取得し、ドメインルールや後続の外向き接続に利用します。接続先そのものを書き換えるかどうかは、入口のスニッフィングなどの設定にも左右されます。
- 実際のアクセスを完了する:プロキシ経由の場合、ドメイン名を宛先として扱えるプロトコルなら、その名前をリモート側に渡せます。直接接続の場合は通常、接続可能なアドレスを取得するために実DNSでの名前解決が必要です。
つまりFakeDNSは「DNSが不要になる」仕組みではありません。実際の名前解決を後回しにし、ドメイン名との関連付けを保持します。また、VMessやVLESSなどのプロキシプロトコルを置き換えるものでも、ノードの認証情報を書き換えるものでもありません。サーバーへの接続不能、誤った通信経路、TLS設定の不一致を解決することもできません。
設定項目:アドレスプール、DNS、入口での復元
「V2Ray FakeDNS」はこの種の仕組みを指す総称として使われることがありますが、V2RayとXrayでは設定できる機能や項目、クライアントとの連携方法を個別に確認する必要があります。以下は該当項目に対応したXray-coreのJSON設定例です。明示的に指定した値を示しており、すべてのバージョンでの初期値を示すものではありません。v2rayN、v2rayNG、v2flyNGでは画面や設定の生成方法が異なるため、別のコア向けの設定をそのまま流用しないでください。
DNSとアドレスプール
- プールの項目
fakedns- ネットワーク範囲の例
198.18.0.0/15- 容量の例
poolSize: 65535- DNSサーバーの項目
"fakedns"
明示的なパラメーター指定の例です。アドレスプールの容量は、ネットワーク範囲内にある全アドレス数と同じではありません。
接続を受け付ける入口
- スニッフィングを有効化
enabled: true- 復元する情報の種類
destOverride: ["fakedns"]- ルーティングにのみ使用
routeOnly: false- 前提条件
- 仮想アドレス宛ての接続が実際にこの入口へ届くこと
ここでは接続先の復元が必要な設定の組み合わせを示しています。オプション名だけを見て、接続が正しく取り込まれたと判断しないでください。
以下はルートオブジェクト内のDNSとアドレスプールの設定例です。単独で動作する完全な設定ではありません。待受入口、外向き接続、システムルートは定義されておらず、IPv4プールのみを示しています。この例から、AAAA問い合わせも同じ方法で処理されるとは判断できません。実際の環境では、使用中のコアのドキュメントを確認し、IPv6の動作と実DNSへのフォールバック経路を設定してください。
{
"fakedns": [
{
"ipPool": "198.18.0.0/15",
"poolSize": 65535
}
],
"dns": {
"servers": [
"fakedns"
]
}
}
仮想アドレス宛ての接続を受け付けるインバウンドにも、復元の設定が必要です。以下では、そのインバウンド内の sniffing 項目だけを示しています。他のインバウンド設定は自動で補われません。routeOnly は通常、スニッフィング結果をルーティングにのみ使い、宛先は書き換えないことを意味します。この例では、復元前の仮想宛先をそのまま外向き接続に渡さないよう、false を明示しています。
{
"sniffing": {
"enabled": true,
"destOverride": [
"fakedns"
],
"routeOnly": false
}
}
利用に適した場面と適さない場面
FakeDNSが特に役立つのは、TUNや透過プロキシを使い、ドメイン名に基づいて通信を振り分ける環境です。ネットワーク層で接続を受け取る透過プロキシの入口では、接続情報だけからドメイン名を取得できるとは限りません。マッピングテーブルを使えば、HTTP HostやTLSハンドシェイクの情報だけに頼らず、ドメインルールを適用できます。実際の名前解決をプロキシの出口側で行いたい場合にも利用できますが、実現できるかどうかは外向き接続、ルーティング、実DNSの組み合わせによります。
| 利用環境 | 選択の目安 | 確認事項 |
|---|---|---|
| TUNで接続を取り込み、ドメイン名で振り分ける | 有効化を検討 | 問い合わせと接続が同じマッピング経路に入ること |
| 明示的プロキシにドメイン名を渡している | 通常は追加設定不要 | アプリがHTTPまたはSOCKSプロキシにドメイン名を渡しているか |
| 社内ネットワークやローカルドメイン | 例外の名前解決を優先して設定 | 社内DNS、直接接続経路、アドレス範囲が競合していないか |
| アプリが実際の名前解決アドレスを確認する | まず互換性を検証 | アプリが特殊用途アドレスを拒否するか、IPアドレスで接続先の場所を判定するか |
| アプリが固定IPアドレスに直接接続する | FakeDNSではドメイン名を復元できない | DNS問い合わせがなければ、対応するドメインマッピングも作成されない |
明示的プロキシと透過プロキシは分けて考えてください。ドメイン名を宛先に指定できるSOCKSリクエストやHTTP CONNECTリクエストなら、ドメイン名を直接渡せるためFakeDNSが不要な場合があります。一方、アプリがローカルで名前解決してからIPアドレスをプロキシに渡すと、ドメイン名が失われることがあります。必要性は実際のリクエスト形式で判断し、「システムプロキシ」という表示だけで決めないでください。
結論:まずドメイン名が入口に届いているか確認
ログで対象の接続を確認してください。入口に正しいドメイン名が届いていれば、まず現在の名前解決方式を維持します。宛先IPしか記録されず、ドメインルールが必要な場合は、FakeDNSによる接続の取り込みと復元を検証してください。問題がないのに状態管理を増やすのは避けましょう。
よくある副作用:キャッシュ、社内ネットワーク、DNSの迂回
FakeDNSは有効期間のあるローカルマッピングテーブルを使いますが、アプリやシステムには古いDNS応答が残ることがあります。コアの再起動後にマッピングが消えているのに、アプリが古い仮想IPで接続しようとすると、「最初は使えるのに、モード切り替え後に接続できない」といった症状が起きます。この場合、外向き接続を選ぶ前に問題が起きているため、ノードを何度も切り替えても通常は解決しません。
- モード切り替え後に接続できない:FakeDNSを無効にしたりTUNを終了したりした後も、キャッシュ内の仮想アドレスが使われる場合があります。まず接続を取り込むモードを正しい状態に戻し、キャッシュを消去して関連アプリを再起動してください。
- LAN内サービスに接続できない:社内ドメインは、社内DNSから内部アドレスを返す必要がある場合があります。すべての問い合わせを一律に仮想プールへ送るのではなく、該当ドメインには実DNSを使う経路と直接接続のルールを明示してください。
- アプリが独自に名前解決する:アプリ内蔵のDoH、DoT、または独自の名前解決結果を使う場合、従来のDNSを取り込んでも問い合わせを検出できないことがあります。その場合、仮想マッピングがないのは想定どおりであり、アドレスプールの故障を意味しません。
- IPv4とIPv6の動作が異なる:A問い合わせは仮想プール、AAAA問い合わせは別の経路に進むと、同じアプリでも動作が不安定になることがあります。各レコード、IPv6ルート、対応するアドレスプールを個別に確認してください。
- 診断ツールの結果が変わる:名前解決ツールに198.18帯域のアドレスが表示されても、ドメイン名の実際の接続先がそこだという意味ではありません。仮想IPへの疎通テストだけでは、リモートのWebサイトが稼働しているか判断できません。
FakeDNSを使えば自動的に「DNS漏えいがなくなる」わけではありません。ローカルから直接接続すると実DNSによる名前解決が発生することがありますし、アプリが制御対象のDNSを迂回する場合もあります。名前解決経路を確認するには、問い合わせ先と接続に使われた外向き経路をそれぞれ調べてください。仮想アドレスが一度返されたことだけで判断しないようにしましょう。
仮想IPへの接続失敗を順番に調べる
まずドメイン名、アプリ、ノードをそれぞれ1つに絞り、切り替え前後の状態を記録してください。以下では www.example.com を問い合わせ例として使います。コマンドは現在の端末で使われる名前解決経路を確認するもので、問い合わせが必ずFakeDNSに届くとは限りません。また、Windows、macOS、Linuxの名前解決ツールとブラウザーでは、異なる経路が使われる場合があります。
nslookup -type=A www.example.com
nslookup -type=AAAA www.example.com
- まず名前解決が仮想プールに入ったか確認:Aレコードの結果が設定したプール内のアドレスなら、その問い合わせには仮想アドレスが返されています。実IPアドレスが返る場合は、問い合わせが制御対象のDNSを迂回していないか、対象ドメインが実DNSを使う例外設定に一致していないかを確認してください。
- 次に接続がコアに届いたか確認:アプリが接続を開始した際のアクセスログを確認します。名前解決で仮想アドレスが返されたのに、コアに対応する接続記録がない場合は、ノードのVMessやVLESSの設定を変える前にTUNルートと入口の取り込みを確認してください。
- マッピングから復元できるか確認:ログに仮想IPしか表示されない場合は、接続を受け付けるインバウンドで対応する復元設定が有効か、コアの再起動、アドレスプールの変更、複数インスタンスへの切り替えが発生していないかを確認してください。ログの表示形式はバージョンによって異なるため、1行だけで失敗と断定しないでください。
- 最後にルーティングと外向き接続を確認:ドメイン名を復元できても接続に失敗する場合は、そのドメインに適用される外向き接続を確認してください。直接接続には利用可能な実DNSの名前解決経路が必要です。プロキシ経由の場合は、ノードへの接続、サーバー側の名前解決、通信設定を確認してください。
Windowsでは以下のコマンドでシステムのDNSキャッシュを消去できますが、アプリ内のキャッシュをすべて削除できるわけではありません。実行する前に、接続を取り込むモードが正しく設定されていることを確認してください。そうしないと、アプリは再び利用できない結果を取得します。ブラウザーやバックグラウンドで常駐するプログラムの問題が続く場合は、関連プロセスを終了してから再度試してください。
ipconfig /flushdns
名前解決結果が198.18で始まります。ドメイン名が書き換えられたのでしょうか?
まず、そのアドレスが現在設定している仮想プールに含まれるか確認してください。含まれている場合は、アプリの接続がTUNに取り込まれ、ドメイン名が復元されるかを確認します。仮想アドレスをhostsファイルに手動で登録したり、Webサイトの恒久的な実アドレスとして扱ったりしないでください。
FakeDNSを有効にしたら社内サイトにアクセスできなくなりました。どうすればよいですか?
まず、通常のネットワーク環境で社内ドメインが返していた実アドレスを記録します。次に、社内DNSと直接接続ルールを使うよう社内ドメインを設定してください。社内ネットワークと仮想プールの範囲が重複していないことを確認し、再度名前解決してから関連アプリを再起動し、接続を試します。
クライアントの再起動後、一部のアプリだけ接続できません。どうすればよいですか?
まず、古い仮想アドレスがアプリのキャッシュに残っている可能性を確認してください。接続を取り込むモードを元の状態に戻し、システムのDNSキャッシュを消去して、影響を受けるアプリを再起動します。それでも解決しない場合は、問い合わせと接続が同じコアインスタンスで処理されているかを比較してください。
有効にすると必ず速くなりますか?
必ず速くなるわけではありません。実際の名前解決を待つ工程が接続前からなくなる場合はありますが、最終的なアクセス速度は外向き接続側の名前解決、接続の確立、ネットワーク品質にも左右されます。同じドメイン名、ノード、接続の取り込み方式で比較し、まずルールが正しいことを確認してから使い続けるか判断してください。