v2rayNでノードに接続できるものの、ドメイン名の解決に失敗したり、振り分けが安定しなかったりする方向けです。まず、どこで名前解決されているかを確認し、中国国内向けDNS、海外向けDoH、ルーティングルールの役割を整理します。最後にリクエスト経路に沿って、キャッシュ、ログ、実際の通信経路を確認しましょう。
まずDNSリクエストの送信元を確認する
DNSの振り分けは、サーバーアドレスを2つリストに登録すれば終わりではありません。ブラウザーが独自に名前解決したり、OSが先にIPアドレスを取得したりすることがあります。ドメイン名がV2RayまたはXrayコアの名前解決処理に渡された場合に限り、設定内のdnsルールが適用されます。v2rayNで「システムプロキシ」を有効にしても、主にシステムプロキシに従うアプリが対象です。端末上のすべてのDNSリクエストを制御するわけではありません。
まず正常に使えるノードへ接続し、同じサイトをブラウザーとほかのアプリで開いて動作を記録します。特定のブラウザーだけで問題が起きる場合は、ブラウザー独自のセキュアDNS設定を確認してください。直接接続するアプリだけで問題が起きる場合は、その通信がクライアントを経由しているかを確認します。最初からシステムDNS、TUN、ルーティングルールを同時に変更すると、どの変更が効いたのか判断しにくくなります。
ドメインごとに中国国内向けDNSと海外向けDoHを使い分ける
以下は構造を理解するためのdns設定例で、v2rayNにそのまま読み込める完全な設定ではありません。例ではgeosite:cnで中国国内の一般的なドメインを照合し、通常のDNSサーバーへ問い合わせます。geosite:geolocation-!cnに一致するドメインはDoHへ送ります。どちらにも一致しないドメインは、最後のフォールバック用サーバーで解決します。実際に適用されるかどうかは、使用するコア、ルールデータ、設定の生成方法にも左右されます。
{
"dns": {
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": ["geosite:cn"],
"expectIPs": ["geoip:cn"]
},
{
"address": "https://1.1.1.1/dns-query",
"domains": ["geosite:geolocation-!cn"]
},
"localhost"
]
}
}
addressでDNSサーバーを指定します。通常のDNSの例ではポート53を使用し、DoHはHTTPSで接続するため、一般にポート443を使用します。domainsはドメインの優先照合先を決めるもので、アクセス制御リストではありません。expectIPsは応答アドレスを絞り込む条件です。この例では、中国国内向けDNSの応答がgeoip:cnの範囲に入ることを求めています。ただし、ドメインが必ず中国国内のIPに解決されるべきだと証明するものではありません。複数の地域に展開するサイトでは、想定と異なる結果になることがあります。
localhostは、先行するドメインルールに一致しない場合のフォールバック先で、端末の名前解決環境を使用します。端末のDNS汚染を調べているときは、フォールバックの結果をDoH経由の結果と混同しないでください。また、DoHサーバー自体に接続できる必要があります。タイムアウトする場合は、現在のネットワークからそのサーバーに到達できるか、コアが送信するDNS通信が実際にどのアウトバウンドを通るかを、それぞれ確認します。serversリストを変更するだけでは、クエリが必ずプロキシ経由になるとは限りません。
v2rayNで設定を保存し、ルーティングを確認する
v2rayNの画面はバージョンによって変わるため、まず「設定」から「DNS設定」を開き、現在の設定モードと編集可能な項目を確認します。DNS設定をカスタマイズできる場合は、元の内容をバックアップしてから、指定された形式に従って入力してください。上記の設定例を、サーバーアドレスだけを受け付ける入力欄に貼り付けてはいけません。保存後にコアを再起動し、クライアントログにJSONの解析エラーやDNSサーバーへの接続失敗が出ていないか確認します。
名前解決側:まず問い合わせ先を確認
- 設定画面
- 「設定」→「DNS設定」
- 中国国内向けルール
- geosite:cn
- 海外向けルール
- geosite:geolocation-!cn
- フォールバック
- localhostで実際に返る結果を確認
編集前に元の設定を保存し、使用中のモードでコアのDNSルールを変更できるか確認します。
ルーティング側:次に接続経路を確認
- 設定画面
- 「設定」→「ルーティング設定」
- 中国国内向けルール
- ドメインに一致した通信を直接接続
- 海外向けルール
- ドメインに一致した通信をプロキシ経由で接続
- デフォルトの接続先
- ルールに一致しない通信の経路を確認
ルールの有無だけでなく、優先順位と現在有効なルーティング設定も確認します。
ルーティングルールとDNSルールは、同じ方針になるよう設定します。たとえば、中国国内のドメインを中国国内向けDNSで解決しても、優先度の高い大まかなプロキシルールに先に一致すると、「名前解決は正常だが接続経路が違う」という状態になることがあります。「設定」→「ルーティング設定」で現在有効なルールセットを確認し、各ルールの優先順位も確認してください。サブスクリプションの更新は通常、サーバー一覧を更新するものです。更新によって端末側のDNSやルーティング設定まで修正されるとは限りません。
接続がドメイン名を保ったままコアに届く場合、ルーティングではまずドメインルールを照合できます。domainStrategyは、ルーティング判定のためにIPアドレスをいつ名前解決するかに影響します。AsIsはルーティングのためにドメインを積極的に解決しません。IPIfNonMatchはドメインルールに一致しなかった場合に名前解決を試み、IPOnDemandはIPアドレスによる判定が必要なルールに遭遇したとき、名前解決を実行することがあります。これらはルーティング判定のタイミングを設定する項目であり、コアを経由しないシステムDNSリクエストを指定のDNSサーバーへ自動的に振り向けるものではありません。
DNS汚染・キャッシュ・振り分けミスを見分ける
切り分けでは、ドメイン名、アプリ、ノードを1つずつ固定し、変更は毎回1項目に絞ります。まずサイトを開けるか確認し、次にコアのログでDNSクエリ、クエリ失敗、ルールへの一致を確認してください。一部のドメインだけ失敗する場合は、DNSサーバーごとの応答アドレスを比較します。すべてのドメインで失敗する場合は、まずノードへの接続、DoHへの到達性、設定の構文を確認し、すぐにDNS汚染と決めつけないでください。
- リクエストの入口を確認。ブラウザーでテストし、システムプロキシに従う別のアプリでも比較します。直接接続するアプリだけ失敗する場合は、DNSルールを追加する前に、システムプロキシまたはTUNの状態を確認してください。
- DNSクエリを確認。v2rayNのログで対象ドメインやDNSエラーを探します。該当するリクエストがログにまったくない場合は、アプリ独自のセキュアDNS、システムキャッシュ、通信がコアに届いているかを確認してください。
- 接続経路を確認。「ルーティング設定」で有効なルールと、ログに記録されたアウトバウンドの結果を照合します。正常なIPアドレスが返っているのに接続できない場合は、DNSサーバーを何度も変更するのではなく、ルーティング、ノード、接続先サービスを確認してください。
- 古い結果を消して再テスト。Windowsではコマンドプロンプトで
ipconfig /flushdnsを実行し、システムのDNSキャッシュを消去できます。その後、テスト対象のアプリを再起動し、古い名前解決結果を新しい設定の効果と取り違えないようにします。
アプリ側ですでにドメイン名がIPアドレスに解決されてからプロキシへ渡されると、コアではIPルールによる判定しかできない場合があります。通信のスニッフィングは、対象となるHTTPまたはTLS接続でドメイン情報の復元に役立つことがありますが、すべてのプロトコルに対応するわけではなく、適切なDNSの入口の代わりにもなりません。まずリクエスト経路を把握してから、スニッフィングやIPルーティングルールを変更するか判断してください。
よくある質問:DNSを変更しても反映されない
DoHのアドレスを設定したら、ページが読み込み中のままになる
まずhttps://1.1.1.1/dns-queryへのHTTPS接続が可能か確認し、次にコアのログでタイムアウトの有無を確認してください。DoHクエリの接続経路は個別に調べる必要があります。接続先サイトがプロキシ経由だからといって、DoHも同じ経路を通るとは限りません。
中国国内のサイトが海外向けと判定される
まずgeositeのルールデータと有効なルーティング設定を確認し、対象ドメインが指定したdomains項目に一致しているか調べます。複数の地域に展開するサービスでは、IPアドレスの所在地による分類が想定どおりにならないことがあります。その場合は、対象ドメインに明示的なルールを設定してください。
特定のブラウザーだけ名前解決エラーが表示される
そのブラウザー独自のセキュアDNS設定を確認し、無効にして再テストします。ブラウザーを再起動して古い接続も切断してください。他のアプリが正常に動作しているなら、まず全体のDNS設定は変更しないでください。
設定を保存したら、すべてのサイトが開けなくなった
まずバックアップした設定に戻し、ログで設定の解析エラーを探します。入力欄が完全なdnsオブジェクトを受け付けるのか、DNSサーバーのアドレスだけを受け付けるのか確認してください。ルールは1つずつ追加し、保存後にコアを再起動してテストします。
ルーティングを変更しても、DNSの応答が古いまま
ルーティングルールを変更しても、キャッシュ済みの名前解決結果は自動更新されません。まずシステムキャッシュを消去し、テスト対象のアプリを再起動してから、コアが新しいクエリを送信したか確認してください。接続経路の変化とDNS応答の変化を混同しないようにしましょう。
設定後の確認は簡単です。中国国内のドメインを1つ、海外のドメインを1つ選び、それぞれのDNSサーバー、適用されたルーティングルール、実際にアクセスできるかを確認します。3項目が一致したら、普段使うアプリにも適用範囲を広げてください。v2rayNGまたはv2flyNGだけで問題が起きる場合は、Android側で使用しているコアとクライアント設定も個別に確認します。デスクトップ版v2rayNの設定がほかの端末に自動で反映されることはありません。