· ネットワーク · 約10分

V2RayのDNS振り分け設定|国内・海外ドメインのDNS切り替えとDNS汚染対策

dnsのservers、domains、expectIPsの各項目を解説。中国国内ドメインは国内DNS、海外ドメインはリモートDNSで名前解決する設定例と、DNS汚染対策を紹介します。

この記事の概要

この記事は、ノードに接続できていて、DNSの振り分けを調整したい方向けです。まず、名前解決がアプリ、OS、カーネルのどこで行われるかを確認します。次に、中国国内ドメイン向けの優先ルールとリモートDoHを設定し、ログで名前解決の経路を検証します。設定例は既存の設定に統合するための断片です。システムDNSを自動的に引き受けるものではなく、利用可能なプロキシのアウトバウンドの代わりにもなりません。

1. DNS振り分けと接続振り分けの違い

DNS振り分けは「どのDNSサーバーにドメインを問い合わせるか」を決め、接続振り分けは「Webサイトへの接続をどのアウトバウンドに通すか」を決めます。両者は関係しますが、同じルールではありません。中国国内のWebサイトを直接接続にしても、必ず中国国内のDNSが使われるとは限りません。DNSサーバーへの接続をプロキシ経由にしても、Webサイトへの接続まで自動的にプロキシ経由になるわけではありません。

ドメインがカーネルに渡る 名前解決ルールに照合 DNSサーバーに問い合わせ IPアドレスの結果を絞り込み 接続先のアウトバウンドを選択

この流れは、カーネルが名前解決を行う場合の一般的な例です。すべてのリクエストが各段階を経るわけではありません。ブラウザーが先に独自のセキュアDNSでIPアドレスを取得し、そのIPをプロキシに渡す場合、カーネルには元のDNSクエリが届かないことがあります。反対に、アプリがドメイン名をSOCKSプロキシに渡すと、ドメイン名がプロキシサーバーまで転送され、サーバー側で名前解決される場合もあります。

2. servers、domains、expectIPsの役割

dns.serversはDNSサーバーの一覧です。単純なアドレスのほか、ドメインの照合条件を含むオブジェクトも指定できます。オブジェクト内のdomainsは、条件に一致したときに優先するDNSサーバーを指定します。expectIPsは、応答されたIPアドレスが想定範囲内かどうかを確認します。後者は接続先のルーティングルールではなく、名前解決結果が正しいことを証明するものでもありません。

項目この記事の設定値役割
servers中国国内向けUDP DNSとリモートDoHカーネルが使用するDNSサーバーを定義します。
address223.5.5.5この例では、通常のIPアドレスをUDP DNSの問い合わせ先として使います。
domainsgeosite:cnドメインの分類に一致した場合、このサーバーを優先します。対応するドメインデータファイルが必要です。
expectIPsgeoip:cnIPアドレスの範囲に基づいて結果を絞り込みます。一致しない場合、今回の結果が破棄され、後続の問い合わせが試されることがあります。
skipFallbacktrue通常のフォールバック問い合わせには使われませんが、このサーバー自身のドメインルールから選択される場合があります。
queryStrategyUseIPv4まずIPv6経路の影響を切り分けるため、この記事ではIPv4アドレスのみ問い合わせます。

geosite:cnはデータセット内のドメイン分類であり、末尾が.cnのドメインすべてを指すわけではありません。geoip:cnも使用するIPアドレスデータベースに依存します。地域をまたぐCDN、企業専用線、データベースの更新状況などによって判定が変わることがあります。そのため、「中国国内のドメインから海外IPが返った」というだけでDNS汚染と判断することはできません。

結論:まず分類を確認し、その後にIPアドレスの絞り込みを設定

中国国内のWebサイトでexpectIPsを設定した後に名前解決できなくなった場合は、まず一時的にこの制限を外し、返されるIPアドレスを比較してください。正常なCDNの振り分けだと確認できたら、そのドメイン専用のDNS設定を行いましょう。分類の問題を隠すためにノードを何度も変更するのは避けてください。

3. 中国国内向け優先DNSとリモートDoHの設定例

ここでは「中国国内のドメイン分類には国内DNSを優先し、それ以外の問い合わせにはリモートDoHを使う」という基本構成を紹介します。最初の項目は一般公開されている中国国内向けDNSであり、家庭用ルーターのアドレスではありません。通信事業者の社内ドメインを解決する場合は、実際の社内DNSを別途指定してください。2番目の項目にはIPアドレス形式のDoHアドレスを使い、DoHサーバー名を解決するための追加問い合わせを避けます。

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

これは完全なconfig.jsonではありません。既存のトップレベル設定にdnsオブジェクトを統合してください。同じJSONオブジェクト内に、同名のキーを重複して追加することはできません。DNS設定がすでにある場合は、設定断片を前後に貼り付けるのではなく、既存の項目を編集してください。JSONに説明用のコメントを直接追加することもできません。

  1. これらの項目に対応したV2FlyまたはXrayカーネルが動作していることを確認し、現在のカーネルの起動ログを確認してください。クライアント名とカーネルのバージョンは別のものです。
  2. カーネルがcn分類を含むドメインデータベースとIPアドレスデータベースを読み込めることを確認してください。データが見つからない場合は、まず読み込みエラーを解消します。
  3. 既存のinboundsとoutboundsはそのまま残し、DNS設定を統合します。設定を再読み込みした後、エラーログを確認してください。
  4. まず少数の既知のドメインで動作を検証し、問題がなければ対象を段階的に広げます。ネットワークでIPv6が必要な場合は、デュアルスタック接続を確認してから問い合わせ方法を調整してください。

4. DNS問い合わせを適切なアウトバウンドに通す

DoHアドレスを設定しても分かるのは問い合わせプロトコルだけで、通信の出口は決まりません。通常のhttps://形式で行う内蔵DoHの通信は、カーネルのルーティング設定に従います。デフォルトのアウトバウンドが直接接続なら、リモートDoHにも直接接続する可能性があります。通常のルーティングを迂回するローカル名前解決の形式と混同しないでください。また、「暗号化されている」ことは「プロキシ経由で通信している」ことを意味しません。

53
国内DNSの例で使うUDPの宛先ポート
443
DoHの例で使うHTTPSの宛先ポート
10808
後述のテストで使用するローカルSOCKSポート

以下のルーティング例では、directとproxyというタグのアウトバウンドがすでにあるものとします。設定内の実際のtagに合わせて置き換えるか、対応するアウトバウンドを先に設定してください。例ではIPアドレスとポートを指定してDNS接続だけを対象にし、これらの宛先への全通信が同じルールに含まれないようにしています。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": ["223.5.5.5"],
        "port": "53",
        "network": "udp",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["1.1.1.1"],
        "port": "443",
        "network": "tcp",
        "outboundTag": "proxy"
      }
    ]
  }
}

この2つのルールを既存のrouting.rulesに統合し、先に一致する可能性がある広範なルールより前に置いてください。ルールは上から順に照合されます。前のルールで一致した場合、後続のDNS専用ルールは適用されません。この設定断片が制御するのはDNSサーバーへの接続であり、Webサイトの振り分け全体ではありません。

5. v2rayNとAndroidクライアントでの動作確認

v2rayNでは通常、ノード設定からクライアントが設定ファイルを生成します。実行ディレクトリにある一時設定を直接編集すると、ノード切り替えや再起動で上書きされることがあります。使用中のバージョンで提供されるDNS設定またはカスタム設定の画面から保存し、実際に生成された設定を確認してください。v2rayNGはXrayカーネル、v2flyNGはV2Flyカーネルを使用します。クライアント独自のリモートDNS、VPN、ルーティングの設定は、ネイティブのJSON項目と必ずしも同じではありません。

  1. 変更前の状態を記録:元の設定を保存し、現在のノード、ローカルの待ち受けポート、システムDNS、ブラウザーのセキュアDNSの状態を記録します。DNS設定は一度に1項目だけ変更してください。
  2. 接続先を確認:以下のコマンドは、ローカルに127.0.0.1:10808のSOCKSインバウンドがあることを前提としています。クライアントに別のポートが表示されている場合は、先にコマンドを変更してください。このポートがすべてのバージョンで標準とは限りません。
  3. 経路を比較:アプリがローカルで名前解決する場合と、ドメイン名をプロキシに渡す場合をそれぞれテストします。結果が異なる場合は、名前解決がどこで行われたかをさらに確認する必要があります。
  4. ログを確認:log.loglevelを一時的にinfoに設定し、リクエストの時刻と照らし合わせてDNSおよびアウトバウンドの記録を確認します。ログの詳細はカーネルによって異なります。必要に応じて一時的にdebugにし、確認後は元のレベルに戻してください。
curl --socks5 127.0.0.1:10808 -I https://www.qq.com
curl --socks5-hostname 127.0.0.1:10808 -I https://www.qq.com
nslookup www.qq.com 223.5.5.5

1つ目のコマンドでは、通常curlがローカルでWebサイトのドメイン名を解決します。2つ目はドメイン名をSOCKSプロキシに渡すため、その後どこで名前解決されるかはカーネルのルーティングとアウトバウンドによって異なります。したがって、2つ目が成功しても、ローカルの内蔵DNSが使われた証明にはなりません。3つ目は指定した公開DNSへの直接問い合わせであり、DNSサーバーへの接続性を比べるためのものです。dns.serversが適用された証明にはなりません。Windows PowerShellでコマンドのエイリアスによる違いがある場合は、curl.exeを使ってください。

結論:Webサイトが開くかどうかだけでなく、DNSの問い合わせ経路で設定を検証

変更後は対象のアプリを再起動し、必要に応じてキャッシュが更新されるまで待つか、該当するキャッシュを消去してからテストを繰り返してください。期待する名前解決の記録がログにない場合は、まずリクエストがカーネルに届いているかを確認します。Webサイトが開けたことや、1回だけ応答速度が変わったことを根拠に、DNS振り分けが完了したと判断しないでください。

6. DNS汚染対策とよくあるトラブル

DNS汚染対策では、問い合わせの通信経路、DNSサーバーの信頼性、結果が使われる場所、フォールバックの動作が重要です。DoHはクライアントとDoHサーバー間の通信を保護できますが、分類ミス、プロキシ出口への接続障害、アプリ独自の名前解決を自動的に解決するものではありません。expectIPsはIPアドレスの範囲を制限するだけです。暗号化通信の代わりにはならず、すべての誤った応答を検出できるわけでもありません。

expectIPsを設定したら、中国国内のWebサイトに接続できなくなった場合は?

まず、そのDNSサーバーのexpectIPsを一時的に外し、設定を再読み込みして同じドメインを問い合わせてください。正常な海外CDNのIPアドレスが返る場合は、そのドメインのDNS設定を調整するか、IPアドレスデータベースを確認します。すべての結果を中国国内のIPアドレスに限定するのは避けてください。

リモートDoHを設定したのに、ローカルDNSへの問い合わせが見えるのはなぜ?

まず、どのプロセスからの問い合わせかを確認してください。ブラウザー、システムサービス、プロキシを使わないアプリは、個別に名前解決することがあります。プロキシノードのドメイン名にも、接続前の名前解決が必要な場合があります。システムDNS、ブラウザーのセキュアDNS、クライアントのDNS制御設定を確認してください。dnsの項目だけを変更しても解決しないことがあります。

Webサイトの表示が遅いのは、DNSサーバーの数が足りないから?

まず、名前解決の待ち時間、TCP接続の確立、TLSハンドシェイクにかかる時間を切り分けてください。中国国内向けの優先DNSを1つ、接続可能なリモートDoHを1つ設定した状態を基準にし、タイムアウトとフォールバックの記録を確認します。応答しないDNSサーバーを複数追加すると待ち時間が増えたり、問い合わせ先が広がったりすることがあります。

JSONを編集したのに、ノードを切り替えると元に戻るのはなぜ?

クライアントが実行用の設定を再生成した可能性があります。クライアントが対応するDNS設定またはカスタム設定の画面から保存し、ノード切り替え後に生成された設定を確認してください。サブスクリプションによる更新はノード情報を更新するものであり、一時設定に加えた手動変更が自動的に保存されるわけではありません。

IPv4だけの設定を長期間使っても問題ない?

UseIPv4はデュアルスタック環境の影響を切り分けるのに適していますが、IPv6アドレスの問い合わせは行われなくなります。ネットワークとプロキシの出口の両方でIPv6が安定して利用できる場合は、UseIPを試し、IPv4・IPv6それぞれのルーティングとアプリの動作を確認してください。

最終的に、次の3点を確認できる状態にします。ドメイン名がどの層で解決されるか、DNS接続がどのアウトバウンドを通るか、名前解決に失敗した場合にどこへフォールバックするか。トップレベル設定の関係を確認するには設定項目を、プロキシ、カーネル、ルーティングの用語を確認するには用語集をご覧ください。

クライアントをダウンロード