ShadowrocketのDNSエラーを解決する方法|遅延テストは正常なのにWebサイトが開けない場合

遅延テストに数値が表示されるのにWebサイトが開けない場合、DNSが原因かもしれません。DNS設定の意味を確認し、手順に沿って問題の箇所を特定します。

この記事の要点

遅延テストに数値が表示されても、Webサイトへの接続が正常とは限りません。利用中のサービスやサブスクリプションがあり、Shadowrocketに接続できるのにWebサイトが開けない場合は、失敗したドメイン名とネットワークを記録し、DNSの応答、DNSリクエストの経路、Global Routingの順に確認します。設定を一つずつ比較し、ドメイン不存在、名前解決のタイムアウト、ルールの振り分けミス、Webサイトへの接続障害を切り分けます。

遅延テストが正常でも、確認できるのはテスト先の応答だけ

Shadowrocketの遅延テストと、ブラウザでWebサイトを開く操作は別のものです。テスト方法によって確認できる範囲も異なります。接続先のポートから応答があっても、プロキシ認証、対象ドメインの名前解決、TLSハンドシェイク、Webページのリソース読み込みが成功したとは限りません。HTTPリクエストを含むテストでも、そのテスト先にその時点で接続できたことを示すだけで、実際に開けないWebサイトの確認にはなりません。

ドメインの名前解決 ルールの判定 外向き接続 TLSハンドシェイク Webページの読み込み

この流れはアクセスに必要な主な段階を示したもので、すべてのプロトコルが必ずこの順序で動作するわけではありません。プロキシサーバーのアドレスにドメイン名を使う場合は、その名前も先に解決する必要があります。また、接続先Webサイトのドメイン名をリモート側で解決する場合もあります。まず「サーバーのアドレス」と「Webサイトのアドレス」のどちらで問題が起きているかを切り分けてから、変更箇所を判断してください。

状況を記録してから、条件を一つだけ変えて比較する

調査中は元の設定を残し、サーバー、DNS、ルールを同時に変更しないでください。以下ではiPhoneを例に説明しますが、iPadでも同じ考え方で確認できます。テストには、ユーザー自身が用意したサーバーとサブスクリプションを使用してください。サブスクリプションを更新できても、配信元のアドレスを読み取れたことを示すだけで、個々のサーバーやすべてのWebサイトに接続できるとは限りません。

  1. Homeで選択中のサーバー、接続スイッチの状態、Global Routingの選択内容を記録します。Configでは、現在有効になっている構成ファイルを確認します。
  2. 開けないURLのホスト名、発生時刻、Wi-Fiかモバイル通信か、ブラウザに表示されたメッセージを記録します。記録を共有する前に、サブスクリプションのURL、パスワード、トークンを隠してください。
  3. 接続をオフにし、現在のローカルネットワークから通常直接アクセスできるWebサイトを試します。それでも開けない場合は、ローカルネットワークやWeb認証を先に確認してください。
  4. 同じサーバーとWebサイトを使って再接続し、もう一度アクセスします。設定を変更するたびに古いタブを閉じ、新しいタブで試して、既存の接続による影響を減らします。
  5. 必要に応じてWi-Fiとモバイル通信を一度比較しますが、DNSは同時に変更しないでください。ネットワークを切り替えたときの違いから、ローカルルーターや通信事業者のネットワークの影響を判断できます。

DNS設定ごとの役割

Settings → DNSでアプリのDNS設定を確認し、Configで現在の構成にある[General]を確認します。構成によっては、DNSサーバー、名前解決の方針、ドメインごとの指定結果が同時に関係します。実際に有効な構成を確認してください。入力欄にアドレスがあるだけで、すべてのリクエストがそのアドレスを使うとは限りません。

項目役割確認ポイント
System DNS現在のシステムまたはネットワークが提供するDNSを使用します。Wi-Fiを切り替えると名前解決の環境も変わることがあります。固定のパブリックDNSアドレスではありません。
dns-server構成ファイル内のDNSサーバー設定です。アドレスの入力ミスや形式だけでなく、リクエストがサーバーに届くかも確認します。
DNS over HTTPSDNSクエリをHTTPSで送信します。通常はTCP 443を使用します。接続先のエンドポイントにアクセスできることに加え、証明書の検証も必要です。エンドポイントにドメイン名を使う場合は、最初の名前解決も関係します。
通常のDNS通常はUDP 53を使い、状況によってはTCP 53を使います。現在のネットワークが該当する通信を制限していないか、応答がタイムアウトしていないかを確認します。Webサイトが使用するポート443への接続とは別です。
[Host]指定したホスト名に静的なアドレスを割り当てます。古いアドレスが通常の名前解決を迂回し、ドメイン名を解決できてもWebサイトには接続できない原因になることがあります。

たとえば、構成ファイルの次の1行はシステムDNSを使う設定を示します。これは構文の例であり、既存の設定を置き換えるための完全なファイルではありません。変更前に元の値を保存してください。ユーザー自身が利用するサービス事業者から提供された構成の場合は、DNSに関する設定内容を確認してから、一部だけを変更してテストします。

[General]
dns-server = system

結論:名前解決に関する変数は一度に一つだけ変更する

サーバー、Global Routing、対象ドメインをそのままにして、現在のDNS設定とシステムDNSを比較します。設定変更に合わせて障害が再現する場合は、名前解決サービスとリクエスト経路をさらに調べます。

応答状態からDNSエラーを3種類に切り分ける

ブラウザの「サーバーが見つかりません」という表示だけでは、原因を特定できないことがほとんどです。利用できる接続ログや診断結果がある場合は、DNSの応答状態、クエリしたドメイン名、タイムアウトの情報を確認してください。以下は一般的なDNSの状態や診断用語です。Shadowrocketのすべての画面に、これらの文言がそのまま表示されるという意味ではありません。

エラー:NXDOMAIN

原因と対処:名前解決サーバーが、照会されたドメイン名は存在しないと応答しています。まず完全なホスト名と入力ミスを確認し、別の名前解決経路でも比較して、実際に存在しないのか、特定の名前解決サーバーによる異常な応答なのかを切り分けます。

エラー:SERVFAIL

原因と対処:名前解決サーバーがクエリを完了できませんでした。上位DNSサーバーの障害や検証エラーなどが考えられます。ドメイン名と発生時刻を記録し、利用可能な別の名前解決経路で再テストします。繰り返し発生する場合は、記録を利用中のサービス事業者に提示してください。

エラー:timeout

原因と対処:制限時間内にクエリへの応答がありませんでした。DNSサービスのアドレスと通信経路を確認し、同じ設定のままWi-Fiとモバイル通信を切り替えて、特定のネットワークだけでタイムアウトするか調べます。

「AAAAレコードがない」状態と「ドメイン名が存在しない」状態は区別してください。AAAAはIPv6アドレス、AはIPv4アドレスに対応します。ドメインにAレコードしかなくても、必ずしも問題ではありません。アドレスが返されているのに、その後の接続が止まる場合は、DNSを繰り返し変更せず、アドレスファミリーの到達性、ルーティング、TLSを確認します。

Global RoutingでDNSの問題とルールの問題を切り分ける

Home → Global Routingで、Configは現在の構成に従って通信を処理し、Proxyは対象の通信をプロキシ経由にし、Directは対象の通信を直接接続します。モードを切り替えると原因の特定に役立つことがありますが、DNSだけを切り替える操作ではありません。接続先への経路やリモートで名前解決される可能性なども変わる場合があります。

  1. まずConfigの状態で障害を再現し、ドメイン名と適用されたルールまたはポリシーを記録します。
  2. 同じサーバーを使ったまま、一時的にProxyへ切り替えて同じドメインにアクセスします。開けるようになった場合は、Configの振り分けルールと選択中のポリシーを優先して確認します。ただし、これだけでDNSが正常だとは断定できません。
  3. 現在のローカルネットワークから通常直接アクセスできる接続先は、一時的にDirectで比較できます。接続先自体にローカルネットワークからアクセスできない場合、Directで失敗してもDNS設定に問題があるとは限りません。
  4. 比較が終わったら元のモードに戻します。Sceneを使用している場合は、現在のシーンで実際にどの接続動作が選ばれているかを確認し、シーンの変化が比較に影響しないようにします。

以下はルール構文の例です。example.comは例示用のドメインで、診断サービスではありません。DOMAIN-SUFFIXはドメインのサフィックス、IP-CIDRはアドレス範囲、GEOIPはIPアドレスの地理情報、FINALは前のルールに一致しなかったリクエストに適用されます。ルールは上から順に確認されます。アドレス関連のルールでは名前解決の結果も関係する場合があるため、最後の行だけを見て判断しないでください。

[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

no-resolveは、該当するアドレスルールとの照合のために追加のドメイン名前解決が行われるのを防ぐ指定です。「すべてのDNSの問題を修復する」設定ではありません。ドメインが前のルールによって利用できない経路に送られている場合、DNSだけを変更しても結果は変わらないことがあります。まず適用されたルールを確認し、そのルールのポリシーや順序を調整してください。

よくある質問:キャッシュ、サブスクリプション、接続の復旧

DNSを変更してもWebサイトが開けないのはなぜ?

まず、変更した設定が現在有効な構成に反映されているか確認し、接続を再確立して新しいタブでWebサイトを開きます。アプリやシステムにキャッシュや古い接続が残っていることがあります。アドレスが返されているのに接続できない場合は、DNSアドレスを追加し続けるのではなく、ルール、外向き接続、TLSを確認してください。

サブスクリプションを更新できれば、DNSに問題はない?

いいえ。サブスクリプションのアドレス、プロキシサーバー、接続先Webサイトでは、異なるドメイン名や通信経路が使われることがあります。Homeでサブスクリプションの更新結果とサーバーの状態をそれぞれ確認し、開けないホスト名を個別に調べてください。すでにある構成は保持し、更新によって新たなテスト条件が加わらないようにします。

Wi-Fiだけで失敗する場合、サーバーを変更するべき?

サーバーとDNSはそのままにして、モバイル通信に切り替えて再テストします。そのWi-Fiだけで失敗する場合は、Web認証、ルーターが提供するDNS、ネットワークの制限を確認してください。原因が分かるまでは、プロトコルとサーバーを同時に変更する必要はありません。

証明書エラーもDNSの問題?

必ずしもそうではありません。証明書エラーは通常、TLSの確認段階まで進んだことを示します。デバイスの日時、対象ドメインと証明書の一致を確認してください。誤ったアドレスに名前解決された結果、証明書エラーが起こることもありますが、証明書の検証を無効にして問題を隠さないでください。

復旧後は同じ条件で再テストする

Webページを一度開けただけでは、そのときに成功したことしか分かりません。復旧後は、最初に失敗したネットワーク、元の対象ドメイン、普段使うモードで再テストし、ページ内の関連リソースもすべて読み込まれるか確認します。トラブル対応では、変更した設定の数ではなく「どの条件を変えたら復旧したか」を記録することが重要です。

結論:失敗した段階に応じて次の確認箇所を決める

応答がなければDNSリクエストの経路を、存在しないという明確な応答があればドメイン名を、アドレスが返されていれば接続とルールを確認します。各手順で比較結果を記録すれば、設定を何度も上書きせずに原因を絞り込めます。

App Storeでダウンロード