この記事の概要

v2rayNでノードに接続でき、DNSの振り分けを見直したい方を対象に、V2RayカーネルのJSONを例に解説します。アプリによる名前解決、内蔵DNS、プロキシのアウトバウンドを区別し、中国本土のドメインを優先してローカルDNSで解決し、それ以外をDoHで処理する設定例と、フォールバック・ルーティング・名前解決結果の確認方法を紹介します。コードはクライアント設定全体ではなく、他のカーネルのDNS設定画面にもそのまま適用できません。

1. まずDNSリクエストの処理元を確認

DNS設定が反映されない原因は、DNSサーバーのアドレス間違いとは限りません。問い合わせが想定したリゾルバーに届いていないケースもあります。Windowsのシステムリゾルバー、ブラウザーのセキュアDNS、V2Rayの内蔵DNS、プロキシサーバーが稼働するマシンのリゾルバーは、それぞれ別の処理段階です。いずれか一つを変更しても、ほかの処理まで変わるわけではありません。

アプリがドメインを送信 インバウンドで受信 ルーティング判定 必要に応じて名前解決 アウトバウンド接続

上記は一般的な処理の流れであり、すべての接続で内蔵DNSが使われるわけではありません。たとえば、ブラウザーがHTTPプロキシにドメイン名を送る場合、プロキシのアウトバウンド側で名前解決されることがあります。一方、アプリがローカルで名前解決してからIPアドレスをプロキシに渡すと、カーネルに届くのはIPアドレスだけかもしれません。「システムプロキシ → システムプロキシを自動設定」を有効にしても、WindowsのすべてのDNSリクエストが転送されるわけではありません。

2. servers・domains・expectIPsの役割

serversは使用する上流リゾルバーを定義します。サーバーオブジェクト内のdomainsは指定ドメインの優先問い合わせ先を設定し、expectIPsはそのサーバーが返すアドレスの想定範囲を指定します。それぞれ「どこに問い合わせるか」「どのドメインを優先して問い合わせるか」「どの結果を許容するか」を制御します。いずれもトラフィックのルーティングルールではありません。

フィールド例役割と注意点
servers223.5.5.5、DoH URL名前解決の上流を設定します。Webサイトへの接続がどのアウトバウンドを通るかは決まりません。
domainsgeosite:cn一致した場合はこのサーバーを優先します。対応するドメインルールデータが必要です。
expectIPsgeoip:cn返されたアドレスが想定範囲に含まれるか確認します。信頼性の証明ではなく、あらゆる汚染を遮断する機能でもありません。
skipFallbacktrueドメインルールに一致しない場合の共通フォールバックには使われません。一致するドメインの名前解決には引き続き利用できます。
queryStrategyUseIPv4内蔵DNSのアドレスファミリーを制御します。OSのIPv6を無効にする設定ではありません。

domainsは排他的なアクセス制御ではありません。一致したサーバーへの問い合わせが失敗したり、結果がexpectIPsを満たさなかったりすると、その後のフォールバック処理に進む場合があります。中国本土向けリゾルバーを指定ドメインだけに使うには、skipFallback: trueを設定し、ドメインを限定しないリモートリゾルバーをデフォルト候補として残してください。

結論:まずローカルDNSを使うドメインを限定

中国本土向けリゾルバーは、リストの先頭に置くだけでなく、domainsとskipFallbackを設定したサーバーオブジェクトに入れると、適用範囲が明確になります。そうしないと、フォールバック時に本来リモートリゾルバーへ送るつもりだった問い合わせまで受け取る可能性があります。

3. DNS振り分け例:中国本土のドメインはローカル優先、その他はDoH

中国本土のドメイン向けの優先リゾルバーに223.5.5.5、デフォルトのDoH上流にhttps://1.1.1.1/dns-queryを使います。ここでいう「ローカルDNS」は、PCから指定したリゾルバーへ直接接続することを指し、ルーターや通信事業者から自動設定されたDNSを使う意味ではありません。アドレスは設定例です。利用できるか、結果が適切かは実際のネットワークで確認してください。

{
  "dns": {
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      {
        "address": "https://1.1.1.1/dns-query"
      }
    ]
  }
}

中国本土のドメインを優先して名前解決

上流アドレス
223.5.5.5
通信ポート
UDP 53
対象ドメイン
geosite:cn
結果の想定範囲
geoip:cn

skipFallbackをtrueに設定し、ほかのドメイン向けの共通フォールバックに使われないようにします。

デフォルトのDoH名前解決

上流アドレス
https://1.1.1.1/dns-query
通信ポート
HTTPS 443
対象ドメイン
対象ドメインを限定せず、デフォルト候補として使用
アウトバウンドの要件
ルーティングでプロキシのアウトバウンドを明示

DoH URLを設定したら、そのアドレスへの接続が実際にどのアウトバウンドを通るかも確認してください。

geosite:cnに一致する場合は中国本土向けリゾルバーを優先し、一致しない場合はドメイン制限のないDoH候補を使います。中国本土向けリゾルバーの結果がアドレスの想定範囲を満たさない場合、後続の候補に切り替わることもあります。ドメイン制限のないlocalhostを安易に追加すると、システムリゾルバーがフォールバック経路に戻り、設定したい境界が崩れるので注意してください。

expectIPs: ["geoip:cn"]は比較的厳しい設定です。中国本土のWebサイトでも海外CDNを利用している場合があり、正当な結果が拒否されて問い合わせに時間がかかることがあります。その場合は、対象ドメインと返されたIPアドレスを確認し、ドメインの分類やサーバーの想定範囲を調整してください。「海外IPだから汚染」と即断しないようにしましょう。

4. DoHをプロキシ経由にするにはルーティングルールも必要

DoHはリゾルバーまでの通信を暗号化しますが、リクエストが自動的にプロキシを経由するとは限りません。V2Rayでは通常のhttps://形式のDoHリクエストはルーティングの対象にできますが、https+local://形式のローカルモードは同じ方法でルーティングされません。リモートDoHにノードのアウトバウンドを使う場合、この2つの形式を混同しないでください。

以下は既存の設定に追加するための断片です。outboundsに、タグがdirectの直接接続アウトバウンドと、タグがproxyの利用可能なプロキシアウトバウンドがすでにあることが前提です。実際のタグが異なる場合は、設定に合わせて変更してください。この2つの上流アドレス向けルールは、先に一致する可能性がある広範囲なルールより前に配置します。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": [
          "223.5.5.5/32"
        ],
        "port": "53",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "1.1.1.1/32"
        ],
        "port": "443",
        "outboundTag": "proxy"
      }
    ]
  }
}

デフォルトでは、どのルールにも一致しない接続はデフォルトのアウトバウンドを通ります。通常はアウトバウンドの並び順が影響します。DoHのアウトバウンド確認を省略して、結果が返っただけで「プロキシ経由で名前解決できた」と判断しないでください。また、ノードサーバーにドメイン名を使う場合は、その名前を解決するための独立したブートストラップ経路が必要です。ノードに接続するためにノードのアドレス解決が必要になる循環依存を避けてください。

5. v2rayNで設定を適用する前に、元に戻せる状態を残す

v2rayNは設定を管理するクライアントであり、DNSプロトコルそのものではありません。クライアント画面で保存した設定は、最終的にカーネルの実行設定へ変換されます。一時生成ファイルを直接編集すると、ノードの切り替えやカーネルの再起動で上書きされることがあります。また、V2RayのJSONを別のカーネル用設定欄に入力すると、起動に失敗する場合があります。

  1. 現在の状態を記録する。現在のDNS設定、使用中のノード、ルーティングモードを保存します。設定を変更する前に、元の状態でよく使うWebサイトを開けることを確認してください。
  2. 設定画面を確認する。「設定 → DNS設定」で、使用中のカーネルに対応する設定欄を選びます。そのバージョンにDNS JSON全体の編集欄がある場合は、要求されているDNSオブジェクトの階層だけを入力してください。設定ファイル全体を貼り付けないでください。
  3. 完全な設定は別途管理する。ルーティングやアウトバウンドを自分で管理する場合は、「サーバー → カスタム設定サーバーを追加」から、カーネル設定全体を読み込みます。この記事の2つの断片にはインバウンドやプロキシアウトバウンドなどが含まれていないため、完全な設定としてそのまま実行することはできません。
  4. カーネルを再起動してログを確認する。ネットワークテストの前に、JSONの構文、ルールデータ、アウトバウンドタグのエラーを確認してください。保存できても、正常に動作するとは限りません。
  5. 機能を一つずつ追加する。まずデフォルトのDoHを確認し、次に中国本土のドメイン向けの優先名前解決を追加します。最後にTUNやブラウザー独自のDNS設定を確認してください。一度に変更する範囲を一つに絞ると、問題の切り分けが容易です。
53
中国本土向け上流の設定例で使うUDPポート
443
DoHの設定例で使うHTTPSポート
10808
ローカル混合リスニングでよく使われるポート。実際の値は画面で確認してください。

ローカル混合リスニングポートはDNSポートではありません。アプリのHTTPまたはSOCKSプロキシをこのポートに向ける操作と、DNSサーバーとしてこのポートを指定する操作は、まったく別のものです。「設定 → パラメーター設定」で「ローカル混合リスニングポート」の実際の値を確認し、例にある53、443、10808を相互に置き換えないでください。

6. DNS振り分けと汚染対策を検証する:問い合わせ・アウトバウンド・結果を個別に確認

検証で目指すのは「常に正しい」IPアドレスを探すことではありません。問い合わせが想定した上流に送られ、接続が想定したアウトバウンドを通り、返されたアドレスがWebサイトの実際の配信環境に合っているかを確認します。CDNの応答はリゾルバーの場所、ノードの出口、時間によって変わります。2つのリゾルバーが異なる結果を返しただけでは、DNS汚染の証拠になりません。

確認項目確認方法ここからは判断できないこと
システムDNSの基準確認nslookup www.baidu.com 223.5.5.5を実行し、応答内容とエラーを記録します。V2Rayの内蔵DNSがこの上流を使った証明にはなりません。
プロキシの接続確認プロキシを明示してHTTPSサイトへリクエストし、ノードに接続できることを確認します。Webページが開けても、すべてのアプリのDNSが取り込まれているとは限りません。
上流へのアウトバウンドカーネルのデバッグログとルーティング記録を確認し、1.1.1.1:443への接続がどのアウトバウンドを通るか調べます。暗号化された接続が見えても、具体的な問い合わせ内容を読み取ったり、証明したりすることはできません。
ドメイン振り分け中国本土向けルールに一致するドメインと一致しないドメインをそれぞれテストし、選択された上流を記録します。一つのドメインで成功しても、ドメインルール全体が正しく読み込まれたとは限りません。
nslookup www.baidu.com 223.5.5.5
ipconfig /flushdns
curl.exe --proxy http://127.0.0.1:10808 --head https://www.microsoft.com/

上記のコマンドはそれぞれ独立した確認です。1つ目は指定したリゾルバーへの問い合わせ、2つ目はWindowsのDNSキャッシュの消去、3つ目はローカルHTTPプロキシ経由の接続を確認します。3つ目を実行する前に、ポートを画面に表示されている実際の値に変更してください。内蔵DNSを自動検証するスクリプトではありません。特に、nslookupの結果だけで「DoHの振り分けが有効になった」と判断しないでください。

システムのキャッシュを消去しても、ブラウザーやカーネルのキャッシュがすべて消えるわけではありません。再テストする際は、カーネルを再起動してテスト対象のアプリも再起動してください。ログレベルを一時的に上げた場合は、確認後に通常のレベルへ戻します。デバッグログにはアクセス先のドメインが含まれることがあるため、ログ全体を公開アップロードしないでください。

結論:DoHは通信経路の露出を抑えるが、名前解決のリスクすべてを解消するものではない

上流への接続、TLS検証、アウトバウンド、アプリの問い合わせ経路をすべて確認して初めて、設定が目的を満たしているか評価できます。確認ページに表示されたリゾルバー名だけでは不十分です。

7. DNS振り分けでよくある質問

DoHアドレスを設定したのにタイムアウトするのはなぜ?

まずノードからHTTPSへ接続できるか確認し、次にDoHアドレスへのルーティングを確認します。設定例では1.1.1.1:443を利用可能なプロキシアウトバウンドに送ります。システム時刻とTLSエラーも確認してください。DoHにドメイン形式のアドレスを使う場合は、上流ドメインを解決するためのブートストラップ処理も調べます。

expectIPsを追加したら、中国本土のWebサイトがかえって遅くなったのはなぜ?

対象ドメインが返す実際のIPアドレスが海外CDNに属していないか確認してください。結果がgeoip:cnに一致しないと、拒否されたり、後続のフォールバックに進んだりします。まず対象ドメインの分類や想定範囲を調整し、誤った分類を解決するためにリゾルバーを次々と追加するのは避けてください。

UseIPv4を設定したのに、システムでIPv6も取得できるのはなぜ?

UseIPv4が制御するのは現在使用中の内蔵DNSであり、Windows全体の設定ではありません。テスト元がブラウザー独自のDoH、システムリゾルバー、または別のアプリではないか確認してください。名前解決を一元管理するには、まずアプリを同じ管理対象の経路に通してから、アドレスファミリーの設定を確認します。

TUNを有効にした場合もDNS設定を確認する必要がありますか?

必要です。TUNはトラフィックを取り込む範囲を広げますが、上流の選択やアウトバウンド経路が正しくなるとは限りません。実際に動作しているカーネルを確認し、DNSの取り込み、LAN内の名前解決、リモート上流へのルーティングを見直してください。カーネルを変更した場合は、対応する設定形式で改めて検証します。

すべてのドメインをリモートDoHに任せたほうが簡単ですか?

設定は簡単になりますが、中国本土のサイトではCDNの振り分けがローカル接続に適さない場合があり、LAN内のドメインも解決できなくなることがあります。必要なローカルドメインの設定を残したうえで、一般のインターネット向けドメインをリモート上流に統一するか判断してください。内部ドメインを無関係なパブリックDNSサービスに送らないようにしましょう。