2026年8月19日 · トラブル対処 · 約10分

V2Rayの接続がタイムアウトする原因と対処法|ローカルプロキシからサーバーまでの5段階チェック

ノードを変更する前に、ローカルプロキシのポート、システムプロキシ、サブスクリプション設定、時刻同期、サーバーへの接続性を順に確認しましょう。

この記事の要点

切り分けの目的は、「接続できない」原因がローカルの待ち受け、通信の入口、ノード設定、時刻とハンドシェイク、リモートネットワークのどこにあるかを特定することです。この記事ではWindows版v2rayNを中心に、Android版v2rayNGとv2flyNGで確認すべき違いも紹介します。一度に変更する条件は一つに絞り、同じリクエストで再テストしてください。ノードやルーティング、DNSをまとめて変更すると、何が効いたのか判断できなくなります。

手順1:ローカルプロキシのポートが待ち受け中か確認する

ローカルの入口:クライアント画面が開いていても、プロキシのコアが起動しているとは限りません。v2rayNは設定と管理を担い、実際の接続は選択中のコアが処理します。コアの設定読み込みに失敗したり、ポートが使用中だったりすると、ブラウザーにプロキシを設定してもリクエストはノードに届きません。まずクライアントのログで起動結果を確認し、次に待ち受けポートを調べます。

ポートの確認:v2rayNの「設定」→「パラメータ設定」を開き、ローカルの待ち受けアドレスとポート、対応するインバウンドの種類を確認します。画面の項目名やグループ分けはバージョンによって異なる場合があります。以下ではSOCKSインバウンドの127.0.0.1:10808を例にします。10808はすべての環境で共通の値ではなく、サーバー側のポートでもありません。実行前に実際の待ち受けポートに置き換えてください。

netstat -ano | findstr ":10808"

エラー:bind: address already in use

原因:使用しようとしたローカルアドレスとポートがすでに使用されています。複数のインスタンスを起動した場合や、別のプロキシプロセスが動作中の場合によく発生します。

対処法:PIDからポートの使用元を特定し、重複したインスタンスを終了するか、ローカルの待ち受けポートを変更します。コアを再起動した後、アプリのプロキシ設定も同じ値に更新してください。

Androidでの違い:v2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。まずアプリで接続を開始し、システムVPNの使用が許可されていることを確認してください。AndroidのVPNによる通信の取り込みは、Windowsのシステムプロキシとは仕組みが異なります。Windowsでのポート確認の結果をそのまま当てはめないでください。

手順2:システムプロキシ、アプリのプロキシ、TUNを切り分ける

通信経路:システムプロキシが影響するのは、その設定に従うアプリだけです。一方、TUNは仮想ネットワークアダプターを通じて通信を取り込みます。ブラウザーでは開けるのにほかのプログラムで失敗しても、ノードの問題とは限りません。逆に、クライアントの遅延テストに成功しても、ブラウザーがプロキシを使っているとは限りません。

アプリのリクエストローカルの入口ルーティング判定ノードへの接続接続先サービス

切り分けテスト:現在のシステムプロキシとTUNの状態を記録し、TUNを一時的にオフにして、SOCKSプロキシを明示したコマンドでリクエストを送ります。アプリがシステムプロキシに従うかどうかという不確定要素を避けられますが、クライアント内部のルーティングルールの影響は残ります。プロキシ経由の接続を確認する場合は、実際に選択されたアウトバウンドもログで確認してください。

curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://v2raymark.com/

パラメータの意味:socks5hでは接続先のドメイン名をプロキシ側で解決します。この指定だけでローカルのDNSが正常だとは判断できません。10秒は接続処理の上限、20秒はリクエスト全体の上限です。いずれも今回の診断用の設定であり、ネットワーク性能の基準ではありません。403や405が返ってきた場合もHTTP応答を受信できています。接続タイムアウトとして扱い続けないでください。

  1. 入口の状態を記録

    v2rayNの待ち受けポート、選択中のノード、システムプロキシの状態、TUNの状態を記録し、失敗時の条件を残しておきます。

  2. プロキシを明示してテスト

    TUNをオフにして上記のコマンドを実行します。ローカルへの接続が拒否された場合は、手順1に戻ってポートとSOCKSインバウンドの種類を確認してください。

  3. システムプロキシを元に戻す

    プロキシを明示したテストに成功したら、v2rayNの「システムプロキシ」で「システムプロキシを自動設定」を選択します。次にWindowsの「設定」→「ネットワークとインターネット」→「プロキシ」を開き、クライアントの状態と一致しているか確認してください。

  4. TUNを個別に確認

    TUNが必要な場合にのみ有効にし、クライアントの案内に従って権限とネットワークアダプターの状態を確認します。TUNだけが失敗する場合は、ノードのパラメータをすぐ変更せず、ルーティング、DNS、ほかのVPNとの競合を調べてください。

判断の目安:明示したプロキシで成功したら、アプリの入口を確認

プロキシを明示したリクエストが成功してもブラウザーで失敗する場合は、まずブラウザーの拡張機能、アプリ固有のプロキシ設定、システムプロキシのアドレスを確認します。この場合、サーバーを変更してもローカルの入口が機能していない問題は解決しません。

手順3:サブスクリプション設定と使用中のノードを確認する

設定の取得元:サブスクリプションの更新に成功したからといって、すべてのノードが有効とは限りません。更新に失敗しても、現在のノードがすぐに使えなくなるわけではありません。まず選択中のノードがどのサブスクリプショングループに属しているか、更新前の古い項目を使っていないかを確認します。次に、サービス提供元がアドレス、ポート、認証情報を変更していないか確認してください。

コアの違い:v2rayNでは、実際に呼び出されているコアとそのログを確認します。Androidでは、v2rayNGとv2flyNGを名前だけが異なる同一アプリとして扱わないでください。Xrayとv2flyでは、プロトコルの拡張機能や設定項目の対応状況が完全には一致しません。画面から設定をインポートできても、コアですべて正常に動作するとは限りません。特にVLESSやREALITYを使う設定では、実際の対応状況を確認してください。

確認項目確認する内容よくある誤り
サーバーアドレスとポートノードのアドレスとサーバー側の待ち受けポートを確認します。443は一般的な設定例にすぎません。ローカルの10808を接続先ポートに設定してしまう
プロトコルと認証VMess、VLESSの種類と、ユーザー識別子などの対応する項目ノード名だけを見て、認証情報が更新されたことを見落とす
通信方式のパラメータTCP、WebSocket、gRPCなど、実際の通信方式と必要な項目を確認します。通信方式の不一致を見落とし、DNSだけを変更する
TLSの設定TLSの有効・無効、サーバー名、証明書の要件を確認します。TCPポートに接続できればハンドシェイクも正常だと思い込む
ルーティングとアウトバウンドテストリクエストが直結やブロックではなく、想定したプロキシを選択しているか確認します。接続先サイトへの直結失敗をノードのタイムアウトと誤認する

更新手順:v2rayNの「サブスクリプショングループ」で対象のグループを更新し、更新後にノードを選び直してログを確認します。使用中のバージョンにプロキシ経由・プロキシを使わない更新の両方がある場合は、サブスクリプションURLへの実際の接続性に応じて選択してください。利用可能なノードが一つしかなく、それが無効になっていると、そのノード経由でサブスクリプションを取得しようとして失敗を繰り返すことがあります。サブスクリプションURLとノード設定一式は機密情報です。調査用のスクリーンショットでは認証情報を隠してください。

手順4:システム時刻を同期し、TLSハンドシェイクの失敗を見分ける

時刻の影響:システム時刻が大きくずれていると、証明書がまだ有効でない、または期限切れと判定されたり、VMessの時刻に関連する認証に影響したりすることがあります。VLESSにVMessの時刻検証の仕組みをそのまま当てはめることはできませんが、TLSを有効にしている場合は証明書の有効期間が検証されます。タイムゾーンの表示を変更しても、システム時刻自体が修正されるとは限りません。

エラー:x509: certificate has expired or is not yet valid

原因:証明書の有効期間と現在のシステム時刻が一致していません。端末の時刻が誤っている場合もあれば、サーバー証明書の更新が必要な場合もあります。

対処法:まず端末の時刻を同期します。時刻が正しいのにエラーが続く場合は、サーバー管理者に証明書とその配置状況を確認してもらってください。

エラー:x509: certificate signed by unknown authority

原因:証明書チェーンを信頼されたルート証明書までたどれません。中間証明書の不足、プライベート証明書、端末の信頼ストアなどが原因として考えられます。

対処法:サーバーの証明書チェーンと想定される認証局を確認します。プライベート証明書を使う場合は、信頼できる経路で信頼設定を行い、検証を無効にして済ませないでください。

SNIの確認:接続先アドレスとTLSのサーバー名が異なる構成はあり得ますが、サーバーの設定と証明書の要件に合っている必要があります。接続できるドメイン名を適当に入力しないでください。allowInsecureをタイムアウト解消の設定として使わないでください。証明書の検証を省略してもTCP接続の問題や誤った通信経路は解決せず、認証の安全性が低下します。

手順5:サーバーへの接続性とリモート側の待ち受けを確認する

リモート側の接続確認:手順1〜4でローカルの入口、通信の取り込み、設定を確認した後、ノードのアドレスと対象ポートをテストします。以下はWindows PowerShell用のコマンドです。実際のノードアドレスとポートを入力してください。サブスクリプションURL全体は入力しないでください。このテストで確認できるのはTCP接続だけで、アカウント、TLS、WebSocketのパス、gRPCのサービス名は検証できません。

$nodeHost = Read-Host "ノードサーバーのアドレスを入力"
$nodePort = [int](Read-Host "ノードサーバーのポートを入力")
Test-NetConnection -ComputerName $nodeHost -Port $nodePort -InformationLevel Detailed

エラー:i/o timeout

原因:ネットワークの読み書きが制限時間内に完了しませんでした。前後のログと照らし合わせ、ノードへの接続、TLSハンドシェイク、接続先サービスへのアクセスのどの段階で発生したかを確認する必要があります。

対処法:同じリクエストの前後のログを残し、リモートアドレスと発生段階を確認します。そのうえでポート、ハンドシェイク、接続先サービスを個別に調べてください。この1行だけを根拠にDNSを変更しないでください。

ネットワークを比較する:ノード、接続先アドレス、テストコマンドは変えず、端末のネットワークだけをスマートフォンのテザリングに切り替えて再テストします。結果が異なる場合は、元のネットワークの外向き通信制限、DNSの応答、アドレスファミリーの違いを優先して確認してください。ただし、これだけで特定の制限が原因だと断定はできません。ドメインがIPv4とIPv6の両方のアドレスを持つ場合は、実際に使われたアドレスを記録し、ドメイン名の表記だけを比較しないでください。

サーバー側の確認:管理権限がある場合は、プロセスが動作中か、想定したポートで待ち受けているか、ファイアウォールとセキュリティグループで通信が許可されているか、証明書とリバースプロキシの設定が一致しているかを確認します。権限がない場合は、失敗した時刻とタイムゾーン、プロトコルと通信方式、機密情報を隠したログ、ポートのテスト結果を管理者に伝えてください。ユーザー識別子、サブスクリプションURL、その他の認証情報を公開しないでください。

判断の目安:ポートに接続できたら、ハンドシェイクと設定を確認

TCPのテストに成功してもプロキシ経由のリクエストが失敗し続ける場合、次の調査対象はTLS、プロトコル認証、通信方式のパラメータ、実際のアウトバウンドログに絞ります。待ち時間を何度も延ばしても、同じエラーが遅れて発生するだけです。

再テストの仕上げ:同じリクエストで修正範囲を確認

再テストの基準:一つの設定を変更したら、手順2で使ったプロキシを明示するリクエストをもう一度実行し、実際に使うブラウザーやアプリでも確認します。プロキシを明示したテストで確認できるのは、そのリクエストの経路だけです。システムプロキシ、TUN、DNS、ほかのアプリの動作は個別に検証する必要があります。クライアントに表示される遅延テストも、対象や方法が別に定められているため、すべてのアプリが使えることを示すものではありません。

設定を続ける:システムプロキシ、TUN、ルーティングルールの関係を確認するには応用設定をご覧ください。初期設定がまだの場合は、まずチュートリアルに沿って、再現可能な接続を一つ確立してから、ルーティングやDNSの設定を追加してください。

クライアントのインストーラー