v2rayNのコア起動時にリッスンに失敗する、ノード切り替え直後に終了する、アプリからローカルプロキシに接続できない場合に役立ちます。まずログで失敗したアドレスとポートを確認し、Windowsのコマンドで待ち受けプロセスを特定します。プロセスの用途に応じて、重複起動したインスタンスを終了するかポートを変更し、最後にシステムプロキシとアプリの設定を更新します。この記事ではWindowsを中心に、macOSとLinuxでの確認コマンドも紹介します。
待ち受けエラーとノードのタイムアウトを見分ける
ローカルの待ち受けポートは、ブラウザーやターミナルなどのアプリからコアへ通信を渡す入口です。リモートノードのサーバーポートとは異なります。コアの起動時にログへ bind、listen tcp、または「アドレスが使用中」と表示された場合は、まずローカルの待ち受け設定を確認してください。この段階では、サブスクリプションの更新やVMess、VLESSノードの設定変更では通常、ポート競合を解消できません。
v2rayNのメイン画面でログ欄を開き、コアの起動開始から失敗までの記録をすべて確認します。「起動に失敗しました」などの説明の内側に、実際のエラーが記録されていることがあります。探すべきなのは一番内側の行で、通常は待ち受けプロトコル、IPアドレス、ポート、システムエラーが示されます。以下はエラーの一例です。すべてのバージョンで同じログ全体が出力されるとは限りません。
bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因:Windowsでよくあるアドレス使用中のエラーです。ソケットエラー10048に該当し、別の待ち受けプロセスがすでに同じアドレスとポートをバインドしている可能性があります。
対処法:ログに表示されたポートの待ち受けPIDを調べ、プロセスを特定してから重複インスタンスを終了するか、現在のインスタンスに別の空きポートを割り当てます。
bind: An attempt was made to access a socket in a way forbidden by its access permissions.
原因:Windowsのソケットエラー10013です。除外ポート範囲、排他的バインド、セキュリティポリシーなどが関係している可能性があり、通常の待ち受けプロセスが見つかるとは限りません。
対処法:まず待ち受け情報を確認し、次にシステムの除外ポート範囲を調べます。管理者として何度も起動する方法を恒久的な解決策にしないでください。
bind: address already in use
原因:macOSやLinuxでよく見られるアドレス使用中のエラーです。現在の設定では指定したアドレスにバインドできないことを示します。
対処法:lsofまたはssで待ち受けプロセスを特定し、v2rayNが二重に起動していないか確認します。
ポートとバージョンを確認する
チュートリアルに載っている数字だけで競合と判断しないでください。Windows版v2rayN 6.xの従来型インターフェースでは、SOCKSポートに10808、HTTPポートに10809を使うのが一般的です。新しいバージョンや異なるコア設定では、HTTPとSOCKSの両方を1つのポートで受け付ける混合リスナーを使用する場合があります。アップグレードや設定移行後に旧ポートが残ることもあるため、この記事ではこの2つを確認対象として扱い、すべてのバージョン共通の初期値とはみなしません。
| 確認項目 | 例・範囲 | 判断の目安 |
|---|---|---|
| 従来型の分離リスナー | SOCKS 10808、HTTP 10809 | v2rayN 6.xでよく使われる初期設定。現在の設定画面で確認してください |
| 混合リスナー | 1つのポートで2種類のプロキシリクエストを受け付ける | 画面上のリスナー種別と実際のコアログを確認し、ポート番号だけでプロトコルを判断しない |
| ループバックアドレス | 127.0.0.1、::1 | IPv4とIPv6のループバックアドレスです。エラーに表示されたアドレスと照合してください |
| すべてのインターフェース | 0.0.0.0、:: | バインド範囲が広く、同じポートを使う特定アドレスのリスナーと競合する可能性があります |
「LAN内からの接続を許可」を無効にしても、ポートが解放されるわけではありません。主に待ち受け範囲が変わります。ローカルでのみ使用する場合は、ループバックアドレスでの待ち受けを優先してください。競合を避けるためにアドレスをすべてのインターフェースへ変更したり、試行錯誤でLAN向けの追加リスナーを有効にしたりしないでください。
Windows:ポートからPIDとプログラムのパスを特定する
PowerShellで次のコマンドを実行します。待ち受け情報を表示するだけで、プロセスは終了しません。結果が表示されない場合は、そのポートで現在待ち受けていないか、起動失敗後にコアが終了した可能性があります。アクセス権が不足している場合は管理者ターミナルで再確認できますが、確認に必要な権限とコアを管理者権限で実行すべきかどうかは別の問題です。
# TCPの待ち受けを確認し、アドレス、ポート、プロセスIDを表示
Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue |
Where-Object { $_.LocalPort -in 10808,10809 } |
Select-Object LocalAddress,LocalPort,OwningProcess
# 待ち受けプロセスの名前、実行ファイルのパス、コマンドラインを取得
$ownerIds = @(Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue |
Where-Object { $_.LocalPort -in 10808,10809 } |
Select-Object -ExpandProperty OwningProcess -Unique)
Get-CimInstance Win32_Process |
Where-Object { $_.ProcessId -in $ownerIds } |
Select-Object ProcessId,Name,ExecutablePath,CommandLine
コマンドプロンプトでは、Windows標準のnetstatも使えます。次の式はローカルポートに一致する記録を抽出するため、リモートの10808への接続をローカルの待ち受けと誤認しにくくなります。状態欄も確認し、TCPが待ち受け中と判断できるのはLISTENINGの場合だけです。
netstat -ano -p tcp | findstr /R /C:":10808 " /C:":10809 "
- PIDを記録:出力の最後の列がプロセスIDです。「タスク マネージャー」→「詳細」タブでPIDを照合し、名前だけで判断しないでください。
- 保存場所を確認:同じ名前のコアでも、異なる場所にあるv2rayNから起動していることがあります。実行ファイルのパスとコマンドラインを確認し、どのクライアントのフォルダーに属するか特定してください。
- 接続状態を区別:
TIME_WAITはプロキシの入口として待ち受けているプロセスではありません。この状態だけで、特定のアプリがポートを占有しているとは判断できません。 - プロトコルを確認:TCPとUDPではポートの扱いが異なります。ログにUDPのバインド失敗が明記されている場合に限り、
Get-NetUDPEndpointで該当ポートを調べてください。
判断のポイント:プロセスを特定してから終了する
2つのポートを同じ旧クライアントフォルダー内のコアが使用している場合は、そのクライアントを終了するのが先です。使用中のサービスがポートを占有している場合は、現在のv2rayNのポート変更が適しています。プロセス名にxrayやv2rayが含まれるという理由だけで、強制終了しないでください。
ポートを解放するか、設定で別のポートに変更する
同じPCでv2rayNを2つ起動している、画面を閉じてもタスクトレイで動作している、旧コアのプロセスがメインプログラム終了後も残っている、といった状況では「起動直後に使用中」と見えることがあります。まず現在の設定を保存し、修復方法を1つ選んでください。ノードアドレス、DNS、ルーティング、待ち受けポートを同時に変更すると、どの操作が効いたのか判断しにくくなります。
-
重複インスタンスを終了する
タスクバーの通知領域を確認し、不要なv2rayNインスタンスを「終了」します。メインウィンドウを閉じただけでは、タスクトレイに最小化されて動作を続ける場合があります。終了後、ポートを再確認して待ち受け記録が消えたことを確認してください。
-
残存プロセスを確認する
メインプログラムを終了してもポートが使用中の場合は、「タスク マネージャー」→「詳細」タブで、先ほど確認したPID、プログラムのパス、コマンドラインを照合します。不要だと確認できた残存コアに限り「タスクの終了」を実行してください。システムプロセスや正体不明のサービスは終了しないでください。
-
設定画面を開く
従来型メニューのv2rayNでは、「設定」→「パラメーター設定」を開き、ローカル待ち受けの設定を探します。6.xの従来型画面では通常、「Core:基本設定」ページの「ローカルリスニングポート」で確認できます。別の画面では、SOCKS、HTTP、混合リスナーの実際の項目を確認してください。
-
空きポートを選ぶ
確認コマンドの数字を
11808,11809に置き換えて、候補のポートを調べます。分離リスナーでは、有効にする各入口の空きを確認してください。HTTPポートが基本ポートの1つ後ろに自動設定される場合は、隣接するポートも確認し、2つの項目を個別に編集できるとは限らない点に注意してください。 -
保存して再起動する
設定を保存し、コアを再読み込みします。自動で再起動しない場合は、v2rayNを通常の手順で終了してから起動し直してください。ログとTCPの待ち受け一覧を再確認し、新しいポートを想定したフォルダーのコアが使用していることを確認します。
使用中のプロセスが見つからないのにバインドに失敗する場合
まずログに記録されたアドレスとポートを照合し、もう一度確認してください。ログに別のポートが表示されているなら、10808/10809だけを調べても見つかりません。失敗した瞬間に別のプログラムも終了していれば、後から確認しても何も表示されないことがあります。ポート番号に間違いがない場合は、Windowsのエラー10013について、除外ポート範囲を確認してください。
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp
出力には開始ポートと終了ポートが表示されます。対象ポートがいずれかの範囲に含まれる場合に限り、今回のバインド失敗に関係します。一覧が長いだけでシステム障害と判断しないでください。システムのネットワークコンポーネントや仮想化機能が範囲を管理している場合があります。範囲を直接削除したり、システムサービスを無効にしたりすると、他のネットワーク機能に影響するため、範囲外で待ち受けプロセスもいないポートへの変更を優先してください。
- 実際のアドレスを確認:
127.0.0.1:10808と[::1]:10808では、待ち受けアドレスが異なります。ワイルドカードアドレスでのバインドは他のアドレスにも影響する場合があるため、調査ではアドレス列全体を確認してください。 - セキュリティの記録を確認:空いていると確認済みの複数のポートに変更しても失敗する場合は、システムやセキュリティソフトのブロック記録を確認してください。保護機能を無効にしたり、広範囲の受信許可ルールを追加したりしないでください。
- ローカルとリモートを区別:ファイアウォールがリモート接続をブロックした場合、通常は接続失敗やタイムアウトになります。「Webページが開かない」というだけで、ローカルのポート競合と決めつけないでください。
macOS・Linuxで同様に確認する方法
v2rayNデスクトップ版を使う場合は、現在の設定でポートを確認してから、以下のコマンドの数字を置き換えてください。macOSではlsof、Linuxではssを使えます。プロセスのパスや権限を表示するには、管理者権限が必要な場合があります。使用中のプロセスを終了する前に、所属アプリから通常の手順で終了してください。
# macOS:2つの例示ポートを個別に確認
lsof -nP -iTCP:10808 -sTCP:LISTEN
lsof -nP -iTCP:10809 -sTCP:LISTEN
# Linux:待ち受けソケットとプロセスを確認
sudo ss -ltnp '( sport = :10808 or sport = :10809 )'
変更後はシステムプロキシとアプリの設定も更新する
ポート変更で修復できるのは待ち受け側だけです。ブラウザー、ターミナル、開発ツールなどが旧ポートに接続したままだと、「コアは起動したのにアプリがネットワークに接続できない」状態になります。v2rayNで「システムプロキシ」→「システムプロキシを自動設定」を再適用してください。現在の画面にこのメニュー名がない場合は、同等のシステムプロキシ自動設定を選び、システムに登録された実際のアドレスを確認してください。
| 利用方法 | 更新する場所 | 確認方法 |
|---|---|---|
| Windowsのシステムプロキシ | 「設定」→「ネットワークとインターネット」→「プロキシ」の手動プロキシ | アドレスとポートが新しいHTTPまたは混合リスナーを指しているか確認する |
| アプリ側で手動プロキシを設定 | アプリ独自のネットワークまたはプロキシ設定 | HTTP専用の古い入口にSOCKS5の設定を誤って入力していないか確認する |
| ターミナルの環境変数 | HTTP_PROXY、HTTPS_PROXY、ALL_PROXY | 現在のターミナルセッションと起動設定に旧ポートが残っていないか確認する |
| バックグラウンドツールやサービス | ツールの設定ファイル、サービスの起動引数 | 変更後はツールの手順に従って再読み込みまたは再起動する |
PowerShellで新しいTCPの入口をテストできます。以下は11808を実際に有効にした場合の例です。TcpTestSucceeded : TrueはTCP接続が確立したことを示すだけで、待ち受けプロセスが正しいこと、プロキシプロトコルが利用できること、リモートノードに接続できることは保証しません。PIDの確認結果と実際のリクエストを合わせて判断してください。
Test-NetConnection -ComputerName 127.0.0.1 -Port 11808
動作確認:待ち受けの復旧とノードへの接続は分けて判断する
まずログにバインドエラーがないこと、ポートを想定したプロセスが使用していること、アプリが新しい入口に接続していることを確認します。その後、正常に表示できると分かっているページへのプロキシリクエストを試してください。この段階でリモート接続がタイムアウトする場合は、ノードアドレス、トランスポート設定、サーバーの状態を調べます。ローカルポートを何度も変更し続けないでください。
ポート競合に関するよくある質問
PCを再起動すると直るのに、しばらくするとまた競合するのはなぜですか?
別のv2rayNがスタートアップに登録されていないか、ほかのプロキシサービスが遅れて起動していないか確認してください。競合の前後でポート、PID、プログラムのパスを記録し、重複インスタンスの自動起動を無効にするか、同時に使う必要があるインスタンスに別のポートを割り当てます。再起動でプロセスを一時的に整理できても、設定の競合は解消されません。
10808を変更したのに、ログで10809が使用中と表示されるのはなぜですか?
現在の設定でHTTPの入口が別に有効になっているか、基本ポートから隣接するポートが自動的に設定されている可能性があります。「設定」→「パラメーター設定」に戻り、有効な待ち受け項目をすべて確認してください。新しいログに表示されたアドレス全体も確認します。クライアントから保存せずファイルだけを変更した場合、ファイルが再生成されている可能性もあります。
ローカルポートをノードの443に変更できますか?
ローカルの入口とリモートノードのポートを同じにする必要はありません。競合回避のためにローカルの待ち受けを443に変更する必要はなく、ほかのサービスとの競合や権限の制限が生じるおそれもあります。ノードのサーバーポートはそのままにし、設定画面でローカルの入口だけを変更して、アプリの設定も更新してください。
変更後、ブラウザーは直ったのにターミナルが旧ポートへ接続するのはなぜですか?
ブラウザーはシステムプロキシを使い、ターミナルのツールは環境変数を参照している可能性があります。PowerShellでGet-ChildItem Env:*PROXY*を実行して現在のセッションを確認し、ターミナルの起動スクリプトとツール独自のプロキシ設定も調べてください。環境変数を永続的に変更した場合、すでに開いているターミナルでは新しい値を読み込むために再起動が必要です。