この記事の概要

ノードへの接続はできており、Xray DNSを調整したいv2rayN・v2rayNGユーザー向けの記事です。「中国国内ドメインは指定した国内DNS、それ以外はプロキシ経由のDoHで名前解決する」設定を分解し、内蔵DNSが使われる条件やフォールバックの範囲、確認手順を説明します。掲載するのは既存設定に追加するための抜粋で、接続可能なノード情報は含みません。

1. 内蔵DNSの処理範囲:名前解決と通信を分けて考える

Xrayのdnsオブジェクトは、コアにドメイン名の名前解決機能を提供します。OSのDNS通信をすべて処理する設定ではありません。アプリがシステムのリゾルバーでIPアドレスを取得してからプロキシへ渡す場合もあれば、ドメイン名をプロキシプロトコルに渡し、ローカルのコアまたはリモートサーバーで処理する場合もあります。経路が異なれば、ログや検出結果も変わります。

ドメイン名をコアへ渡す内蔵DNSを起動リゾルバーを選択問い合わせを送信アドレスを返す

dns.serversが使われるのは、内蔵DNSによる名前解決が必要な場合だけです。たとえば、ルーティングポリシーでドメイン名をIPアドレスに変換してから照合する場合や、direct出力でIPアドレスへの接続を指定している場合は、コアの名前解決機能が使われます。一方、proxy出力が宛先ドメイン名をリモート側で処理する設定なら、ローカルDNSのログにそのドメイン名が記録されなくても異常とは限りません。

2. 主な設定項目:servers、domains、フォールバック

serversには、通常のDNSアドレスとDoHアドレスを同時に設定できます。サーバーをオブジェクト形式で指定すると、ドメイン名との照合やフォールバック動作も設定できます。ここでいう「ローカルDNS」は、現在のネットワークから指定した中国国内のリゾルバーへ直接問い合わせることです。localhostを指すものでも、ルーターが提供するDNSを自動的に読み込むものでもありません。

中国国内ドメイン向けリゾルバー

address
223.5.5.5
port
53
domains
geosite:cn
skipFallback
true

一致したドメインのみを処理し、他のドメインの一般フォールバックには使いません。

その他のドメイン向けリゾルバー

address
https://1.1.1.1/dns-query
通信ポート
443
queryStrategy
UseIPv4。全体設定を継承
問い合わせの出力先
proxy。ルーティングルールで指定

通常のHTTPS DoHアドレスを使い、後述のルールでproxy出力へ振り分けます。

項目この記事の設定値実際の意味
domains["geosite:cn"]このリゾルバーが優先的に照合するドメインの範囲を指定します。通信の出力先を決めるルールではありません。
queryStrategyUseIPv4内蔵DNSの問い合わせをIPv4に限定し、まずIPv6の接続性を切り分けます。
skipFallback中国国内向けの項目はtrue一致しなかったドメインに使う一般フォールバックのサーバー一覧には、この項目を含めません。
disableFallbackIfMatchtrueドメインがサーバーの照合ルールに一致した場合、一般フォールバックサーバーには切り替えません。
tagdns-internal内蔵DNSが生成する問い合わせ通信にルーティングタグを付け、inboundTagで照合できるようにします。

UseIPはIPv4とIPv6の両方を問い合わせ、UseIPv6はIPv6のみを問い合わせます。ここではトラブルシューティングの基準としてUseIPv4を選んでいますが、すべてのネットワークでIPv6を無効にすべきという意味ではありません。ノードの出口、システムのルーティング、直接接続のすべてがIPv6に対応していることを確認してから設定を変更し、再度検証してください。

geosite:cnは使用しているドメインデータファイルに基づくもので、ドメインの所属地域をリアルタイムで判定するものではありません。データの更新状況や収録範囲によって照合結果は変わります。geoip:cnはIPアドレスの集合であり、DNS設定におけるドメイン分類の代わりにはなりません。

3. DNS設定例:中国国内のドメインは個別処理、それ以外はDoHへフォールバック

以下のJSONにはトップレベルのdnsオブジェクトが含まれます。同名のオブジェクトがすでにある場合は内容を統合し、同じ設定内にdnsキーを重複して追加しないでください。例ではIPアドレス形式のDoHアドレスを使い、リゾルバーへの接続に先立ってそのドメイン名を解決する事態を避けています。このアドレスにも通常どおりHTTPS証明書の検証が必要です。

{
  "dns": {
    "tag": "dns-internal",
    "queryStrategy": "UseIPv4",
    "disableFallbackIfMatch": true,
    "servers": [
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn"
        ],
        "skipFallback": true
      },
      {
        "address": "https://1.1.1.1/dns-query"
      }
    ]
  }
}
  1. 中国国内のドメインに一致:223.5.5.5:53を使います。この問い合わせに失敗しても、現在の設定では一般のDoH項目へフォールバックしません。これにより名前解決の範囲を明確に保てます。
  2. ドメインに一致しない場合:skipFallback: trueにより中国国内向けの項目を除外し、DoH項目で問い合わせます。
  3. 中国国内のリゾルバーに接続できない場合:まず、現在のネットワークでUDP 53が制限されていないか確認してください。冗長化が必要なら、同じdomainsを設定した中国国内向けリゾルバーを追加し、通信ルーティングも合わせて設定します。
  4. 社内ドメイン:企業内のドメインには、通常、社内DNSが必要です。実際に使われている社内ドメインのサフィックスに専用ルールを設定し、公共のリゾルバーへそのまま送信しないでください。

4. ルーティング設定:DoHを確実にプロキシ経由にする

DoHは問い合わせをHTTPSで送る方式を示すだけで、接続が必ずプロキシ経由になるとは限りません。以下は、前述のDNSオブジェクトと組み合わせるルーティング例です。既存設定にproxyとdirectという名前の出力があることを前提としています。クライアントがノード設定を自動生成する場合、実際のタグ名は異なることがあります。実行中の設定を確認してから、参照先をまとめて置き換えてください。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["dns-internal"],
        "ip": ["223.5.5.5"],
        "port": "53",
        "network": "udp",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": ["dns-internal"],
        "ip": ["1.1.1.1"],
        "port": "443",
        "network": "tcp",
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

先頭の2つのルールはdns-internalタグが付いた問い合わせ接続のみを照合するため、一般ルールより前に置く必要があります。3つ目は中国国内ドメインへの通信、4つ目はプライベートIPアドレスを宛先とする通信を処理し、最後のルールがそれ以外を受け持ちます。AsIsはIPアドレスによるルーティング照合のためにドメイン名を積極的に解決しません。この例では「IPアドレスによるルーティング判定」と「DNSの振り分け」を混同しない構成にしています。

中国国内ドメインへの直接接続で前述の内蔵DNSを使うには、既存のdirect出力の該当部分を次のように設定します。同名の出力を新たに追加せず、既存のオブジェクトを編集して必要な他の設定を残してください。

{
  "tag": "direct",
  "protocol": "freedom",
  "settings": {
    "domainStrategy": "UseIP"
  }
}

確認のポイント:まずDNS接続の出力先を確かめ、その後に名前解決の結果を見る

ログにDoHアドレスが表示されても、そのリゾルバーが選択されたことしか確認できません。1.1.1.1:443宛ての問い合わせ接続がproxyに一致していることも確認してください。directに流れている場合は、汚染の調査に進む前にルールの順序とタグを修正します。

5. クライアントへの設定と検証:実行中の設定を確認してから問い合わせを調べる

v2rayNは異なるコアの設定を生成できますが、この記事の項目はXray専用です。v2rayNGはXrayを使用しますが、画面上の設定によってDNS項目の一部が生成または上書きされる場合があります。v2flyNGはV2Flyを使用するため、項目名が似ているだけでこの記事の設定をそのまま適用しないでください。設定画面の場所はクライアントのバージョンによって異なります。検証時は、起動後の実際の設定とログを確認してください。

53
例で使用する中国国内DNSのUDPポート
443
例で使用するDoHのHTTPSポート
2
確認が必要な出力タグ
  1. バックアップ:現在接続できる設定とルーティング設定を保存し、使用中のノード、選択中のコア、システムプロキシまたはVPNの状態を記録します。
  2. 統合:現在のクライアントに用意されているDNS編集機能またはカスタム設定画面から設定を追加します。DNSオブジェクトの中身だけを入力する仕様の場合、外側の{"dns": ...}まで貼り付けないでください。
  3. 確認:実行中の設定にdns-internal、DNS通信に関する2つのルール、正しい出力タグが残っていることを確認します。コアを再起動し、未知の項目、データファイルの不足、存在しない出力に関するエラーがないか確認してください。
  4. グループ別テスト:現在のgeosite:cnに含まれることを確認したドメインを1つと、一致しないドメインを1つ選びます。関連キャッシュを消去するか、未使用のテスト用ドメインを使って、実際の問い合わせ接続を確認してください。
  5. アプリごとの再確認:ブラウザーのセキュアDNS、AndroidのプライベートDNS、アプリの除外リストをそれぞれ確認してください。ブラウザー自身が送るDoHリクエストを、内蔵DNSの問い合わせと取り違えないようにしましょう。

Windowsでは必要に応じて、以下のコマンドでシステムのDNSキャッシュを消去できます。この操作ではブラウザー独自のキャッシュ、リモートサーバーのキャッシュ、コア自身のキャッシュは消去されません。そのため、実行後に新しい問い合わせログがなくても、設定が無効だとは判断できません。

ipconfig /flushdns

nslookup example.com 223.5.5.5は、システムから指定したリゾルバーへの経路をテストするだけで、Xrayの内蔵DNSを自動的に使うものではありません。同様に、ブラウザーでWebサイトが開けても確認できるのは通信経路が使えることだけで、DNSの振り分けが正しいとは限りません。検証では、ドメイン名がコアに渡されているか、どのサーバーへ問い合わせているか、どの出力を使っているかを合わせて確認します。

6. DNS汚染と漏えいへの対処:問題のある処理層を切り分ける

DNS汚染では、誤ったアドレスや不自然なアドレスが返る、あるいは名前解決に失敗するといった症状が見られます。ただし、1回の結果が異なるだけで汚染とは限りません。コンテンツ配信ネットワークは、再帰リゾルバーの所在地、通信事業者、ネットワーク状況に応じて異なるアドレスを返すことがあります。接続エラーや証明書の異常、複数回の問い合わせ結果を合わせて判断し、「2つのDNSの返答が違う」という理由だけで結論を出さないでください。

症状まず確認すること対処の方向性
中国国内ドメインの名前解決がタイムアウトする中国国内向けの項目に一致しているか、UDP 53に到達できるか現在のネットワーク制限を確認し、同じドメイン範囲に対応する予備のリゾルバーを追加します。
DoH接続がタイムアウトするproxyタグ、ルールの順序、ノード自体の接続状態まずプロキシ経路を復旧し、通常のTLS検証は維持してください。
Webページは開くが、ローカルの問い合わせログがないドメイン名がプロキシ経由でリモート側に解決されていないか、キャッシュが残っていないかドメイン名がどの経路を通るか追跡し、すべての接続でローカル問い合わせが発生する必要はありません。
検査結果に想定外のリゾルバーが表示されるブラウザーのセキュアDNS、システムのプライベートDNS、アプリによる迂回経路を一つずつ同じ条件でテストし、実際に使われたリゾルバーを確認します。
デュアルスタックに変更した後、一部のサイトの表示が遅くなるIPv6の直接接続、ノードの出口、ルーティングルールの適用範囲一時的にUseIPv4へ戻して比較し、IPv6経路を確認してから再度有効にします。

DNS漏えいかどうかは、想定している方針によって判断が異なります。この記事では中国国内ドメインに直接接続のリゾルバーを使うため、その問い合わせが観測されても設定の失敗とは限りません。確認すべきなのは、本来プロキシ経由にする問い合わせがローカルから直接送信されていないか、接管対象外のアプリが設定を迂回していないかです。

7. よくある質問:設定を変更したのに結果が変わらないのはなぜ?

queryStrategyを変更するだけで、アプリがIPv6を使わないようにできますか?

できません。UseIPv4が制限するのは、この内蔵DNSによる問い合わせだけです。システムのIPv6を無効にする機能はなく、アプリが独自にAAAAレコードを問い合わせることも防げません。まずアプリのリクエストがどの名前解決経路に入っているかを確認し、その後VPNなどが通信を取り込む範囲を調べてください。

リモートDNSを設定したのに、ログにdirectと表示されるのはなぜですか?

リモートアドレスを設定しても、プロキシ出力が選ばれるとは限りません。dns.tagがルール内のinboundTagと一致しているか、1.1.1.1:443宛てのルールが最終ルールより前にあるか、実際のプロキシ出力名がproxyかを確認してください。

中国国内DNSに失敗したとき、DoHへ自動で切り替わらないのはなぜですか?

この記事ではdisableFallbackIfMatchを有効にしているため、ドメインルールに一致すると一般フォールバックへ進みません。冗長化する場合は、同じドメイン照合条件を設定した予備の項目を追加してください。グループをまたぐフォールバックを許可する設定に変更する場合は、ドメイン情報の送信範囲を再検証してください。

サブスクリプションを更新するとDNS設定が元に戻る場合は?

まず、変更したのがクライアントに保存される設定なのか、起動のたびに生成される一時設定なのか確認します。クライアントが対応している永続化可能なDNS設定またはカスタム設定の画面から変更し、再生成後に実行中の設定を確認してください。更新時にルールを失わないよう、バックアップも残しておきましょう。