この記事の要点

この記事は、サブスクリプションのインポートと基本接続は完了しているものの、ドメイン解決エラー、振り分けの不安定さ、初回アクセスの遅延に悩むユーザー向けです。国内ドメインはローカルDNS、海外ドメインは暗号化DNSへ振り分け、DNSの結果にもルーティングルールを適用することを目指します。読み終える頃には、DNS問い合わせ戦略、ルーティングのドメイン戦略、システムDNSの取り込み範囲を切り分け、ログとコマンド出力から実際の解決経路を確認できるようになります。

DNS振り分けが解決するのは速度だけではない

クライアントがWebサイトへアクセスすると、通常はまずドメインをIPアドレスへ変換し、その後ルーティングルールに従って直結、プロキシ、ブロックのいずれかへ送信します。解決結果が誤っていると、VMess、VLESS、基盤トランスポートの設定が正しくても、接続先が誤ったアドレスになる可能性があります。適切でない地域から得た結果では、サイトが遠いサービスノードを返すこともあり、ハンドシェイクは成功するのに最初のレスポンスだけ遅い、といった症状になります。

国内ドメインにローカルの再帰リゾルバーを使う主な利点は、応答先までの距離が短く、国内ネットワークに適したアドレスを得やすいことです。海外ドメインにはプロキシ経由の暗号化DNSを使い、問い合わせの書き換えや誤ったキャッシュの影響を抑えます。重要なのはすべての問い合わせを一つのサーバーへ強制することではなく、ドメインルール、DNSサーバー、最終的な出方向を一致させることです。

ドメイン問い合わせルール判定リゾルバー選択アドレス返却出方向の照合

「クライアント内蔵DNS」と「OSが現在使用しているDNS」は分けて考える必要があります。システムプロキシだけを有効にした場合、ブラウザーのHTTP通信はv2rayNへ入っても、一部のアプリはシステムのリゾルバーを直接呼び出すことがあります。TUNモードならより広い範囲の通信を取り込めますが、53番ポートの問い合わせまで処理するかどうかは、クライアントが生成するインバウンド、DNSハイジャック、ルーティング設定に左右されます。プロキシが接続済みでも、すべてのDNS問い合わせがカーネルへ入っているとは限りません。

注意:DNSを変更する前に、現在動作している設定を保存してください。サーバーグループ、問い合わせ戦略、ルーティング戦略のうち一度に一項目だけ変更し、再接続後すぐにテストします。複数の変数を同時に変えると、ログから本当の原因を特定しにくくなります。

混同しやすい4つの設定レイヤーを分ける

保守しやすいDNS設定には、少なくとも4つのレイヤーがあります。リゾルバーは問い合わせに応答し、ドメインルールは使用するサーバーグループを決め、問い合わせ戦略はA・AAAAのどちらを要求するかを決め、ルーティング戦略はドメインまたはIPを取得した後の出方向を決めます。各レイヤーの項目名は似ていますが、役割と適用箇所は異なります。

国内向け解決グループ

サーバー
223.5.5.5
ポート
53
ドメイン範囲
geosite:cn
アドレス制約
geoip:cn

ローカルへ直結するドメインに使用し、解決の往復時間を抑えます。

海外向け解決グループ

プロトコル
DNS over HTTPS
通信ポート
443
ドメイン範囲
geosite:geolocation-!cn
推奨出方向
プロキシ

暗号化問い合わせはプロキシ出方向へルーティングする必要があり、サーバーアドレスを入力するだけでは不十分です。

問い合わせ戦略

UseIP
環境に応じてアドレスを問い合わせる
UseIPv4
Aレコードのみ要求
UseIPv6
AAAAレコードのみ要求
対象
DNSの応答タイプ

ローカルIPv6が不安定な場合は、まずUseIPv4でアドレスファミリーの問題を切り分けます。

ルーティングのドメイン戦略

AsIs
ドメインを優先して保持
IPIfNonMatch
ドメインが一致しない場合のみ解決
IPOnDemand
IPルールが必要な場合に解決
対象
ルーティングルールの照合

これはdns.queryStrategyとは別の項目であり、相互に置き換えることはできません。

expectIPsは、解決結果が想定したアドレス範囲に含まれるかを確認するために使います。たとえば国内ドメインをローカルサーバーへ渡した後、結果をgeoip:cnの範囲に限定できます。結果が条件に合わない場合、カーネルは後続のサーバーを引き続き試行できます。skipFallbackは、現在のサーバーに一致したドメインをフォールバック対象にするかどうかを制御します。ルールの境界が明確なグループに適しています。

結論:まず通信の行き先を決め、その後にDNSサーバーを選ぶ

ドメインを直結する予定なら、国内から到達しやすいアドレスを返すリゾルバーを優先します。プロキシを使うドメインなら、問い合わせとアクセスの両方をプロキシ経路へ通します。「どのDNSが低遅延か」だけで並べると、出方向の地域と合わないアドレスを取得しやすくなります。

読みやすいグループ設定の書き方

以下はXrayカーネルでよく使われるDNSグループ構成の例です。フィールドの関係を理解するためのものであり、クライアントが自動生成した完全な設定を上書きすることはおすすめしません。v2rayN、v2rayNG、v2flyNGに搭載されるカーネルやバージョンは異なる場合があるため、インポート前に現在のカーネルが対象フィールドに対応しているか確認してください。

{
  "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",
        "domains": [
          "geosite:geolocation-!cn"
        ]
      },
      "localhost"
    ]
  },
  "routing": {
    "domainStrategy": "IPIfNonMatch"
  }
}

最初のサーバーグループは国内ドメインだけを処理し、アドレス範囲で応答結果を制限します。2番目のグループは国内以外のドメインを処理します。最後のlocalhostはフォールバック用で、残すかどうかは環境によって決まります。システムのリゾルバーが異常な結果を頻繁に返す場合は、明確に到達可能な別のサーバーへ変更できますが、ログの根拠なしにフォールバックを増やしすぎないでください。

暗号化DNSのアドレス自体にドメイン名が含まれる場合もあります。カーネルはHTTPS接続を確立する前に、そのサービスのドメインに対応するIPを知る必要があり、これをブートストラップ解決と呼びます。IP形式のエンドポイントを使えば循環依存を抑えられます。ドメイン形式のエンドポイントを使う場合は、ローカルサーバーで確実に解決できることと、その問い合わせがまだ確立していない同じ暗号化接続へ再帰的に入らないことを確認してください。

設定のヒント:サブスクリプション更新では通常ノード情報だけが置き換えられ、ローカルDNSやルーティングルールまで同期して上書きされるとは限りません。更新後は、カスタムルールが現在の設定から引き続き参照されているか確認してください。

v2rayNとAndroidクライアントの設定手順

v2rayN 7.xでは、まず「設定」→「パラメーター設定」を開き、現在のカーネル、システムプロキシ、DNS関連の項目を確認します。次にルーティング設定でルールセットを確認します。マイナーバージョンによってメニュー名は多少異なりますが、入口の確認、DNS設定、ルーティングの出方向確認という順序は変えません。変更後は現在の接続を停止して再起動し、新しい設定が再生成されるようにします。

  1. 入口モードを記録する:現在システムプロキシとTUNのどちらを使っているか確認します。システムプロキシではローカルHTTPポートが10809、SOCKSポートが10808であることが一般的ですが、具体的な値はクライアント画面に従ってください。
  2. DNSサーバーグループを確認する:国内グループにはローカルから到達可能なサーバーを、海外グループには暗号化問い合わせのエンドポイントを設定し、それぞれに明確なドメイン範囲を割り当てます。
  3. ルーティングルールの順序を確認する:広範囲のルールより前に完全一致のドメインルールを置き、ブロック、直結、プロキシのルールが相互に重複しないようにします。
  4. 接続を再起動する:設定を保存して再接続し、OSとブラウザーに残っているDNSキャッシュも削除します。
  5. カーネルログを確認する:対象ドメイン、DNSサーバーアドレス、出方向のタグ、失敗理由を探します。遅延テストの結果だけで判断しないでください。

v2rayNGはXrayカーネルを使用し、通常は「設定」内のDNS、ルーティング、VPNサービス関連の項目で調整します。v2flyNGはv2flyカーネルを使用するため、設定フィールドの対応範囲は実際のカーネルバージョンを基準にしてください。どちらも別のカーネル向け完全設定をそのままコピーすべきではありません。まずGUIでサーバーと問い合わせ戦略を選択し、生成された設定が想定どおりか確認する方法が安全です。

53
従来型DNSで一般的なポート
443
HTTPS暗号化問い合わせのポート
853
TLS DNSで一般的なポート
10808
ローカルSOCKSで一般的なポート

これらのポートは通信経路を特定するためのもので、すべてのクライアントが同じデフォルト値を使うわけではありません。たとえばローカルの待ち受けポートを変更した後も、端末の環境変数が10808を指していると、ブラウザーは正常なのにコマンドラインだけ失敗することがあります。DNSを確認する際は、アプリが実際にどのローカル入口へ接続しているかも確認してください。

国内・海外ドメインが本当に分離解決されているか確認する方法

確認はWebページが開くかどうかだけで判断できません。ブラウザーが既存の接続を再利用したり、独自のDNSキャッシュを保持したりするためです。直結が確定している国内ドメインと、プロキシ経由が確定している海外ドメインを一つずつ選び、解決結果、問い合わせ時間、カーネルログ、最終出方向をそれぞれ確認します。

確認項目 期待される結果 異常の兆候
国内ドメインの解決 ローカルサーバーに一致し、結果が国内アドレス範囲に収まる 海外向け暗号化グループへ問い合わせが入り、初回アクセスの遅延が明らかに増える
海外ドメインの解決 暗号化サーバーに一致し、プロキシ出方向経由で接続が確立する ログに問い合わせがシステムDNSへ直接送信されたと表示される
AとAAAAレコード 応答タイプがqueryStrategyに一致する 到達できないIPv6アドレスしかなく、接続待ちの後にフォールバックする
ルーティングの一致 ドメインルールと最終IPルールが同じ出方向を指す DNSはプロキシ経由だが、対象接続がIPルールで直結へ変更される

Windowsのターミナルでは、nslookupでサーバーを指定して基準テストを行えます。最初のコマンドでローカルリゾルバーへの到達性を確認し、次のコマンドで現在のシステム解決経路を確認します。システムコマンドの結果は必ずしもV2Ray内蔵DNSを経由しないため、カーネルの振り分けが有効になったことを単独で証明するものではなく、比較用として使うのが適切です。

nslookup example.cn 223.5.5.5
nslookup example.com
ipconfig /flushdns

ブラウザーでテストする前に対象ページを閉じて開き直し、古い接続の再利用を避けます。その後v2rayNのリアルタイムログを確認し、対象ドメインが最初にどのDNSルールへ一致したか、続いて接続がdirect、proxy、blockのどの出方向タグに一致したかを確認します。ログにIPしか表示されず元のドメインがない場合は、通信入口がドメイン情報を保持しているか、現在のプロトコルにスニッフィング設定が適用されているかを確認してください。

結論:ログのリゾルバーと出方向タグを合格判定の基準にする

同じドメインを3回連続でテストすると、キャッシュにより2回目と3回目はリモート問い合わせがほとんど発生しません。まずキャッシュを削除し、初回問い合わせのログでサーバーグループを判定します。その後、接続ログで最終出方向を確認します。両方がルールに一致して初めて振り分け完了です。

よくある失敗と修正方法

最も多い問題は、暗号化DNSを設定したのに、その通信自体が直結へルーティングされているケースです。通常のノードには接続できるのに、海外ドメインだけ解決タイムアウトが続く症状が出ます。まず暗号化DNSエンドポイントのドメインまたはIPがどのルールに一致したか確認し、明確なプロキシ出方向ルールを設定します。タイムアウトしたからといって予備サーバーを増やし続けると、実際の問い合わせ経路が予測しにくくなります。

システムプロキシを有効にしているのに、なぜシステムの問い合わせはローカルDNSを使うのですか?

システムプロキシは、プロキシ設定に従うアプリの接続に主に影響し、OSが送信するUDP 53番ポートの問い合わせまで必ず取り込むわけではありません。TUN、DNSハイジャック、アプリ自身のプロキシ解決機能を組み合わせて対応し、問い合わせがカーネルへ入ったかをログで確認する必要があります。

国内サイトは開くのに、画像の読み込みが遅い場合は?

ページと画像が別のドメインから配信されている可能性があります。静的リソースのドメインがgeosite:geolocation-!cnルールで海外向け解決グループへ送られていないか、返されたアドレスが後続のIPルールでプロキシへ変更されていないか確認します。実際のドメインに合わせて完全一致ルールを追加し、トップレベルドメイン全体を無条件に許可しないでください。

UseIPv4を有効にすると正常に戻ります。常に残すべきですか?

IPv6アドレスに到達できない、ルーティングが不足している、またはネットワーク品質が不安定である可能性を示しています。現在のネットワークでIPv4だけが必要なら残して構いません。将来IPv6が必要になった場合は、ローカルアドレス、デフォルトルート、プロキシノードのIPv6対応を確認してからUseIPのテストに戻してください。

ルールセットの更新後、解決結果が突然変わったのはなぜですか?

ドメインが新しいカテゴリへ移動したか、クライアントがgeositeやgeoipのデータを更新した可能性があります。更新前後で一致したルールを記録し、重要なドメインには優先度の高い完全一致ルールを追加して、復旧するか確認します。完全一致ルールは少数かつ明確に保ち、保守しにくい長大なリストを作らないでください。

もう一つのよくある問題は、ブラウザーが独自のセキュアDNSを有効にし、クライアント側にも暗号化DNSが設定されていることです。この場合、問い合わせがクライアントのグループ分けを迂回し、ログに対象ドメインが表示されないことがあります。切り分け中は問い合わせ入口を統一します。ブラウザーの問い合わせをプロキシ経由でクライアントに処理させるか、ブラウザー独自の解決エンドポイントとプロキシ経路を明確に記録し、2つの戦略を同時に動かさないようにします。

安定した設定に仕上げるための原則

検証が完了したら、国内向けリゾルバーを1グループ、海外向け暗号化リゾルバーを1グループ、用途の明確なフォールバックを1つ残せば十分です。サーバー数が多いほど信頼性が高いとは限りません。ドメイン境界やフォールバック条件のない長いリストは、ランダムな一致と障害調査のコストを増やすだけです。

ルーティングルールも同じ原則で整理します。まず業務上必要な完全一致ドメイン、次にgeositeカテゴリ、最後にIPカテゴリとデフォルト出方向を配置します。DNSグループとルーティンググループが同じ「国内は直結、海外はプロキシ」という意図を共有して初めて、解決段階と接続段階で結果が食い違うのを防げます。

  1. 検証済みで動作する基本設定を1つ保存する。
  2. クライアントのバージョン、カーネルの種類、入口モード、ローカル待ち受けポートを記録する。
  3. 国内用と海外用に固定のテストドメインを1つずつ選ぶ。
  4. ルールセットまたはサブスクリプションの更新後、初回問い合わせテストを再実行する。
  5. 異常が起きたら「入口、リゾルバー、アドレス結果、ルーティング出方向」の順でログを読む。

最終的な合格基準は明確です。国内ドメインはローカルリゾルバーから妥当なアドレスを迅速に取得し、直結出方向へ一致すること。海外ドメインは暗号化リゾルバーで解決し、問い合わせと対象接続の両方がプロキシ出方向へ一致すること。未分類ドメインには安定したフォールバックがあること。IPv4とIPv6の応答タイプが現在のネットワーク能力に合っていること。この4項目を満たしてから、キャッシュ時間、ルールの細分化、個別ドメインの追加対応を検討します。