サブスクリプションを読み込めるものの、一部サイトで名前解決に失敗する、初回接続が遅い、中国国内サイトへの経路が遠回りになる、といった人向けの記事です。DNSの解決経路とプロキシ通信の経路を分けて考え、中国国内のドメインはローカルの上流DNS、海外ドメインはDoHへ振り分ける設定を作り、ログ・解決結果・ルーティングルールから原因を特定します。
まずDNSとルーティングの2つの選択を理解する
ドメインへアクセスするとき、クライアントは通常まずIPアドレスを取得し、その後にTCPまたはUDP接続を確立します。DNSは「ドメインをどのアドレスに解決するか」を決め、ルーティングルールは「どの出力先から接続するか」を決めます。両者は関係していますが、同じ処理ではありません。ドメインの振り分けルールだけを設定しても、DNSクエリが必ず同じ経路を通るとは限りません。
V2RayまたはXrayの設定にあるdnsオブジェクトは、上流DNSの選択、結果のキャッシュ、クエリポリシーの制御を担当します。routingオブジェクトは、ドメイン、IP、ポート、プロトコル、インバウンドタグを照合します。アプリがすでに端末上で名前解決を済ませている場合、コアが受け取るのは宛先IPだけになり、ドメインだけを条件にしたルールが一致しないことがあります。
システムプロキシとTUNモードも通信経路に影響します。ブラウザーがSOCKSまたはHTTPプロキシへドメイン名のままリクエストを送る場合、コアは通常元のドメインを確認できます。一方、TUNモードではクライアントがシステム通信とDNSリクエストを引き受ける必要があります。v2rayN、v2rayNG、v2flyNGでは画面上の項目が異なりますが、判断の原則は同じです。まず誰がクエリを開始したかを確認し、次にどの経路を通ったかを確認します。
中国国内外でDNSを振り分けるメリット
中国国内向けサービスでは、地域に応じて配信先を切り替えるCDNがよく使われます。同じドメインでも、地域の異なるDNSリゾルバーに問い合わせると、異なるデータセンターのアドレスが返ることがあります。中国国内のドメインを近い地域のローカル上流DNSで解決すれば、適切なエッジノードを取得しやすくなります。海外ドメインを安定して利用できるDoH上流へ送れば、誤応答、クエリのタイムアウト、書き換えられた結果による接続障害も抑えられます。
目指すべきなのは、すべてのクエリを1つのパブリックDNSへ送ることではなく、問い合わせの経路とアクセス目的を一致させることです。代表的な方法はgeosite:cnで中国国内のドメインを照合し、geoip:cnで返されたアドレスを確認し、それ以外のドメインを指定したDoH上流へ送る構成です。ルールデータはクライアントまたはコアとともに更新してください。更新しないと、新しいドメインがフォールバックルールへ入ることがあります。
中国国内ドメインの名前解決
- ドメインリスト
- geosite:cn
- 上流アドレス
- 223.5.5.5
- ポート
- 53
- 結果の範囲
- geoip:cn
中国国内のネットワークアクセスに適したCDNアドレスを優先して取得します。
海外ドメインの名前解決
- ドメインリスト
- geolocation-!cn
- 上流プロトコル
- DoH
- サービスアドレス
- 1.1.1.1
- 接続ポート
- 443
HTTPSでクエリを送信し、既存のルーティングに従って出力先を決めます。
expectIPsは結果を絞り込む条件であり、ドメインを特定地域へ強制的に割り当てるものではありません。中国国内の上流DNSがgeoip:cnに一致しないアドレスを返した場合、コアは後続のリゾルバーを試行できます。中国国内のサイトでも海外のアドレスを使うことがあるため、条件を厳しくしすぎると問い合わせが繰り返されます。その場合は、すべての検証を削除するのではなく、対象ドメインにより細かな例外を追加します。
- よく使うLAN内の名前は
hostsに登録できます。たとえば、ルーターの管理用ドメインを192.168.1.1に固定できます。 - IPv4ネットワークしかない場合は
UseIPv4を優先し、AAAAレコードを取得した後に到達不能なIPv6接続のタイムアウトを待つ事態を避けます。 - 安定したIPv6の出口が利用できる場合にのみデュアルスタックの問い合わせを有効にし、直接接続とプロキシ経由の出力先の両方でIPv6へアクセスできることを確認します。
読みやすいDNS振り分け設定
以下の例では、Xrayでよく使われるDNSフィールドの書式を用いて構造を説明します。V2RayやXrayのコアはバージョンによって対応フィールドが異なる場合があるため、読み込む前に現在のクライアントが生成する設定形式を確認してください。v2rayNではまず「設定」→「パラメータ設定」を開き、現在のコア種別を確認します。その後「サーバー」→「カスタム設定サーバーを追加」から完全なJSONを読み込めます。
{
"dns": {
"hosts": {
"domain:router.local": "192.168.1.1"
},
"queryStrategy": "UseIPv4",
"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"
]
}
}
リストの順序とドメイン条件によって、使用するリゾルバーが決まります。1つ目のサービスは中国国内ドメイン、2つ目は明確に分類された海外ドメインを処理し、localhostはどの分類にも一致しない場合のフォールバックになります。未知のドメインもすべてDoHへ送る場合は、現在のコアがfallbackとドメイン照合をどう処理するか確認してからフォールバックの順序を調整してください。感覚だけで配列の順番を入れ替えるのは避けましょう。
- 現在接続できている設定を先にバックアップし、唯一の設定を直接何度も上書きしないでください。
- 中国国内のDNS上流を1つだけ追加し、よく使う中国国内サイトが正常に名前解決され、開けることを確認します。
- 次にDoH上流を追加し、以前問題のあった海外ドメインをテストしながら、コアのログに出るクエリエラーを確認します。
- 最後に
expectIPs、IPv4ポリシー、hostsルールを追加します。変更は毎回1項目だけにしてください。 - 完了後はコアを再起動するか設定を再読み込みし、古い接続やDNSキャッシュが結果に影響しないようにします。
DNS振り分けにはルーティングルールも必要
DNSが正しいアドレスを返すのは、「どこへ接続するか」を解決したにすぎません。中国国内の接続を直接接続にし、それ以外をプロキシへ送るには、照合順序が明確なルーティングルールも必要です。一般的には、まずLANと予約アドレスを処理し、次に中国国内のドメインとIPを処理し、最後に一致しなかった通信をプロキシの出力先へ送ります。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
IPIfNonMatchは、ドメインルールに一致しなかった場合に、コアが対象ドメインを解決してからIPルールを試せることを示します。これは「すべてのドメインを事前に解決する」スイッチではなく、中国国内外のDNS上流を自動作成するものでもありません。設定がAsIsの場合、コアはドメイン照合の流れを維持する傾向があり、IPルールに直接一致できるのはIPを宛先とする場合だけです。
結論:DNSルールと通信ルールは必ずセットで確認する
中国国内のドメインをローカル上流DNSへ送った後は、geosite:cnとgeoip:cnが最終的に直接接続の出力先を指すことも確認します。海外ドメインでDoHを使う場合は、DoHのHTTPS接続と対象サイトへの接続の両方が、想定した出力先から確立できることを確認してください。
| 現象 | 優先して確認する項目 | 判断材料 |
|---|---|---|
| ドメインルールが時々一致しない | アプリが事前に名前解決していないか | ログの宛先がIPだけで、ドメイン名が表示されない |
| 中国国内サイトの読み込みが遅い | DNSが返したCDNアドレス | アドレスの地域が現在のネットワークから遠い |
| DoHクエリが継続的にタイムアウトする | 443ポートと出力先のルーティング | ログに接続タイムアウトまたはハンドシェイク失敗が出る |
| 数秒停止してから接続に成功する | AAAAレコードとIPv6の到達性 | IPv6の試行に失敗した後、IPv4へフォールバックする |
DoH設定の要点は、アドレスを1つ置き換えるだけではない
DoHはDNSメッセージをHTTPSリクエストに格納し、通常は443ポートを使います。従来の平文UDPクエリが通信途中で監視・書き換えられる可能性を下げられますが、ルーティング設定の代わりにはならず、上流DNSが返す誤った結果も修正できません。実際の動作は、上流DNSへの到達性、出口経路、キャッシュポリシーに左右されます。
v2rayNでカスタム設定を変更した後は、「設定」→「パラメータ設定」でログレベルを確認し、メイン画面のログ欄を開いてコアの起動情報を確認できます。Android端末でv2rayNGまたはv2flyNGを使う場合は、現在の設定にあるルーティングとDNSの画面を先に確認してから再接続し、VpnServiceセッションに新しい設定を読み込ませます。
- クエリがタイムアウトする:まずDoHアドレスの443ポートへ、想定した出力先から接続できることを確認し、次にドメインの導入用名前解決に問題がないか調べます。
- 循環依存:DoHサービスのドメインを解決するDNSクエリが、まだ確立していない同じDoH接続に再び依存しないようにします。
- キャッシュが更新されない:上流DNSを変更した後はコアを再起動し、テストするアプリも再起動します。ブラウザーとシステムがそれぞれDNSキャッシュを保持している場合があります。
- IPv6が使えるように見えるだけ:システムがIPv6アドレスを取得しても、出口から到達できるとは限りません。一時的に
UseIPv4を使って比較テストしてください。 - ルールデータが古い:クライアントに付属するgeositeとgeoipのデータを更新してコアを再読み込みし、その後にドメイン分類が正しいか判断します。
結論:まず単一のDoH上流を安定させ、予備を追加する
状態の分からないリゾルバーを同時に複数設定すると、タイムアウト、フォールバック、キャッシュ結果が絡み合います。まず確実に到達できる443ポートの上流を1つだけ使ってテストし、その後に予備のリゾルバーを追加すると、ログを読みやすくなります。
テスト対象は3種類用意します。安定した中国国内CDNのドメイン、プロキシ経由でアクセスする海外ドメイン、そしてLAN内の名前です。初回アクセスと2回目のアクセスを続けてテストすると、初回の名前解決時間とキャッシュ後の接続時間を区別できます。初回だけ遅くて次回が速いならDNSとハンドシェイクを重点的に確認し、毎回遅いならルーティング、ノードの遅延、パケットロスを調べます。
DNS汚染と接続障害の切り分け手順
いわゆるDNS汚染では、対象サービスと無関係なアドレスが返る、同じドメインでも異なる解決経路で結果が大きく食い違う、名前解決は成功するのに接続直後にリセットされる、といった症状が現れます。ただし「Webページが開けない」だけでDNSの問題と断定することはできません。ノード障害、システムプロキシの未有効化、誤ったルーティング、IPv6の到達不能でも似た症状が起こります。
切り分けは最短の経路から始めます。まずコアが正常に起動したことを確認し、次にドメインが解決されるか、結果が妥当か、最後に対象接続がどの出力先を使ったかを確認します。v2rayNのログに設定フィールドのエラーが出ているなら、まずJSONを修正します。DNS timeoutなら上流DNSを確認し、IPを取得済みなのに接続できないなら、ルーティングとノードの確認へ進みます。
接続は成功するのに、一部のドメインだけ開けない場合は?
問題のあるドメインと正常なドメインを分けて記録し、ログで宛先がドメインかIPかを確認します。IPしか表示されない場合は、アプリがプロキシの外側で事前に名前解決していないか確認します。ドメインが表示されるのに直接接続へ入る場合は、geositeの分類とルール順を確認してください。
DoHに変更したらすべてのクエリがタイムアウトする場合は?
まず動作する従来のDNSをフォールバックとして1つ復元し、DoHアドレスの443ポートへ現在の出力先から接続できるか確認します。ドメイン形式のDoHアドレスを使う場合は、導入用の名前解決を行える上流DNSも残してください。
なぜ中国国内サイトがプロキシ経路に振り分けられるのか?
ルーティングルールを上から順に確認し、より広いプロキシルールに先に一致していないか調べます。LAN、geosite:cn、geoip:cnのルールをフォールバックのプロキシルールより前に置き、設定を再読み込みしてください。
IPv6を有効にするとWebサイトの初回表示が遅い場合は?
一時的にqueryStrategyをUseIPv4へ変更して比較します。待ち時間がなくなった場合は、ローカルネットワーク、直接接続の出力先、プロキシノードのすべてでIPv6経路が利用できるか確認します。
サブスクリプション更新後にカスタムDNSが消えた場合は?
サブスクリプションのサーバー設定と、クライアント全体のDNS設定は別の場所で管理されている可能性があります。更新前に「設定」→「パラメータ設定」にあるコア項目を記録し、カスタム設定がサブスクリプション生成の設定で上書きされていないか確認してください。
最小構成で比較テストする方法もあります。一時的に、確実に使えるノード1つ、DNS上流1つ、基本的な直接接続ルールだけを残します。最小構成で正常なら、広告フィルター、複雑なドメインリスト、複数の上流DNS、カスタムhostsを1項目ずつ戻します。すべての設定を何度も消去するより、1つずつ追加するほうが競合の原因を見つけやすくなります。
安定した設定に仕上げるための確認項目
DNS振り分けの設定後は、特定のサイトが開くかどうかだけを確認してはいけません。中国国内CDNが直接接続されるか、海外ドメインが想定したリゾルバーを使うか、DoH接続に循環依存がないか、コア再起動後も設定を正常に読み込めるかを確認します。サブスクリプション、クライアント、ルールデータを更新した後も、重要なドメインを再テストしてください。
デスクトップでの確認
- クライアント
- v2rayN
- メニュー項目
- 設定 → パラメータ設定
- システムプロキシ
- 有効になっていることを確認
- ログの宛先
- DNSとrouting
カスタムJSONを変更したらコアを再読み込みし、その後に初回アクセスをテストします。
Androidでの確認
- クライアント
- v2rayNG / v2flyNG
- 接続方式
- VpnService
- バッテリー最適化
- バックグラウンド実行を許可
- 再読み込み方法
- 切断して再接続
システムがバックグラウンド接続を停止していないことを確認してから、DNSが継続的にタイムアウトするか判断します。
- コアの起動ログに未知のフィールド、形式エラー、ポート使用中の警告がない。
- 中国国内ドメインが指定したローカル上流DNSで解決され、返されたアドレスが想定地域に一致している。
- 海外ドメインのDoHクエリが、想定した出力先から443ポートへアクセスできる。
- LANと予約アドレスが優先的に直接接続され、フォールバックのプロキシルールに入らない。
- 現在のネットワークにIPv6がない場合、AAAA接続が何度もタイムアウトを待たない。
- サブスクリプションとルールデータを更新した後も、カスタムDNSとルーティング設定が維持されている。
最終的に安定して使える構成は、通常それほど複雑ではありません。中国国内のドメインは低遅延のローカルリゾルバー、海外ドメインは安定したDoHへ送り、上流DNSの選択とルーティングの出力先を一致させ、各段階をログで確認します。問題が起きたら「コアの起動、DNSクエリ、返されたアドレス、ルールの一致、出力先への接続」の順に調べると、ノードやリゾルバーを次々と交換するより早く原因を特定できます。