v2rayNの接続トラブルは、まずコアが起動しているかを確認し、接続がローカルの待ち受け、ドメイン名の解決、接続先ポート、プロトコルのハンドシェイクのどこで止まっているかを調べます。サブスクリプションを追加したのにWebページが開けない場合に向けて、よくある英語のエラー、Windowsの確認コマンド、条件を一つずつ変える再テストの手順を紹介します。「使えない」という状態を、対処可能な問題に絞り込みましょう。
エラーは最後の1行だけでなく、全体を確認する
v2rayNは設定、サブスクリプション、プロキシ設定を管理するクライアントで、実際の接続処理は選択したコアが行います。メイン画面の操作に関する表示とコアのログは、別の処理段階から出力されることがあります。サブスクリプションの更新に成功しても、設定を取得できたことしか分かりません。コアの起動に成功しても、接続先サーバーに到達できるとは限りません。
メイン画面下部のログまたは情報欄を開き、接続に失敗した時刻を記録して、同じエラーの前後も確認します。バージョンによって画面の項目名や場所が異なる場合があります。ここではWindowsデスクトップ版を例に説明します。設定を確認するときは、画面上の位置を推測せず、「設定」→「パラメーター設定」から実際の設定を確認してください。
-
テスト条件を固定する
サーバーを1つ、接続先のWebページを1つ選び、ほかのアプリによる連続再試行を止めます。システムプロキシとTUNの現在の状態を記録し、調査中に両方を切り替えないようにします。
-
最初に失敗した箇所を特定する
現在の時刻を記録し、接続先のWebページを1回だけ開き直します。この操作の前後に出たエラーだけを確認し、以前のログを新しい問題と取り違えないようにします。
-
エラーの前後も記録する
エラーの前後数行を残し、接続先のアドレス、ポート、最も内側に記録された原因を確認します。ログを共有する前に、サブスクリプションURL、ユーザーID、認証情報を隠してください。
-
変更は一度に1つだけ
ポート、DNS、サーバー、トランスポート設定のうち、一度に変更するのは1項目だけにします。設定を保存してコアを再起動した後、同じ接続先で再テストし、エラーが変わったか記録します。
ローカルの待ち受けに失敗する場合:プロキシポートを確認
コアが起動直後に終了する場合は、まずノードの設定を変更しないでください。アプリが最初に接続するのはPC上のプロキシポートで、その後にリモートへ接続します。ログにある127.0.0.1はループバックアドレスです。同じ「接続拒否」でも、ローカルの接続口で発生した場合とサーバー側で発生した場合では、確認すべき箇所が異なります。
エラー:address already in use
原因:コアが待ち受けようとしているアドレスとポートがすでに使用されています。クライアントが二重に起動しているか、別のプログラムが待ち受けている可能性があります。
対処法:ポートを使用しているプロセスを確認し、重複していることを確認できたプロセスを終了します。または「設定」→「パラメーター設定」でローカルの待ち受けポートを変更してください。プロキシを手動で設定しているアプリも、同じポートに変更する必要があります。
エラー:Only one usage of each socket address
原因:Windowsでよく見られるソケット使用中のエラーです。同じアドレスとポートに複数のプロセスがバインドできない場合に表示されます。
対処法:まずポートを使用しているプロセスを確認します。見覚えのないシステムプロセスを安易に終了しないでください。重複して起動しているプログラムを終了し、コアを再起動します。
PowerShellで次の読み取り専用コマンドを実行します。例では10808を確認します。使用中のローカルポートが異なる場合は、先に数字を置き換えてください。最初のコマンドで何も表示されなければ、その時点で該当するTCPの待ち受けは見つかりません。UDPの状態やリモートへの接続状況を確認するコマンドではありません。
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
ForEach-Object { Get-Process -Id $_.OwningProcess }
接続拒否とタイムアウト:明示的な拒否と応答なしを見分ける
ローカルの待ち受けに問題がないことを確認したら、ログに記録された接続先アドレスとポートを確認します。接続拒否は通常、拒否の応答を受け取ったことを示します。タイムアウトは、制限時間内に処理が完了しなかったことを示します。どちらのエラーだけからも、アカウントが無効かどうかは判断できません。また、すべてのタイムアウトをDNSの問題と決めつけるのも誤りです。
エラー:connection refused
原因:接続先ポートでサービスが待ち受けていないか、途中の機器が接続を拒否しています。WindowsではNo connection could be made because the target machine actively refused itと表示されることもあります。
対処法:まずエラーに表示された接続先がローカルかどうかを確認し、次にサブスクリプションに記載されたサーバーポートを確認します。リモート側の設定に問題がないのに拒否される場合は、サービス提供元に待ち受け設定とファイアウォールを確認してもらってください。
エラー:i/o timeout
原因:ネットワークの読み書きが制限時間内に完了しませんでした。サーバーへの接続、ハンドシェイク、データ転送のいずれかで発生する可能性があります。
対処法:前後にあるdial tcp、TLS、読み込みに関するメッセージから、どの段階で止まったかを確認します。同じノードを使って別のネットワークでも再テストしてください。タイムアウト時間を延ばすだけでは解決になりません。
エラー:context deadline exceeded
原因:処理が制限時間を超えました。対象の処理は、サブスクリプションの取得、DNS問い合わせ、接続テストなどの場合があります。
対処法:まずどの操作でエラーが発生したかを確認し、その操作が直接接続かプロキシ経由かを調べます。サブスクリプション取得の失敗だけから、すべてのノードが使えないと判断しないでください。
| 発生した現象 | 優先して確認する項目 | この時点では判断できないこと |
|---|---|---|
| ローカルのプロキシポートへの接続が拒否される | コアが起動しているか、アプリに正しいポートが設定されているか | リモートサーバーが利用可能かどうか |
| リモートのTCPポートへの接続がタイムアウトする | アドレス、ポート、ネットワーク経路、サーバーのファイアウォール | ユーザーIDが正しいかどうか |
| TCP接続は成功するが、TLSエラーが発生する | サーバー名、証明書、システム時刻、TLS設定 | プロキシプロトコルの認証が必ず成功しているか |
結論:ポートへの接続を確認してからプロトコル設定を調べる
TCP接続のタイムアウトが続いている場合は、まずネットワーク経路とリモート側の待ち受けを確認します。ハンドシェイクまで進んでから、SNI、トランスポートのパス、ユーザーIDなどを変更すると、原因を絞り込みやすくなります。
ドメイン名の解決に失敗する場合:どのドメイン名かを確認
DNSはドメイン名をIPアドレスに変換します。ログで解決に失敗した名前は、ノードのサーバー名、接続先Webサイトのドメイン名、DNSサーバー自身のドメイン名など、さまざまです。まず対象を特定してから対処すれば、「Webページが開かないからDNSを全部変更する」といった試行錯誤を避けられます。
エラー:no such host
原因:現在の名前解決経路で、このホスト名に対応する有効な結果を取得できませんでした。ドメイン名の入力ミス、DNSレコードの状態、使用中のDNSリゾルバーなどが原因として考えられます。
対処法:エラーに表示されたドメイン名をすべて確認し、サブスクリプションに余分な空白や期限切れのアドレスが含まれていないか調べます。その後、システムの名前解決とコアのDNS設定を個別に確認してください。
エラー:failed to lookup ip
原因:ドメイン名の問い合わせで必要なIPアドレスを取得できませんでした。タイムアウトや名前解決エラーなど、続くメッセージも確認して具体的な原因を特定してください。
対処法:コアが使用するDNSアドレスと、その宛先へのルーティングを確認します。特に、まだ接続できていないプロキシの出口にDNS問い合わせが依存していないか注意してください。
- システム側の確認:PowerShellで
Resolve-DnsName -Name example.comを実行すると、システム側で名前解決できるか確認できます。ノードを調べる場合は、実際にノードが使用するホスト名を指定してください。 - コア側の確認:現在のDNS設定とルーティングを確認します。システムで名前解決できても、コアで指定したリモートDNSに接続できるとは限りません。
- アドレスを安易に置き換えない:DNSで取得したIPアドレスを、TLSノードのすべての項目にそのまま設定しないでください。サーバーアドレス、SNI、HTTP Hostはそれぞれ異なる役割を持つ場合があります。サービス側の指定に従ってください。
特定のWebサイトだけ開けず、ノードのサーバーには接続できる場合は、そのサイトの名前解決結果、適用されるルーティング、接続先サービスを確認します。ルーティングは「接続をどの出口へ送るか」を決めるもので、すべてのドメイン名を自動的に解決可能にする機能ではありません。
TLSハンドシェイクに失敗する場合:時刻、ホスト名、トランスポート設定を確認
TCP接続が確立しても、TLSに失敗する場合があります。TLSは暗号化された接続を確立する仕組みです。VMess、VLESSなどのプロキシプロトコルにも、それぞれ設定要件があります。ポートに接続できても、TLS、トランスポート、プロキシ認証がすべて成功したとは限りません。
エラー:x509: certificate has expired or is not yet valid
原因:証明書の有効期間と検証時刻が一致していません。サーバー証明書の期限切れのほか、PCの日付や時刻が間違っている可能性もあります。
対処法:Windowsの「設定」→「時刻と言語」→「日付と時刻」で時刻を確認し、同期します。時刻が正しいのにエラーが続く場合は、サービス提供元に証明書の対応を依頼してください。
エラー:x509: certificate signed by unknown authority
原因:現在の信頼された認証局では証明書チェーンを検証できません。サーバーの証明書チェーンが不完全な場合や、通信経路上で証明書が置き換えられた場合などに発生します。
対処法:専用の証明書が必要なネットワークを経由していないか確認し、サービス提供元に証明書チェーン全体の設定を確認してもらってください。証明書の検証を無効にする方法を、通常の解決策として使わないでください。
エラー:tls: handshake failure
原因:接続先とのTLSネゴシエーションに失敗しました。サーバー名、プロトコル設定、接続先ポートの誤りなどが考えられます。
対処法:有効なサブスクリプションの設定と照らし合わせ、TLSの有効・無効、SNI、ポートを確認します。REALITYを使用している場合は、公開鍵、shortId、サーバー名など、関連する設定も確認してください。
EOFやconnection reset by peerは、接続が途中で終了したことを表すエラーで、特定の認証エラーではありません。トランスポートの種類が一致しない、WebSocketのパスが誤っている、リバースプロキシの設定に問題がある、接続先サービスが切断したなど、さまざまな原因が考えられます。発生した段階もあわせて確認してください。EOFを見ただけでクライアントを再インストールする必要はありません。
- WebSocketを使用する場合は、サーバー側の設定と照らし合わせてパスとHostを確認します。パスの大文字・小文字や文字を推測で変更しないでください。
- gRPCを使用する場合は、サービス名とサーバー側の設定を確認します。WebSocketのパスをそのまま流用することはできません。
- VLESSまたはVMessを使用する場合は、プロトコルの種類、ユーザーID、関連する設定が一致しているか確認します。サブスクリプションを更新する前に、必要なカスタム設定を保存してください。
- 現在の設定が選択中のコアに対応しているか確認します。v2rayNの画面、コアのプログラム、サブスクリプションの内容はそれぞれ別の要素です。どれか1つを更新しても、残りが自動的に更新されるわけではありません。
リクエストがログに出ない場合:システムプロキシとルーティングの入口を確認
Webページを開いてもコアに該当するリクエストが記録されない場合、アプリからクライアントに通信が渡されていない可能性があります。一方で、ログレベルの設定によりアクセスの詳細が記録されていないだけかもしれません。「ログが見つからない」だけでは、ノードが正常とも、プロキシを経由せず通信しているとも判断できません。
-
プロキシへの接続口を確認する
v2rayNのメイン画面またはタスクトレイのメニューから「システムプロキシ」の状態を確認します。システムプロキシを使う場合は「システムプロキシを自動設定」を選び、Windowsに記録されたアドレスとポートがローカルの待ち受け設定と一致するか確認してください。
-
アプリごとの設定を確認する
ブラウザーや対象アプリに、直接接続、別のプロキシポート、プロキシ拡張機能が設定されていないか確認します。アプリ独自の設定は、システムプロキシに従わない場合があります。
-
ルーティング先を確認する
リクエストがコアに届いたら、該当する出力タグと現在のルーティングルールを確認します。直接接続に割り当てられた宛先は、サーバーを選択しただけでは自動的にプロキシ経由になりません。
-
必要な間だけ詳細ログを有効にする
「設定」→「パラメーター設定」でログレベルに関する項目を探します。必要であれば一時的にdebugを設定して1回だけ再現し、確認後に元のログレベルへ戻してください。接続先アドレスなどの機密情報が長期間記録されるのを防げます。
よくある質問とトラブル情報の共有方法
遅延テストで数値が出るのに、Webページが開けないのはなぜですか?
まず、実行したのがTCPテストか、実際の接続テストかを確認します。TCPテストで分かるのは主にポートに接続できるかどうかで、プロキシ認証やWebサイトへのアクセスすべてを検証するものではありません。Webページを1つに絞って再テストし、同じ時刻のハンドシェイクとルーティングのログを確認してください。
サブスクリプションの更新がタイムアウトしたら、先にノードを切り替えるべきですか?
まず、失敗したのがサブスクリプションの取得かを確認します。「サブスクリプショングループ」で、更新時に直接接続するか、プロキシ経由で接続するかを確認してください。プロキシ経由で更新する設定の場合、先に利用可能なプロキシ接続が必要です。公開の質問ページにサブスクリプションURL全体を貼り付けないでください。
ネットワークを切り替えたら使えるようになりました。プロトコルも変更すべきですか?
まず元の設定を残し、2つのネットワークで同じノードとポートを使ったときの結果を記録します。結果に差があれば、ネットワーク経路、名前解決、接続制限が関係している可能性がありますが、エラーが発生した段階もあわせて確認してください。すぐにプロトコルやトランスポート設定を作り直す必要はありません。
設定全体とログをすべて他の人に送るべきですか?
その必要はありません。クライアントのバージョン、コアの名称とバージョン、OS、プロキシモード、再現した時刻、機密情報を除いたエラー前後のログを伝えます。サブスクリプションのトークン、ユーザーID、パスワード、秘密鍵を削除し、原因の特定に必要な項目名とエラーの構造だけを残してください。
問い合わせる前に、最後の確認を順番に行います。ローカルのポートが待ち受けていること、アプリの通信がプロキシに入っていること、サーバーのドメイン名が想定どおりに解決されること、リモートポートに接続できることを確認し、最後にTLSとプロキシプロトコルの設定を調べます。サーバーを自分で管理している場合は、同じ時刻の待ち受け、ファイアウォール、証明書、サーバー側のエラーログも確認してください。サブスクリプションサービスを利用している場合は、「タイムアウトした」と伝えるだけでなく、確認済みの項目をサービス提供元に共有すると、より適切な回答を得やすくなります。
結論:エラーが発生した段階から次の確認項目を決める
再テストのたびに「何を変更したか」「どの段階で止まったか」「結果が変わったか」を記録します。エラーが接続タイムアウトから証明書エラーに変わったなら、調査が次の段階へ進んだということです。すべての設定を元に戻して、最初から手当たり次第に試す必要はありません。