v2rayNGの速度テストがタイムアウトする、起動後に何度も切断される、同じサブスクリプションのノードが突然すべて使えなくなった、といったAndroidユーザー向けのチェックリストです。確認する順番は、症状の切り分け、端末時刻とネットワークの確認、サブスクリプションの更新、通信パラメータの確認、TLSまたはREALITYの確認、DNSとVPNの競合排除です。各項目を終えるたびに実際の接続テストを行うと、問題のある層をより早く特定できます。
ステップ1:速度テストのタイムアウト、接続タイムアウト、ハンドシェイク失敗を区別する
v2rayNGで表示される「タイムアウト」は、サーバーが停止していることだけを意味しません。リストの遅延テスト、実際の接続テスト、起動後のコアログは、それぞれ異なる箇所を確認します。遅延値が空の場合はテスト先にアクセスできない可能性があります。起動をタップするとすぐ停止する場合は、設定の読み込みやハンドシェイクのエラーが疑われます。起動状態が正常なのにWebページを開けない場合は、ルーティング、DNS、端末のVPN環境を確認してください。
この記事では、v2rayNG 1.10.xの一般的な画面を基準に説明します。マイナーバージョンによってボタンの位置が少し異なる場合がありますが、確認手順は同じです。まず1つのノードを選び、実際の接続テストを1回行ってから、サイドバーの「ログ」を開き、最後の20~40行を確認します。最初からUUID、ポート、通信設定を一括変更しないでください。元のエラーが上書きされるおそれがあります。
エラー:context deadline exceeded
原因と対処:規定時間内に接続が完了していません。サーバーのポートに到達できない、モバイルネットワークでパケットロスが発生している、ハンドシェイクの応答が返ってこない、といった原因が考えられます。まずWi-Fiとモバイルネットワークを切り替えてテストし、アドレスとポートを確認してください。
エラー:dial tcp: i/o timeout
原因と対処:対象IPアドレスとTCPポートへの接続がタイムアウトしています。同じノードが両方のネットワークで失敗する場合は、サーバーアドレスが変更されていないか、ポートがまだ開いているかを優先的に確認してください。
エラー:failed to find an available destination
原因と対処:対象ドメインから利用可能なアドレスを解決できないか、DNSの応答が現在のネットワークに適していません。ノードのドメイン名に誤りがないか確認し、DNS設定を変更してから接続を再起動してください。
まず3つの結果を記録する
- リストの遅延値だけでなく、1つのノードで実際に接続テストを行った結果。
- 起動に失敗したとき、ログに最初に表示されたエラー。後続の同じエラーは連鎖的な結果であることが多いです。
- 障害の範囲が1つのノードなのか、同じサブスクリプションの全ノードなのか、端末内のすべての設定なのか。
1つのノードだけ失敗し、同じサブスクリプションの他のノードが正常なら、問題は通常、そのノードのアドレス、ポート、通信パラメータにあります。すべてのノードが同時に使えなくなった場合は、ノードを1つずつ編集するのではなく、端末時刻、サブスクリプションの状態、現在のネットワーク、アプリの権限を先に確認してください。
ステップ2:端末時刻を合わせ、基本ネットワークを比較する
TLS証明書の検証とREALITYのハンドシェイクは、端末の時刻に依存します。日付が1日ずれている、タイムゾーンが誤っている、システム時刻が数分遅れている、といった状態では、証明書がまだ有効でない、または期限切れと判定されることがあります。Android端末では、ネットワーク提供の自動日時と自動タイムゾーンを有効にしてください。時刻を合わせたら、v2rayNGを完全に停止してからコアを再起動します。
基本ネットワークの比較も重要です。まずv2rayNGを切断し、通常のネットワークで普段使うWebサイトを開けることを確認します。次に、現在のWi-Fiとモバイルネットワークで同じノードをそれぞれテストしてください。モバイルネットワークでは接続でき、Wi-Fiでタイムアウトする場合は、ルーターのDNS、ゲストネットワークの制限、上位ネットワークを重点的に確認します。Wi-Fiでは接続でき、モバイルネットワークで失敗する場合は、現在のアクセスポイント、IPv6経路、通信品質が原因かもしれません。
-
時刻を合わせる
端末の「設定」→「システム」→「日付と時刻」を開き、「時刻を自動設定」と「タイムゾーンを自動設定」を有効にします。Androidのバージョンによって「システム」への入口名は多少異なる場合があります。
-
接続を停止する
v2rayNGに戻り、画面下部の接続ボタンをタップしてサービスを停止します。最近使ったアプリからもアプリを閉じ、約5秒待ってから再度開いてください。
-
直接接続をテストする
プロキシをオフにしたまま、ブラウザで安定したWebサイトを2つ開き、通常のDNSと基本ネットワークが利用できることを確認します。
-
ネットワークを切り替えて比較する
同じノードをWi-Fiとモバイルネットワークでそれぞれテストします。各ネットワークで3回連続してテストし、タイムアウトが安定して再現するか記録してください。
-
ログを保存する
接続を再起動し、サイドバーの「ログ」を開きます。最後の1行だけでなく、最初に現れたエラーの種類と発生時刻を保存してください。
システムのバッテリーセーバーによる制限も一時的に解除してください。端末の「設定」→「アプリ」→「v2rayNG」→「バッテリー」を開き、接続中もアプリが通常どおり動作できるようにします。端末によっては画面ロック後にバックグラウンドのVPNサービスが制限され、接続直後は使えるのに数十秒後に切断されることがあります。これはサーバーの速度テストがタイムアウトする問題とは異なります。
ステップ3:サブスクリプションの有効性を確認し、ノード情報を更新する
サブスクリプションURLは設定を配布する入口にすぎず、ノードが使えるかどうかはサブスクリプションの状態とサーバー側の設定に左右されます。期限切れ、通信量の上限到達、グループ権限の変更などにより、古いノードがリストに残っていても実際の接続がすべてタイムアウトすることがあります。ノード名が表示されているだけでは、端末の設定が最新だとは限りません。
まずv2rayNGのサイドバーで「サブスクリプショングループ」を開き、サブスクリプションURLが完全で、該当グループが有効になっていることを確認してから、「サブスクリプションを更新」を実行します。更新後は、ノード数、名前、ポートに変化があるか確認してください。更新自体がタイムアウトする場合は、プロキシを切断し、現在の直接接続で更新します。利用可能なノードが1つある場合は、サブスクリプション設定でプロキシ経由の更新を有効にしてから再試行することもできます。
サブスクリプション更新時に確認するポイント
- サブスクリプションURLの前後に、空白、改行、チャットアプリで途中から切れた文字がないこと。
- 更新後に選択したのが新しい設定であり、同名の古いノードのコピーではないこと。
- サブスクリプション内のVMess、VLESSノードのUUIDが完全で、文字を手動で削除していないこと。
- 最新のVMess AEAD設定では通常、
alterId 0を使用します。出所の不明な古いパラメータを使い続けないでください。 - VLESSの暗号化フィールドは通常
noneで、通信の安全性はTLSやREALITYなどの設定で確保します。
サブスクリプションの更新後にノード数が0になっても、すぐに何度もインポートし直さないでください。サブスクリプションのレスポンスが有効か、グループのフィルタールールでノードが非表示になっていないかを確認します。更新に成功したのに古いノードがすべて変わらない場合は、そのサブスクリプショングループを削除して再追加します。操作前にカスタムルーティングルールを記録し、端末側の変更まで一緒に消さないようにしてください。
ステップ4:アドレス、ポート、通信パラメータを1つずつ確認する
端末時刻とサブスクリプションに問題がなければ、ノードの編集画面で接続パラメータを確認します。基本となる3項目はサーバーアドレス、ポート、ユーザー識別子です。ドメイン名に空白が1つ入っている、ポートが443ではなく8443になっている、UUIDが1文字欠けている、といった状態でも接続は失敗します。ドメイン名にhttps://の接頭辞を付けたり、WebSocketのパスをアドレス欄に入力したりしないでください。
次にネットワークの種類を確認します。TCP、WebSocket、gRPCは互換性のある選択肢ではなく、クライアントとサーバーで一致していなければなりません。WebSocketではパスとHost、gRPCではserviceNameを確認します。TCPとREALITYを使うVLESSノードでは、正しいflowが必要な場合もあります。パスとサービス名は通常、大文字と小文字を区別します。/rayと/Rayは別の値として扱ってください。
エラー:failed to dial WebSocket > bad handshake
原因と対処:TCP接続は確立していますが、WebSocketへのアップグレード時のハンドシェイクが拒否されています。ノード編集画面でパス、Host、TLSのオン・オフ、ポートを確認し、サブスクリプションの元の値と一致させてください。
エラー:connection reset by peer
原因と対処:リモート側または途中のネットワークが接続を強制的にリセットしています。毎回ハンドシェイク直後に発生する場合は、通信方式、サーバーのポート、安全性の設定が一致しているかを重点的に確認してください。
エラー:invalid user
原因と対処:ユーザー識別子がサーバーに受け付けられていません。サブスクリプションを更新してUUIDを確認し、期限切れの設定や手動コピーで欠けた設定を使い続けないでください。
通信パラメータの確認表
- TCP:ポート、TLSまたはREALITYの状態、VLESSのflowが設定で指定された値になっているか確認します。
- WebSocket:Pathが正しいスラッシュで始まっているか、Hostがサブスクリプションと一致しているかを確認します。SNIとHostを任意に入れ替えないでください。
- gRPC:サービス名が完全か、安全性の設定がサーバー側と一致しているかを確認します。ポートは通常
443ですが、必ずしもそうとは限りません。 - VMess:UUID、安全性の設定、通信方式を確認します。ノード名だけでパラメータを判断しないでください。
- VLESS:UUID、flow、通信の安全性、サーバー名を確認します。特にREALITY関連のフィールドに注意してください。
編集後は現在のノードだけをテストし、すぐに一括速度テストを行わないでください。一度に1つのフィールドだけを変更し、保存して10~15秒接続した後、ログがTCPタイムアウトからTLSまたは通信ハンドシェイクの段階へ進んだか確認します。エラーの段階が変わったなら、直前の変更が反映されています。エラーが完全に同じ場合は、根拠のない変更を元に戻してください。
ステップ5:TLS、SNI、REALITY関連フィールドを確認する
TLS関連の問題では、TCPポートには接続できても、安全なハンドシェイクを完了できないことがあります。通常のTLSノードでは、正しいサーバー名、一般的な設定でいうSNIが必要です。SNIは通常、証明書の対象となるドメイン名であり、ノードの接続アドレスと完全に同じとは限りません。サブスクリプションにこの項目が含まれている場合は、そのまま使用し、IPアドレスに置き換えないでください。
証明書の検証に失敗した場合は、まず端末時刻、ドメイン名、設定の入手元を確認してください。「安全でない接続を許可する」を長期的な対策にしてはいけません。検証を無効にしても、ドメイン名や証明書の設定ミスを隠すだけで、ポート、パス、REALITYパラメータの不一致は解決しません。
エラー:x509: certificate has expired or is not yet valid
原因と対処:端末時刻が正しくないか、サーバーの証明書が実際に有効期限外です。まず自動時刻を有効にします。時刻が正確なのにエラーが続く場合は、ノード設定を更新するか、サーバー側の対応を待つ必要があります。
エラー:x509: certificate is valid for another name
原因と対処:SNIと証明書の対象ドメイン名が一致していません。サブスクリプションで指定されたサーバー名に戻し、ノードのアドレスをそのままSNIにコピーしていないか確認してください。
エラー:REALITY: processed invalid connection
原因と対処:REALITYのハンドシェイクフィールドが一致していません。公開鍵、short ID、serverName、フィンガープリント、flowを再確認してください。サブスクリプションを更新して、一式のパラメータを復元することをおすすめします。
REALITYノードで重点的に確認する項目
- プロトコルがVLESSで、ネットワークの種類が設定の説明と一致しているか。
- 公開鍵が完全で、コピー時に前後の空白や改行が入っていないか。
- short IDがサブスクリプションから配布された値か。勝手に0を追加したり削除したりしないこと。
- serverNameが設定と一致しているか。
chromeのような一般的なフィンガープリントは、元の設定どおりに入力します。 - Visionを使用する場合、flowは通常
xtls-rprx-visionに設定します。具体的な値はノード設定に従ってください。
同じサブスクリプションで通常のTLSノードは使えるのに、REALITYノードだけがすべて失敗する場合は、REALITYフィールド、コアの互換性、サブスクリプションデータが原因であることが多いです。まずv2rayNGがXrayコアを使用していることを確認し、インストールパッケージのページから現在メンテナンスされているバージョンを入手して、サブスクリプションを再インポートしてテストしてください。
ステップ6:DNS、ルーティングルール、端末のVPN競合を切り分ける
ここまでの5つのステップに問題がないのに、接続後もWebページを開けない場合は、DNS、ルーティングの照合、プロキシのアウトバウンドをリクエストが正常に通過しているか確認します。ドメイン名のノードはDNS解決に依存します。カスタムルーティングによってテスト用ドメインが誤って直接接続へ送られたり、ブロックされたりすることがあります。また、端末で別のVPNサービスを同時に実行すると、v2rayNGがVPNインターフェースを作成できない、または接続直後に別のサービスへ置き換えられる場合があります。
まずシンプルな環境に戻します。他のVPNサービスを停止し、ネットワークの自動切り替えをオフにして、カスタムルーティングルールを一時的に無効にします。パラメータが正しいと確認できたノードを1つだけ残してください。v2rayNGの「設定」を開き、現在のDNS設定を記録してからデフォルト設定に戻し、接続を停止して再起動します。デフォルトに戻して使えるようになったら、ルーティングルールとDNS設定を1つずつ戻してください。
ノードは接続済みなのに、すべてのWebページを開けないのはなぜ?
まずログを開き、再接続が継続していないことを確認します。次にカスタムルーティングを無効にして、DNSをデフォルトに戻してください。ローカルのSOCKSリスニングを有効にしている場合は、ポートが他のアプリに使用されていないかも確認します。一般的なポートは10808ですが、実際の値は設定画面に従ってください。
IPアドレスなら接続できるのに、ドメイン名ではタイムアウトする場合は?
通常はDNS解決の問題です。接続を切断してネットワークを更新し、v2rayNGのデフォルトDNSに戻してからノードのドメイン名をテストしてください。TLSのSNIと証明書検証が元のドメイン名に依存する場合があるため、解決結果のIPアドレスで長期間代用しないでください。
Wi-Fiではタイムアウトするのに、モバイルネットワークなら正常に接続できる場合は?
ルーターを再起動し、ゲストネットワークの制限を解除して、ルーターが異常なDNSを使用していないか確認します。端末をWi-Fiに再接続して3回連続でテストし、このネットワークだけで障害が発生するか確認することもできます。
画面ロックから数十秒後に接続が自動切断される場合は?
端末の「設定」→「アプリ」→「v2rayNG」→「バッテリー」を開き、厳しいバックグラウンド制限を解除して、VPNサービスを継続実行できるようにします。その後、画面を2分間ロックして接続の安定性をテストしてください。
サブスクリプション内のノードがすべてタイムアウトし、手動追加したノードも失敗する場合は?
まず端末時刻、現在のネットワーク、VPNの競合を確認します。端末を再起動した後、v2rayNGだけを起動し、パラメータが明確なノードを1つ使ってテストしてください。それでも失敗する場合は、ログの最初のエラーを保存してから、さらに切り分けます。
最終確認の順番
- 自動時刻と自動タイムゾーンを有効にする。
- 他のVPNサービスを停止し、v2rayNGだけを残す。
- サブスクリプションを1回更新し、新しいノードを1つ選ぶ。
- DNSとルーティング設定をデフォルトに戻す。
- まず実際の接続テストを行い、その後VPNサービスを起動する。
- ドメイン名のWebサイトと普段使うアプリを1つずつ開き、2分間状態を確認する。
この順番で再テストしても特定のノードだけがタイムアウトするなら、原因はほぼそのノードまたはサーバー側に絞れます。同じサブスクリプションだけがすべて失敗し、他のサブスクリプションは使える場合は、サブスクリプションの状態または一式の設定を確認します。端末上のすべての設定が失敗し、ネットワークを変えても改善しない場合は、アプリのバージョン、システムのVPN権限、ログにあるコア起動エラーを確認してください。
トラブルシューティングで重要なのは、無作為な組み合わせを増やすことではなく、各テストで検証する変数を1つに限定することです。時刻、ネットワーク、サブスクリプション、通信方式、安全性の設定、DNS、端末環境を順番に確認すれば、接続がどの層で止まっているかを特定でき、単純なポート変更をクライアントの故障と誤判断することも避けられます。