「コアの起動に失敗する」「ノードを選べるのにWebページが開かない」「ハンドシェイクエラーが続く」といった問題にお困りの方向けです。まずクライアントの通知、アクセスログ、エラーログを区別し、ローカルの待ち受け、DNS、サーバーへの接続、プロトコルのハンドシェイクの順に確認します。一度に変更する設定は一つに絞り、同じリクエストのエラー全体で結果を検証してください。単独のエラー行だけでノードが使えないと判断しないようにしましょう。
まずログがどの層から出ているか確認する
v2rayN、v2rayNG、v2flyNGはクライアント、V2RayとXrayは接続を処理するコアです。サブスクリプションの取得失敗はクライアントの更新機能で起きる場合があり、その時点ではコアにリクエストが届いていません。一方、ログに proxy/vless/outbound、transport/internet などのモジュールパスがあれば、通常はコアでの処理が始まっています。問題の種類によって確認を始める場所が異なります。
v2rayNでは、まずメイン画面のログ欄を確認し、「設定」→「パラメータ設定」でログ関連の項目を探します。v2rayNGでは、メイン画面のメニューから「ログ」を開き、「設定」でログレベルを確認します。項目の場所や表示名はバージョンによって異なる場合があります。クライアントのバージョンと、起動ログに表示されるコアの名称・バージョンを記録してください。「V2Rayを使用」とだけ記録するのでは不十分です。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用するため、アプリ名だけでエラー形式を判断できません。
| ログの種類 | 主に分かること | 優先して確認する項目 |
|---|---|---|
| クライアントの通知 | 設定をインポートできたか、サブスクリプションを取得できたか、プロセスが起動したか | サブスクリプションURL、起動パス、設定の生成結果 |
| アクセスログ | リクエストがコアに届いたか、接続先はどこか、どのアウトバウンドが選ばれたか | インバウンドのポート、ルーティングタグ、アプリのプロキシ設定 |
| エラーログ | 接続がどの段階で中断したか、下位層からどのエラーが返ったか | 待ち受け、名前解決、接続、TLS、プロトコル認証 |
ログレベルとエラーの流れを読む
V2Ray/Xrayでよく使われる loglevel の値は debug、info、warning、error、none です。トラブルの切り分けでは、まず一時的に info を使い、情報が足りなければ debug に上げます。error だけでは警告や通常の情報が表示されず、none ではログが出なくても接続が正常とは判断できません。
{
"log": {
"loglevel": "info"
}
}
上記はコア設定に含まれるログ部分の例で、設定ファイル全体を置き換えるものではありません。クライアントで設定を生成している場合は、まず画面上の項目を変更してください。生成済みファイルを一時的に編集しても、ノードを切り替えると上書きされることがあります。アクセスログやエラーログの出力先は、access、error などの項目やクライアントの起動方法によって異なります。ログレベルを上げても、必ずファイルに出力されるとは限りません。
- まず時刻を確認します。テストを実行したとき、またはページを再読み込みした時刻を記録し、その前後約10秒のログを探します。バックグラウンドアプリのリクエストと混同しないようにしましょう。
- 次に関連情報を確認します。角括弧内に接続IDがあれば、同じIDの行をまとめて追います。IDがない場合は、接続先アドレス、ポート、時刻を手がかりに判断します。
- 外側から内側へ読みます。
failed to process outbound trafficは通常、外側の概要を示すエラーです。その後に続くconnection refusedやlookup ...のほうが、直接の原因に近い情報です。 - 最初に発生した異常を確認します。プロセスの起動に失敗すると、その後のテストがすべてタイムアウトすることがあります。まず起動時のエラーを解消してから、通信リクエストの失敗を調べてください。
この流れは確認する層を絞るための目安であり、すべてのプロトコルが同じ順序で処理されるわけではありません。たとえばサーバーアドレスがIPアドレスなら、そのアドレスの名前解決は不要です。ルーティングルールによって別途ドメイン名が解決される場合もあります。現在の設定とログに基づいて判断してください。
接続タイムアウト、拒否、名前解決エラー
「タイムアウト」は待ち時間が上限を超えたことを示すだけで、ローカルDNS、リモートポート、ハンドシェイク応答のどこに問題があるかまでは分かりません。エラーに記載された接続先を確認してください。プロキシサーバーの場合もあれば、直接接続するWebサイトやサブスクリプションサーバーの場合もあります。timeout が見えただけで、DNSやルーティングルールを一括変更しないようにしましょう。
エラー:i/o timeout
原因と対処:読み込み、書き込み、接続のいずれかが制限時間内に完了していません。直前の接続先を見て発生段階を判断し、サーバーのポートとハンドシェイクを個別に確認してください。タイムアウトだけを根拠にパスワードの誤りと決めつけないようにしましょう。
エラー:connection refused
原因と対処:接続先から拒否応答が返されています。接続先ポートで待ち受けていない場合や、接続が明示的に拒否された場合によく発生します。サーバーのポートとサービスの状態を確認してください。接続先が127.0.0.1なら、まずローカルのコアが起動しているか確認します。
エラー:no such host
原因と対処:現在の名前解決経路で有効なドメイン名の結果を取得できていません。サーバーのドメイン名の入力ミス、システムDNS、コアのDNS設定を確認し、DNSサーバー自体にアクセスできるかも確認してください。
エラー:failed to find an available destination
原因と対処:候補となる接続先への接続を確立できていません。名前解決、接続、再試行の上限到達などが考えられます。後続のエラーを展開し、最も具体的な下位エラーに対処してください。このメッセージだけを見てDNSを変更するのは避けましょう。
Windowsで名前解決とポートを個別に確認する
以下のコマンドでは、説明用に予約されたサンプルドメインを使用しています。実行前に、現在のノードの実際のサーバーアドレスとポートに置き換えてください。ブラウザーでアクセスするWebサイトのアドレスや、TLSの serverName は、サーバーアドレスと同じ場合を除いて入力しないでください。
Resolve-DnsName server.example.com
Test-NetConnection server.example.com -Port 443
Resolve-DnsNameで確認できるのはシステムの名前解決経路であり、コア内蔵DNSの結果とは異なります。システムでは名前解決できるのにコアでは失敗する場合は、コアのDNSサーバーとルーティングを確認してください。TcpTestSucceeded : Trueが示すのは、その時点でTCP接続に成功したことだけです。UUID、TLS、WebSocketのパス、リモート側の転送が正しいことまでは確認できません。- TCPテストに失敗しても、UDPベースの通信については判断できません。まず実際の通信方式を確認し、それに合った診断方法を選んでください。
TLSハンドシェイク失敗と時刻のずれ
ハンドシェイク失敗は、安全な接続のネゴシエーションまたはプロトコルの初期化中に接続が中断したことを示しますが、原因が証明書とは限りません。TCP接続が可能なことを確認してから、安全性の種類、サーバー名、証明書、通信パラメーター、認証情報の順に確認します。VLESSのUUID検証とTLS証明書の検証は別の層です。証明書名を修正しても、UUIDが正しいとは限りません。
エラー:x509: certificate has expired or is not yet valid
原因と対処:証明書の有効期間と端末の現在時刻が一致していません。まずシステムの日付・時刻と時刻同期を確認し、その後、サーバー管理者に証明書の期限切れがないか確認してもらってください。
エラー:x509: certificate signed by unknown authority
原因と対処:現在の環境で証明書チェーンを信頼できていません。サーバーから証明書チェーン全体が送信されているか、ローカルの信頼ストア、ネットワーク上での証明書置き換えを確認してください。証明書検証を無効にして解決しようとしないでください。
エラー:tls: handshake failure
原因と対処:接続先がTLSネゴシエーションを終了しています。SNI、プロトコルポリシー、サーバー設定などが関係している可能性があります。まずTLSの有効・無効とサーバー名を確認し、同じ時間帯のサーバーログも確認してください。
エラー:EOF
原因と対処:接続が終了したことを示しますが、このメッセージだけでは原因を特定できません。ハンドシェイク中かデータ転送中かを確認し、ポート、通信方式、パス、認証情報を見直したうえで、直前に発生した異常も確認してください。
まず時刻を同期し、次にノードの設定項目を確認する
- Windowsでは「設定」→「時刻と言語」→「日付と時刻」を開き、自動時刻設定を有効にして同期します。
w32tm /query /statusで時刻サービスの状態を確認できます。このコマンドがエラーになっても、時刻サービスがまだ起動していないだけの場合があります。 - Androidではシステムの「設定」を開き、「日付と時刻」を検索して、自動設定を有効にします。実際の日付と時刻を確認してください。表示するタイムゾーンを切り替えるだけでは、システム時計は補正されません。
- VMessでは、クライアントとサーバーの時刻のずれが認証失敗につながることがあります。両方の時刻を同期してください。スマートフォンの表示タイムゾーンだけを変更しても解決しません。VLESSに同じVMessの時刻認証の説明を当てはめることはできませんが、TLS接続で証明書を検証するには正確な時刻が必要です。
- サーバーアドレス、ポート、UUID、安全性の種類、
serverName、WebSocketのpathとHost、またはgRPCのserviceNameを一つずつ照合してください。各項目にはサーバー側で指定された値を使い、手当たり次第に変更して試さないようにしましょう。
ポート競合:まずコアを正常に起動する
ログに bind、address already in use、またはWindowsの Only one usage of each socket address が表示された場合は、まずローカルの待ち受けアドレスを確認してください。ローカルのインバウンドを作成できないと、システムプロキシを有効にしてもブラウザーの接続先がありません。リモートサーバーのポートが開いているかどうかとは別の問題です。
ログに 127.0.0.1:10808 のバインド失敗が表示された場合を例に、PowerShellで待ち受けプロセスを調べます。実際のエラーで別のポートが示されている場合は、コマンド内のポートも同じ値に変更してください。
Get-NetTCPConnection -LocalPort 10808 -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess
Get-Process -Id 1234
2つ目のコマンドにある 1234 はプロセスIDの例です。1つ目のコマンドの結果に表示された OwningProcess の値に置き換えてください。該当する記録が見つからない場合は、ログがUDPの待ち受けに関するものか、プロセスがすでに終了していないか、古い起動ログではないかも確認します。
- 待ち受けているのが重複起動したクライアントの場合は、余分なインスタンスを通知領域から通常の方法で終了し、一つだけ起動して確認してください。
- 待ち受けているのが終了できない別のプログラムの場合は、クライアントのパラメーター設定でローカルの待ち受けポートを変更します。手動プロキシを使用するアプリ側のポートも新しい値に変更してください。
- 変更後はコアを再起動し、正常な起動ログが表示されたことを確認してからWebページをテストします。正体の分からないシステムプロセスを強制終了しないでください。
- エラーが
permission deniedまたはaccess permissionsの場合は、システムによるポート予約やセキュリティポリシーが関係している可能性もあります。重複プロセスが原因と決めつけたり、原因を覆い隠すために管理者権限で常用したりしないでください。
再現可能なトラブル記録を作る方法
ノードの切り替え、DNSの変更、TUNの有効化、ルーティングの調整を同時に行うと、接続が復旧しても、どの変更が有効だったか分かりません。接続先、ノード、接続方式を一つずつ固定し、各テストの時刻とログを照合するのが確実です。以下の手順はデスクトップとAndroidの同様の問題に使えます。
- 現在の状態を記録:クライアントとコアのバージョン、使用中のネットワーク、プロキシの接続方式、接続先を記録し、不要なバックグラウンドダウンロードを停止します。
- 起動を確認:接続を再起動し、設定の解析失敗、待ち受け失敗、必要なリソースの不足など、起動時のエラーを先に解決します。
- リクエストを1回だけ実行:時刻を記録し、ページを1つだけ一度再読み込みして、前後約10秒のログを残します。
- 最も深い原因を特定:ローカルの待ち受け、名前解決、リモートへの接続、TLS、プロトコル認証のどの段階かを見分け、該当する項目を確認します。
- 変更は一つだけ:たとえば時刻だけを同期する、または誤ったポートだけを修正します。同じ接続先を再テストし、具体的なエラーが消えたか、次の段階に移ったかを比較してください。
- ログ設定を元に戻す:確認が終わったらデバッグレベルを解除し、有効だった変更を記録します。ログを共有する前に、UUID、サブスクリプション用トークン、サブスクリプションURL全体、個人のアクセス記録を削除し、モジュール名とエラーの流れは残してください。
アウトバウンドタグとルールの関係を詳しく知りたい場合は、設定項目の説明をご覧ください。リクエストがダイレクト接続のアウトバウンドに送られている場合は、ルーティングの一致条件を確認してください。直接接続先の失敗を、プロキシサーバーへの接続失敗と混同しないようにしましょう。
よくある質問:ログだけで判断できないケース
ログにwarningが出続けています。接続は使えないのでしょうか?
いいえ。指定した時刻に接続先へアクセスし、そのリクエストの記録を照合してください。バックグラウンドでの再試行、キャンセルされた接続、一部の接続先での失敗でも警告が出ることがあります。同じリクエストが繰り返し失敗し、エラーを再現できる場合に、トラブルの手がかりとして使えます。
サブスクリプションの更新がタイムアウトするのに、コアのログに何も出ないのはなぜですか?
サブスクリプションのダウンロードは、クライアント自体が行う場合があります。まず更新時の通知を確認し、サブスクリプションURLがまだ有効か確かめてから、現在のバージョンの更新用プロキシ設定を確認してください。現在のプロキシが使える場合に限り、プロキシ経由での更新を試します。コアのログが空だからといって、サブスクリプションサーバーが正常とは限りません。
ノードのテストには成功したのに、ブラウザーでページが開きません。次に何を確認すればよいですか?
まずテストの種類を確認してください。TCPポートのテストと、Webページへのアクセス全体は別のものです。ブラウザーからリクエストを送信し、アクセスログを確認します。記録がなければシステムプロキシまたはブラウザーのプロキシ設定を確認し、記録があればアウトバウンドタグと後続のエラーを確認してください。
最後の1行だけを切り取って管理者に送ってもよいですか?
同じ接続のエラー全体、リクエストの時刻、クライアントとコアのバージョン、問題の前後約10秒の関連ログを残すのがおすすめです。最後の行にあるEOFやタイムアウトは結果にすぎないことが多く、その前の接続先アドレスやハンドシェイクエラーが調査の方向を決めます。