v2rayNのコア起動時に待受に失敗する、またはシステムプロキシが10808を指しているのに接続できない場合に役立ちます。まずエラーに表示されたアドレスとポートを確認し、システムコマンドで待受中のプロセスを特定します。そのプロセスを終了できない場合はv2rayNのローカルポートを変更し、旧ポートを使うアプリの設定も一つずつ更新してください。
競合しているのがローカル待受ポートか確認する
v2rayNのローカルSOCKSまたはHTTPポートは、ブラウザーやターミナルなどのアプリからプロキシリクエストを受け付けます。ノード設定にあるリモートサーバーのポートとは別の設定です。ログに 127.0.0.1:10808 のバインド失敗が表示された場合、確認するのは使用中のパソコンの10808番ポートであり、サブスクリプションURLやノードのアドレスではありません。
まずv2rayNのログでエラー全文を確認し、プロトコル、待受アドレス、ポートを記録します。設定によっては10808や10809以外の場合や、手動で変更されている場合もあります。よく使われるポート番号だけで判断しないでください。エラーが 0.0.0.0:10808 を示している場合は、同じポートを別のローカルアドレスで使用しているプロセスも確認します。
ポート競合は処理の2段階目、コアがローカル接続を正常に受け付ける前に発生します。この場合、VMessやVLESSのノードを切り替えても通常は解決しません。ポートの待受が始まっているのに特定のノードだけ接続できない場合は、ノードの状態、ルーティング、DNSを確認してください。
エラー:bind: address already in use
原因と対処:指定したローカルアドレスとポートが別のプロセスに使用されています。待受中のプロセスを調べ、重複して起動したインスタンスを終了するか、v2rayNに未使用のポートを設定してください。
エラー:Only one usage of each socket address is normally permitted
原因と対処:Windowsが同じソケットアドレスへの重複バインドを拒否しています。netstatでPIDを確認し、そのプロセスがまだ必要か調べてください。
エラー:connection refused 127.0.0.1:10808
原因と対処:アプリは10808に接続しようとしていますが、そのアドレスで利用可能なプロキシが待ち受けていません。v2rayNの現在のポートを確認し、アプリ側のプロキシアドレスも更新してください。接続拒否だけでポート競合と判断しないでください。
Windows:netstatとPIDで使用中のプロセスを特定
コマンドプロンプトで10808と10809をそれぞれ調べます。netstat -anoにはローカルアドレス、接続状態、PIDが表示されます。状態がLISTENINGで、ローカルアドレスのポートがエラーと一致する行を確認してください。リモートアドレスに10808と表示されても、ローカルの待受競合を意味するわけではありません。
netstat -ano | findstr :10808
netstat -ano | findstr :10809
tasklist /FI "PID eq 4321"
上の例の4321はサンプルのPIDです。3つ目のコマンドを実行する際は、検索結果の最後の列に表示された値に置き換えてください。findstrは文字列を絞り込むだけなので、近い番号のポートや既存の接続が一致する場合があります。ローカルアドレスの列全体とLISTENINGの状態を確認し、絞り込み結果だけを根拠にプロセスを終了しないでください。
| 検索結果 | 判断方法 | 次の手順 |
|---|---|---|
127.0.0.1:10808、LISTENING | そのプロセスは対象のローカルアドレスで待受中です。 | PIDからプログラム名を調べ、v2rayNが重複起動していないか確認します。 |
0.0.0.0:10808、LISTENING | プロセスはすべてのIPv4ローカルアドレスでそのポートを待ち受けています。 | まずプロセスの用途を確認してから、終了するかポートを変更するか判断してください。 |
ESTABLISHEDの行のみ | この結果だけでは、対象アドレスで待受中のプロセスがあるとは判断できません。 | ログのポートを再確認し、コアの再起動時にもう一度検索してください。 |
PowerShellでローカルポートと待受状態を指定して絞り込むこともできます。まずOwningProcessを確認し、続けてプロセス名を調べます。別の稼働中サービスが使っている場合は、v2rayN側のポート変更を優先してください。用途が分からないシステムプロセスを、ポートを空けるためだけに終了しないでください。
Get-NetTCPConnection -LocalPort 10808 -State Listen
Get-Process -Id 4321
macOS・Linux:lsofで待受アドレスを確認
ターミナルでlsofを実行する際、-nPを指定するとアドレスやポートが数値で表示され、ログと直接比較できます。-sTCP:LISTENは結果をTCPの待受プロセスに絞り込みます。まずはsudoなしで調べ、権限の制限でプロセス情報が不足する場合に管理者権限で再実行してください。
lsof -nP -iTCP:10808 -sTCP:LISTEN
lsof -nP -iTCP:10809 -sTCP:LISTEN
sudo lsof -nP -iTCP:10808 -sTCP:LISTEN
出力のCOMMANDはプロセス名、PIDはプロセスの特定に使う番号、NAMEは待受アドレスです。127.0.0.1:10808、*:10808、IPv6の待受結果が表示されたら、v2rayNのログにあるバインドアドレスと照らし合わせて競合範囲を確認します。同じプログラムの古いインスタンスが終了せず、コアのプロセスが残っていることもあります。
コマンドの出力が空でも、検索時点で条件に一致するTCP待受プロセスが見つからなかったという意味にすぎません。コアの起動時に別のプログラムが一時的にポートを取得した、またはエラーが別のポートを示している可能性があります。ログ全文を保存し、コアの再起動と同時にもう一度検索してください。
プロセスを終了する前に提供元を確認し、対応するプログラムから通常の終了操作を行ってください。常時稼働が必要なローカルサービスがポートを使用している場合は、未使用のポートに変更するのが適切です。ポート番号は速度を決める設定ではありません。10808から20808に変更しても、リモート接続が速くなるわけではありません。
v2rayNのポートを変更し、プロキシの接続先も更新する
ここでは、SOCKSポートを10808から20808に、個別に設定したHTTPポートを10809から20809に変更する例を紹介します。実際の画面では、バージョンによって「ローカル待受ポート」「SOCKSポート」「HTTPポート」などの名称が使われています。現在の設定項目を確認してから、該当する入口を変更してください。設定が1つの混合プロキシ入口のみの場合は、例に合わせて存在しない2つ目の待受ポートを設定しないでください。
現在のポートを記録する
v2rayNのメイン画面で現在のシステムプロキシの状態を確認し、「設定」→「パラメーター設定」にあるローカル待受ポートを記録します。ブラウザーやターミナルで使用中の
127.0.0.1のポートも控えておくと、あとで一つずつ更新できます。新しいポートを確認する
前述のシステムコマンドで20808を確認します。独立したHTTP入口を使う場合は、20809も確認してください。検索時に待受プロセスが見つからないことは事前確認の一つにすぎません。設定を保存した後、コアが正常にバインドできるかも確認が必要です。
待受ポートを変更する
「設定」→「パラメーター設定」を開き、エラーに対応するローカルSOCKS待受ポートを
20808に変更します。個別のHTTPポートがあり、その入口を現在有効にしている場合は20809に変更し、設定を保存してください。コアを再起動する
v2rayNの画面からコアを再起動し、新しいログにバインド失敗が出ていないか確認します。続けて
netstatまたはlsofで新しいポートを調べ、待受プロセスが表示されることを確認してください。アプリ側の設定も更新する
v2rayNのシステムプロキシ設定を再適用します。プロキシを手動設定しているブラウザー、ターミナル、その他のデスクトップアプリでは、それぞれ旧ポートを対応する新しいポートに変更してください。v2rayNだけ変更してアプリを更新しないと、アプリは引き続き旧ポートに接続します。
ブラウザーがシステムプロキシを使っている場合は、設定を再適用した後のサーバーアドレスとポートを確認してください。ブラウザーに個別のプロキシ設定がある場合は、ネットワーク設定またはプロキシ設定から直接変更します。HTTPプロキシは実際に有効なHTTPまたは混合入口に、SOCKS5プロキシは実際に有効なSOCKSまたは混合入口に接続してください。ポート番号だけでなく、プロトコルの種類も確認しましょう。
新しいポートを確認し、「待受中なのにインターネットに接続できない」状態を切り分ける
確認は2段階で行います。まず新しいポートを想定どおりのプロセスが待ち受けているか調べ、次にアプリからそのポート経由でリクエストを送ります。以下のcurlコマンドは、個別のHTTP入口とSOCKS5入口をそれぞれテストします。現在の設定にある入口だけを実行してください。socks5hは接続先ドメインの名前解決をプロキシ側で行う指定です。このテストでは、ローカルDNSの結果が影響するのを避けられます。
curl -I --proxy http://127.0.0.1:20809 https://example.com
curl -I --proxy socks5h://127.0.0.1:20808 https://example.com
コマンドがconnection refusedを返す場合は、待受プロセスの有無、アドレスが127.0.0.1かどうか、ポートとプロトコルが正しいかを確認してください。リクエストがコアに届いた後でタイムアウトする場合は、ノードへの接続、ルーティングルール、DNSを調べます。ローカルポートを繰り返し変更する必要はありません。
20808に変更したのに、ブラウザーが接続できないのはなぜ?
ブラウザーがシステムプロキシを参照しているか、個別のプロキシ設定を保存しているか確認してください。個別設定の127.0.0.1:10808は、v2rayNの設定を変更しても自動更新されません。実際に有効な入口に変更してから、ページを再読み込みしてテストしてください。
ターミナルのポートを変更したのに、curlが古いアドレスを使うのはなぜ?
現在のターミナルセッションでHTTP_PROXY、HTTPS_PROXY、ALL_PROXYと、それぞれの小文字の環境変数を確認します。コマンドで--proxyを個別に指定していないかも確認してください。変数を更新したら、同じターミナルセッションでテストを再実行します。
netstatで使用中のプロセスがv2rayNと表示されたら、終了してもよい?
まずv2rayNを2つ起動していないか確認し、不要なインスタンスを画面から正常に終了します。次に古いコアのプロセスが終了したことを確認し、1つのインスタンスだけを起動して待受PIDを再確認してください。
ポートは正常に待ち受けているのに、サブスクリプションのノードがすべてタイムアウトする場合は?
ローカルで正常に待ち受けていることから分かるのは、アプリがプロキシ入口に接続できることだけです。まずv2rayNでコアのログと現在のノードの状態を確認し、サブスクリプションの内容、リモートサーバーへの接続、ルーティングルールを個別に調べてください。リモート接続のタイムアウトをローカルポート競合と混同しないでください。
最後に、システムプロキシと手動設定のプロキシが同じ新しいポートを参照しているか確認します。ターミナルのプロキシ環境変数を設定していた場合は、ターミナルを閉じて開き直した後、起動設定にあるポートも更新済みか確認してください。変更前のポートを記録しておきます。元に戻す場合は、元のポートが使用されていないことを確認してから、v2rayNと各アプリの設定を対応する値に戻してください。