この記事の概要

ノードには接続できるものの、一部のドメインにアクセスできない、または名前解決の結果がおかしい方に向けた内容です。まずアプリからドメイン名がコアに渡されているかを確認し、次にDNSサーバー、DNSリクエストの出方向、Webサイト通信のルーティングを設定します。Xrayコア向けの設定例を使い、国内DNS、プロキシ経由のDoH、geosite、FakeDNSの役割と確認手順を解説します。

DNSサーバーの選択・DNSリクエストの出方向・Web通信の出方向を区別する

「DNSの振り分け」には、ドメインをどのDNSサーバーに問い合わせるかと、DNSリクエストをどの出方向へ送るかという、少なくとも2つの別々の判断があります。Webサイトへの接続にも、さらに別の判断が必要です。海外のDNSアドレスを設定しても、問い合わせがプロキシ経由になるとは限りません。Web通信をプロキシ経由に設定しても、ブラウザーが事前に行ったローカルでの名前解決が自動的にコア経由になるわけではありません。

アプリがドメイン名を渡す DNSサーバーを選択 DNSリクエストの出方向 名前解決結果を返す Webサイトへの接続を振り分け

V2Ray/Xrayのdnsオブジェクトで内蔵DNSを設定し、routingで接続の出方向を決めます。geosite:cnはドメインルールの集合、geoip:cnはIPアドレスルールの集合で、互いに置き換えることはできません。アプリからドメイン名がコアに渡されない場合、IPアドレスだけの接続はドメインルールに直接照合できません。通信のスニッフィングでドメイン情報を復元できることもありますが、あらゆるプロトコルに使える対策とは考えないでください。

国内DNSとリモートDoH:それぞれの役割を決める

ここでは、国内ドメインに223.5.5.5、その他の問い合わせにhttps://1.1.1.1/dns-queryを使います。どちらも変更可能なパブリックDNSの例であり、すべてのネットワークに最適な固定値ではありません。前者は通常UDP 53、後者はHTTPS 443を使用します。暗号化で保護されるのはクライアントからDNSサーバーまでの問い合わせ通信であり、DNSサーバーには処理対象のドメイン名が見えます。

国内ドメインの名前解決

address
223.5.5.5
domains
geosite:cn
skipFallback
true
問い合わせの出方向
direct

一致した国内ドメインを優先して処理し、無関係なドメイン向けの一般的なフォールバックには加えません。

その他のドメインの名前解決

address
https://1.1.1.1/dns-query
通信ポート
443
問い合わせの出方向
proxy
queryStrategy
UseIPv4

デフォルトのDNSサーバーとして使い、HTTPSの問い合わせをプロキシノード経由で送信します。

UseIPv4は、初回の切り分けをIPv4に限定し、IPv6のルーティング問題が同時に発生するのを避けるための設定です。IPv6を恒久的に無効化する一般的な推奨設定ではありません。ネットワークとノードの両方がIPv6に対応している場合は、基本設定で問題がないことを確認してからUseIPに変更し、AレコードとAAAAレコードをそれぞれ確認してください。DNS問い合わせの種類に関する設定は、システム側のIPv6ルーティング設定の代わりにはなりません。

dns.serversの設定例:ドメイン照合とフォールバックの動作

以下はコア設定の一部であり、単独でインポートできる完全なノード設定ではありません。v2rayNGで使用するXrayコアを想定した例です。v2rayNでも、まず現在選択しているコアを確認してください。変更前に設定をバックアップします。クライアントが設定を生成する場合は、該当するDNS設定またはカスタム設定の画面で変更してください。次回起動時に上書きされる一時的な実行ファイルは編集しないでください。

{
  "dns": {
    "tag": "dns-internal",
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "domains": [
          "geosite:cn"
        ],
        "skipFallback": true
      },
      "https://1.1.1.1/dns-query"
    ]
  }
}

一致したドメインの名前解決を指定サーバーだけに限定するには、XrayのdisableFallbackIfMatchを検討できます。有効にする前に、使用中のコアがこの項目に対応していることを確認してください。また、指定したDNSサーバーに障害があると名前解決に失敗する点にも注意が必要です。フォールバック、キャッシュ、IPv6の設定を一度に大きく変更すると、失敗の原因を絞り込みにくくなります。

routingの設定例:リモートDNSを確実にプロキシ経由にする

以下の例では、proxyというタグの使用可能なプロキシ出方向と、directというタグの直結出方向が、既存の設定に含まれていることを前提とします。各タグは実際のoutbounds[].tagと完全に一致させてください。この例には最後の全一致ルールがないため、どのルールにも一致しない接続には先頭の出方向が使われます。したがって、先頭の出方向がproxyであることも条件です。既存の設定で別のデフォルト動作を使っている場合は、元の構成に合わせて調整し、そのまま上書きしないでください。

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

最初の2つのルールは内蔵DNSの問い合わせだけを識別します。同じIPアドレスへユーザーが直接接続した場合まで、DNSリクエストとして扱うのを防ぐためです。後の2つのルールはWebサイトへの接続を処理します。IPIfNonMatchは、ドメイン名を使った接続が既存ルールに一致しない場合に、IPアドレスを解決してIPルールとの照合を試みる設定です。使用するDNSサーバーを決めるものではなく、DNSリクエストを自動的にプロキシへ送る設定でもありません。

設定項目設定例実際に制御する対象
dns.servers[].domainsgeosite:cnドメインを優先的にどのDNSサーバーへ問い合わせるか
dns.queryStrategyUseIPv4内蔵DNSのアドレス解決方式
routing.domainStrategyIPIfNonMatchルーティング照合時にドメイン名を解決するタイミング
routing.rules[].outboundTagproxy一致した接続に使う出方向

まとめ:まずDNSリクエストの経路を確認し、その後にWebサイトのルールを調整する

コアを再起動したら、まず1.1.1.1:443宛ての内蔵DNSリクエストがproxyに一致することを確認してください。この経路が機能していない状態で海外サイトのドメインルールを追加しても、名前解決がローカルネットワークの干渉を避けられるとは限りません。

DoHとFakeDNS:暗号化された問い合わせと仮想アドレスは別の仕組み

DoHはDNSメッセージをHTTPS接続で送信し、主に問い合わせの通信経路を保護します。一方、FakeDNSはアプリに仮想IPアドレスを返し、ドメイン名と仮想アドレスの対応を保持することで、その後の接続をドメイン名に基づいて処理できるようにします。FakeDNSは仮想アドレス上に実際のWebサイトを構築するものではなく、「リモートで実際の名前解決が完了した」という意味でもありません。

方式返される値主な確認項目利用を始める目安
通常のDNS実際のAレコードまたはAAAAレコードUDP/TCP 53の出方向と到達性国内DNSの基本設定
DoH実際のAレコードまたはAAAAレコードHTTPS 443、証明書、ルーティングリモートでの暗号化名前解決
FakeDNS仮想アドレスプール内のIPアドレス対応関係の復元、インバウンドでの捕捉、スニッフィング基本的なDNS振り分けが安定してから検討

たとえばFakeDNSのIPv4アドレスプールに198.18.0.0/15を使う場合、システムはこのアドレスプール宛ての接続をコアに戻し、コアが対応するドメイン名を復元できる必要があります。接続がVPNやTUNの経路を通らない場合、仮想IPアドレスには実際のインターネット上のアドレスのようにアクセスできません。有効化後に一部のアプリだけが失敗する場合は、すぐにノードを変更せず、アプリごとのプロキシ設定、通信の捕捉範囲、対応関係の処理を確認してください。

v2rayNとv2rayNGで項目ごとに確認する

クライアントの画面設定とコア設定は別のレイヤーです。同じ「リモートDNS」の入力欄でも、クライアントのバージョンによって生成される設定構造が異なる場合があります。実際に読み込まれたコア設定を基準にしてください。v2rayNでは「設定」→「パラメータ設定」からログ関連の項目を確認し、メイン画面のログ欄で起動結果を確認できます。DNS設定画面の名称はバージョンによって変わるため、通常の1行入力欄を完全なJSONエディターと混同しないでください。

  1. 現在の設定を記録します。ノード、現在のルーティングモード、DNSアドレス、システムプロキシまたはVPNの状態を保存します。v2rayNGでは「設定」からDNS関連の項目を確認し、変更後にサービスを停止して再起動します。ログに設定の解析エラーがないことも確認してください。
  2. 起動時のエラーを確認します。未対応の項目、出方向タグの不一致、geositeデータの読み込み失敗などを先に解決してください。コアが正常に起動していない状態では、Webページのテスト結果を正しく判断できません。
  3. アプリからドメイン名が渡されているか確認します。デスクトップでは、リモート名前解決に対応したSOCKSリクエストを使ってテストできます。以下のコマンドは、ローカルのSOCKSポートが10808であることを前提としています。実際の設定が異なる場合は、使用中のポートに変更してください。
  4. ルーティングの一致を確認します。一時的にログの詳細度を上げ、国内外のドメインにそれぞれアクセスして、DNSリクエストとWeb接続の出方向を確認します。検証後は通常のログレベルに戻し、不要なアクセス情報を長時間記録しないようにしてください。
  5. キャッシュの影響を切り分けます。コアを再起動し、既存の接続を閉じてから再試行します。Windowsではipconfig /flushdnsを実行してシステムキャッシュを消去できます。ただし、ブラウザーやアプリ独自のキャッシュは別途消去が必要な場合があります。
curl --proxy socks5h://127.0.0.1:10808 --head --max-time 15 https://www.example.com/

socks5hでは、curlがドメイン名をSOCKSプロキシに渡します。socks5に変更すると、通常はローカルで名前解決されるため、2つのテスト経路は異なります。このコマンドで確認できるのはドメイン名がプロキシ経由になることだけで、すべてのDNSが想定どおり振り分けられている証明にはなりません。よくある誤解として、nslookup www.example.com 223.5.5.5だけを実行する方法があります。このコマンドは指定したDNSサーバーに直接問い合わせるため、サーバーへの到達性は確認できますが、内蔵DNSのルールが有効になっているかは確認できません。

よくあるトラブル:名前解決のタイムアウト、IPアドレスの異常、設定が反映されない

DoHに変更したらすべてのWebページがタイムアウトする場合、まず何を確認すればよいですか?

まずコアが正常に起動しているか確認し、次に1.1.1.1:443への接続が使用可能なproxy出方向に一致しているか確認してください。端末の時刻が正しいか、ログにTLS証明書またはハンドシェイクのエラーがないかも確認します。一時的に元のDNSへ戻すと変更による影響を特定できますが、証明書検証を無効にして問題を隠さないでください。

国内サイトの表示が遅くなりました。すべてリモートDNSで名前解決されているのでしょうか?

まずgeosite:cnのデータが正常に読み込まれていることを確認し、対象のドメインが実際にその集合に含まれているか調べてください。国内DNSでの名前解決が必要なドメインが明確な場合は、国内DNSのdomainsにdomain:example.cnのようなルールを追加し、Web接続が直結になっているかも確認します。サイトのメインドメインと画像・動画のドメインで、適用されるルールが異なる場合があります。

2つのDNSサーバーが異なるIPアドレスを返したら、DNS汚染と判断できますか?

いいえ。CDNの振り分け、キャッシュの有効期間、DNSサーバーの設置場所、IPv4とIPv6の違いなどによって、結果が異なることがあります。不審なアドレス、証明書の不一致、継続的な接続失敗、複数の信頼できる名前解決経路を合わせて判断してください。2回の問い合わせで結果が異なっただけでは、DNS汚染とは断定できません。

DNSを変更してもブラウザーには反映されないのに、ほかのアプリは正常な場合はどうすればよいですか?

まずブラウザー独自のセキュアDNSが有効になっていないか確認し、システムプロキシに従う設定かどうかも調べてください。切り分けの際は名前解決の経路を一時的に統一し、ブラウザーのDNSキャッシュを消去して既存の接続を閉じてから、もう一度テストします。アプリごとにプロキシを設定している場合は、ブラウザーがVPNの捕捉対象から除外されていないかも確認してください。

最終的には、設定の意図を説明できる状態にしておきましょう。どのドメインに国内DNSを使うか、デフォルトの問い合わせ先、DNS接続の出方向、どのルールにも一致しないWebサイトの扱いを明確にします。一度に変更する項目を1つに絞り、起動ログと接続結果で確認すると、パブリックDNSをいくつも追加するより原因を特定しやすくなります。

クライアントのインストールとDNS設定

OSに合わせてv2rayNGまたはv2rayNを選び、ノードのインポートと基本接続を済ませてからDNSの振り分けを設定します。初めて設定する場合は、入門ガイドを先に確認してください。

ダウンロードページへ 手順を見る