Shadowrocketの接続タイムアウト対処法:遅延テスト、プロトコル設定、システム時刻の確認手順

接続できないときは、まず遅延を測定し、次に設定、最後に時刻を確認。Shadowrocketのテスト結果別に、ポート・暗号化方式・通信設定・端末時刻を確認します。

この記事の概要

この記事は、Shadowrocketに自分で用意したサーバーやサブスクリプションを追加済みで、遅延テストのタイムアウト、接続後の通信不能、サブスクリプション更新失敗に悩む方を対象としています。まず障害の範囲を確認し、サーバーアドレス、ポート、認証、通信パラメータを調べます。その後、Global Routing、On Demand、サブスクリプションの状態、システム時刻の影響を切り分け、最後にConnectivity Testで再確認します。

まず遅延テストで障害範囲を切り分ける

遅延テストは、Shadowrocketが制限時間内に対象への確認を完了できるかを判断するための機能で、回線速度を測るものではありません。数十ミリ秒や数百ミリ秒と表示されても、テスト時点で応答が到達したことを示すだけです。timeoutと表示された場合は、制限時間内に応答が返りませんでした。サーバーの停止、アドレス解決の失敗、ポート不通、通信方式の不一致、現在のネットワーク制限などでも同じタイムアウトが起こります。

timeoutと表示されたからといって、パスワード、ポート、ルールを一度に変更しないでください。まずHomeで複数の既存項目に同じ遅延テストを実行し、結果を記録します。1つの項目だけがタイムアウトする場合は、その項目の設定を重点的に確認します。同じサブスクリプションの項目がすべてタイムアウトする場合は、サブスクリプションが更新済みか、サービス提供元が設定を変更していないかを確認します。すべての取得元でタイムアウトする場合は、現在のネットワークを切り替え、システム設定を確認するのが先です。

  1. 古いセッションを終了する

    Homeに戻り、接続スイッチをオフにして数秒待ちます。前回の未完了の接続が解放されてから、テストを開始してください。

  2. 項目を1つずつテストする

    まず現在選択中のサーバーをテストし、次に同じサブスクリプションから異なるアドレスを2つ選んで再テストします。1件の結果だけで全項目を判断しないようにしてください。

  3. ネットワークを切り替えて再テストする

    利用可能なWi-Fiとモバイル通信でそれぞれテストします。接続ネットワークによって結果が変わる場合、設定ファイルそのものよりも現在のネットワーク経路に問題がある可能性が高くなります。

  4. 現象を記録する

    すぐに失敗するのか、待ち続けた後にtimeoutになるのか、遅延は表示されるものの接続後に通信がないのかを記録します。これら3つの現象では、確認すべき箇所が異なります。

エラー:Request timed out

原因と対処:テストの制限時間内に対象から応答が返りませんでした。アドレス、ポート、現在のネットワーク経路に到達できない可能性があります。同じグループの別項目と別の接続ネットワークで比較テストを行い、その後に個別の設定を確認してください。

エラー:Connection refused

原因と対処:対象アドレスには到達できていますが、該当ポートへの接続が拒否されています。ポートの入力ミスがないか確認し、サービス提供元にそのポートが現在有効か問い合わせてください。

エラー:Network is unreachable

原因と対処:端末に利用可能な経路がないか、ネットワーク状態が切り替わった直後です。端末がインターネットに接続されていることを確認し、接続スイッチをオフにして、ネットワークが安定してから再テストしてください。

結論:まず範囲を特定し、先にプロトコルを変更しない

1項目だけ失敗する場合はその項目のフィールドを確認し、同じ取得元がすべて失敗する場合はサブスクリプションの状態を確認します。すべての取得元が同時に失敗する場合は、接続ネットワークとシステム設定を確認してください。一度に変更する変数を1つに絞ると、再テスト結果を正しく判断できます。

プロトコルと通信パラメータを順番に確認する

最初に確認するのはアドレスとポートです。Addressにはサービス提供元から指定されたドメインまたはIPを入力し、Portは元の設定と完全に一致させます。443、8443、2053などはよくある例にすぎず、相互に置き換えられるものではありません。ポートがHTTPSらしく見えるからといって、自己判断で443に変更しないでください。ドメイン内の余分な空白、ポート番号の1桁抜け、古いアドレスへの貼り付けでも、接続はタイムアウトで止まります。

次に認証フィールドを確認します。ShadowsocksではPasswordとMethodを一致させる必要があります。VMessとVLESSでは通常UUIDを確認し、TrojanではPasswordを確認します。Hysteria2では認証値とサーバー側ポート、WireGuardではローカルのPrivate Key、対向側のPublic Key、Endpoint、Address、Allowed IPsを確認します。フィールド名が似ていても、値を異なるプロトコル間で使い回せるとは限りません。

3つ目は通信とセキュリティの設定です。TLSを使用する場合、Server NameまたはSNI、証明書検証の状態、対象ドメインはサービス提供元の情報どおりに入力します。WebSocketを使用する場合は、HostとPathも確認してください。たとえばPathが/wsの場合、先頭のスラッシュを省くとハンドシェイクに失敗することがあります。Hysteria2はUDPとQUICを使用するため、同じ設定が一方の接続ネットワークでは使えて別のネットワークではタイムアウトする場合、UDP経路の違いも確認対象に含めます。

例:フィールド構造の確認用であり、利用可能なサーバーではありません
Address: server.example.com
Port: 8443
Transport: websocket
TLS: enabled
Host: edge.example.com
Path: /ws

エラー:TLS handshake failed

原因と対処:TLSハンドシェイクが完了していません。SNI、ドメイン、証明書検証、システム時刻の不一致がよくある原因です。元の設定に従ってServer Nameを確認し、端末の日付とタイムゾーンが正しいことを確認してください。

エラー:Authentication failed

原因と対処:認証値または暗号化パラメータがサーバー側と一致していません。Password、UUID、認証値をもう一度コピーし、古いサブスクリプションのフィールドを混用していないか確認してください。

Global Routing、Config、On Demandを確認する

遅延テストでは結果が返るのに、接続を開始するとWebページを開けない場合は、サーバーへの到達性ではなく通信経路を確認します。ShadowrocketのGlobal RoutingにはProxy、Direct、Config、Sceneなどのモードがあります。Proxyは対象の通信を現在のプロキシ経由で処理し、Directは直接接続します。Configは現在の設定ファイルのルールで行き先を決め、Sceneは設定したシーンに応じて切り替えます。テスト時にどのモードが使われているかを明確にしてください。

Global RoutingがDirectのままだと、端末にはシステムVPNが確立されたように表示されても、Webリクエストが選択したサーバーを経由しない場合があります。Configを使う場合は、ルール末尾のFINALの行き先を確認し、対象ドメインが前方のDOMAIN-SUFFIX、GEOIP、IP-CIDRルールに先に一致していないか確認します。ルールは上から順に判定され、先に一致した結果が適用されます。

アプリがリクエストを開始システムVPNトンネルGlobal Routingルールを順番に照合選択した送信先
DOMAIN-SUFFIX,example.com,Proxy
IP-CIDR,192.168.0.0/16,Direct
GEOIP,CN,Direct
FINAL,Proxy

上の例では、example.comのサフィックスに一致するリクエストはProxyを使用し、ローカルネットワークのアドレスとGEOIP条件に一致する通信はDirectを使用します。それ以外のリクエストはFINALによってProxyに渡されます。FINALをDirectにすると、前のルールに一致しないリクエストはプロキシを経由しません。これはサーバーが無効なのではなく、ルールの結果とテスト対象が異なるということです。

On Demandはネットワーク条件に応じて接続を開始します。手動接続の問題を切り分けるときは、Settings → On Demandで現在の状態を確認し、自動トリガーを一時的にオフにしてからテストしてください。ネットワーク切り替え時に「オフにした直後に再接続する」「選択したサーバーがSceneによって書き換えられる」といった現象を防げます。テスト完了後は、元の用途に合わせて設定を戻してください。

接続スイッチがオンなのに、Webページがタイムアウトするのはなぜ?

まずHomeで現在選択されているサーバーを確認し、Global RoutingがDirectになっていないか確認します。その後Connectivity Testを実行し、DNS、TCP、プロキシリクエストのどの段階で失敗しているかを切り分けます。

Configに切り替えると一部のWebサイトだけ失敗するのはなぜ?

Config内のDOMAIN-SUFFIX、GEOIP、IP-CIDR、FINALの順序を確認します。対象ドメインとルールを1つずつ照合し、実際にProxyとDirectのどちらに一致したかを確認してください。

接続をオフにしたのに、なぜ再びオンになる?

Settings → On Demandで自動接続の条件を確認します。切り分け中はOn Demandを無効にし、手動で再テストしてから元の設定に戻してください。

サーバーを変更しても古い結果が表示される場合は?

接続スイッチをオフにし、Homeで新しい項目が選択状態になっていることを確認します。数秒待ってから再接続し、Connectivity Testをもう一度実行してください。

サブスクリプション更新失敗時はリンクと項目を分けて確認する

サブスクリプションの更新とサーバー接続は別の経路です。更新では指定したURLから設定一覧を取得し、サーバー接続では一覧内の具体的なアドレスとパラメータを使用します。既存の項目は接続できても、サブスクリプションURLが期限切れになっている場合があります。逆に、サブスクリプションの取得に成功しても、一覧内の特定サーバーがポートや設定の変更によってタイムアウトすることがあります。

サブスクリプションの構造を確認する例として、https://example.com/sub?token=xxxxのように記述できます。ただし実際の操作では、自分のサービス提供元から取得した有効なリンクを使用してください。Tokenの欠落、コピー時の途中切れ、リンク前後の空白、サービス提供元によるアドレス変更はいずれも更新失敗の原因になります。当サイトはサブスクリプションを提供せず、具体的なサービス提供元の選択も推奨しません。

  1. 元のリンクを確認する

    Subscribe項目を編集し、サービス提供元の原文と照合してプロトコルヘッダー、ドメイン、パス、疑問符、tokenを確認します。コピーによって入った先頭と末尾の空白は削除してください。

  2. 更新を単独で実行する

    Homeに戻ってプルダウン更新し、1つのSubscribeだけが失敗しているのか、すべての取得元が失敗しているのかを確認します。まだ使えるサーバー項目を先に削除しないでください。

  3. 更新経路を確認する

    サービス提供元が現在の接続経由でサブスクリプションへアクセスするよう指定している場合は、Settings → SubscribeでUpdate via Proxyを確認します。有効にする前に、現在のサーバーが接続できることを確認してください。

  4. 更新結果を再確認する

    更新完了後、項目数と名前に変化があるか確認します。次に1つの項目を選択して遅延テストを実行し、新しいパラメータが実際に読み込まれていることを確認してください。

エラー:Failed to load subscription

原因と対処:サブスクリプションリンクから有効な内容を取得できませんでした。アドレスの期限切れ、tokenの欠落、アクセス経路の制限などが考えられます。サービス提供元にリンクの有効性を確認し、Homeでプルダウン更新を行ってください。

エラー:The request timed out

原因と対処:サブスクリプションのリクエストが制限時間内に完了しませんでした。まず端末のネットワークが正常か確認します。Update via Proxyが有効な場合は、現在選択中のサーバーに接続できることも先に確認してください。

エラー:Invalid URL

原因と対処:リンク形式を解析できません。https://が欠けていないか、疑問符以降のパラメータを誤って削除していないか確認し、リンク内の改行と空白を取り除いてください。

結論:更新失敗は、すべてのサーバーが無効という意味ではない

まずサブスクリプションURLと既存サーバー項目を分けて検証します。サブスクリプションを削除する前に現象と元のパラメータを保存しておくと、「一覧の取得失敗」を「すべてのサーバーに到達できない」と誤認せずに済みます。

システム時刻を調整し、ネットワーク切り替えに対処する

TLS証明書の検証、タイムスタンプを使う認証処理、一部のプロトコルハンドシェイクは端末の時刻に依存します。日付、タイムゾーン、時計のずれが大きいと、TLSハンドシェイク失敗や認証失敗、複数回の再試行後のtimeoutとして現れることがあります。日付を手動で変更した場合、タイムゾーンをまたいだ後に状態が同期されていない場合、端末が長時間ネットワークに接続されていなかった場合は、システム時刻を確認項目に含めてください。

iPhoneまたはiPadでSettings → General → Date & Timeを開き、Set Automaticallyを確認します。Time Zoneが現在地と一致していることも確認してください。変更後すぐに接続を連続操作せず、Shadowrocketの接続スイッチをオフにして、システムのネットワーク状態が安定するまで待ちます。その後Homeに戻り、サーバーを選び直してください。

Wi-Fiからモバイル通信へ切り替えると、既存の接続で使われていたローカルアドレス、DNS、ルーティングが変わります。切り替え後も長時間復旧しない場合は、接続をオフにし、ステータスバーで新しいネットワークが利用可能になったことを確認してから、再度オンにしてください。On Demandを有効にしている場合は、ネットワーク変更時に自動ルールが別のSceneを選択していないかも確認します。

結論:時刻を調整したら、必ず接続を再確立する

既存のセッションは、システム時刻を修正しただけではクリーンなハンドシェイクを自動的に完了しません。時刻を調整し、ネットワークを安定させ、古い接続をオフにして項目を選び直したうえでテストを実行すると、修正が反映されたか確認できます。

決めた順序で最終テストを行う

パラメータ、ルール、サブスクリプション、システム時刻の確認が終わったら、決めた手順で仕上げます。まずOn Demandを一時停止したまま、設定を確認済みのサーバーを選びます。次に遅延テストでその項目が応答することを確認し、接続をオンにしてConnectivity Testを実行します。遅延が正常でConnectivity Testだけが失敗する場合は、サブスクリプションを何度も更新するのではなく、Global Routing、Configルール、DNS、通信設定を再確認します。

テスト結果には、少なくとも現在のネットワーク、サーバー名、プロトコル種別、遅延値の有無、接続スイッチの状態、Connectivity Testが失敗した段階を記録します。サービス提供元に連絡する際は、Password、UUID、Private Key、サブスクリプションtokenを完全な形で送らないでください。マスクしたフィールド、発生時刻、エラー原文だけを伝えます。

システムの接続を確認設定確認済みの項目を選択遅延テストを実行接続をオンにするConnectivity Test失敗段階を記録

遅延値は表示されるのに、Connectivity Testが失敗する場合は?

Global RoutingとConfigルールを確認し、テストリクエストがDirectや誤ったルールに処理されていないことを確認します。その後、DNS、TLS、Host、Pathを確認してください。

モバイル通信のときだけタイムアウトする場合は?

古い接続をオフにして、モバイル通信で再テストします。Hysteria2などUDPに依存する設定がこのネットワークだけで失敗する場合は、ネットワークの違いと発生時刻を添えてサービス提供元に伝えてください。

すべての項目が突然同時にタイムアウトする場合は?

まず端末自体がインターネットに接続できることを確認し、On Demandを一時停止して、接続ネットワークを切り替え、システム時刻を確認します。すべての取得元が同時に使えない場合、サーバーのパスワードを1つずつ変更するのは適切ではありません。

再インストール前に確認すべきことは?

まずサブスクリプションの有効性、プロトコルフィールド、Global Routing、On Demand、システム時刻を確認します。設定ミスはアプリを再取得しても自動的には修正されないため、必要な障害記録を先に保存してください。

Shadowrocketの正規情報はどこで確認できますか?

入手先はApp Storeのみです。製品名Shadowrocket、開発者Shadow Launch Technology Limited、アプリID 932747118を確認してください。購入方式は買い切りで、システム要件はApp Storeのページに記載された内容に従います。

Shadowrocketをダウンロード