v2rayNのポート競合で起動できない場合:競合プロセスの特定とローカル待受ポートの変更

起動時にポート競合が表示される場合、ローカルの10808/10809番ポートを別のプログラムが使用している可能性があります。システムコマンドで使用中のプロセスを特定し、v2rayNのローカル待受ポートを安全に変更する手順を解説します。

この記事の概要

v2rayNのコア起動に失敗し、ログにbindやaddress already in useと表示されるWindowsユーザー向けの記事です。まず競合ポートを確認し、PIDから使用中のプログラムを特定します。その後、古いプロセスを終了するかv2rayNの待受ポートを変更し、最後にシステムプロキシやブラウザーなど外部アプリのポート設定を同期します。

10808、10809とコアの待受失敗を切り分ける

v2rayNがV2RayまたはXrayコアを起動すると、ローカルにインバウンドの待受ポートが作成されます。一般的な設定では10808をSOCKS入口、隣接する10809をHTTP入口として使用します。比較的新しい設定では混合待受方式が使われ、画面に主要なローカルポートだけが表示される場合もあります。そのため、実際のポートは「設定」→「パラメーター設定」のローカル待受設定と現在のコアログを基準に確認し、デフォルト値だけで判断しないでください。

待受ポートは、ローカルアプリがプロキシコアへ接続する入口です。ブラウザー、コマンドラインツール、システムプロキシはまず127.0.0.1上のこのポートへ接続し、コアがノードとルーティング規則に従って外向きの接続を確立します。同じアドレス、同じプロトコル、同じポートを別のプロセスがすでに待ち受けている場合、新しく起動したコアは再度バインドできません。

プログラムを起動設定を読み込むローカルポートにバインドプロキシリクエストを受信ルールに従って外向きに接続
確認項目 一般的な値 競合時の症状
SOCKS待受 127.0.0.1:10808 コアがSOCKSインバウンドを作成できず、そのポートを使用するアプリが接続に失敗します
HTTP待受 127.0.0.1:10809 システムプロキシまたは手動設定したHTTPプロキシが接続できません
変更後の待受 127.0.0.1:20808、20809 コアは起動できますが、外部アプリでもポートの変更が必要です

ログでポート競合と権限制限を見分ける

タスクバーのアイコン色だけで判断しないでください。まずv2rayNのログウィンドウを開き、コアの起動またはサービスの再起動をもう一度実行して、エラーに表示されたIP、ポート、プロトコルを記録します。bind、listen、address already in use、Only one usageなどの文字列を重点的に確認してください。ログに127.0.0.1:10808と明記されている場合、以降のコマンドではこのポートだけを調べればよく、すべての接続をスキャンする必要はありません。

起動に失敗していても、原因は同じとは限りません。設定ファイルの構文エラーではfailed to load configやinvalid fieldなどが表示されます。リモートノードに接続できない場合は、通常ローカルの待受に成功した後に発生します。ローカルアドレスへのbindに失敗した場合に限り、ポート使用状況の確認を優先してください。

エラー:listen tcp 127.0.0.1:10808: bind: Only one usage of each socket address is normally permitted

原因と対処:10808は別のプロセスが使用中です。netstatまたはPowerShellでPIDを特定し、重複しているコアを終了するか、v2rayNを未使用のポートへ変更してください。

エラー:failed to listen on address 127.0.0.1:10809

原因と対処:HTTPインバウンドのバインドに失敗しています。10809を待ち受けているプロセスを確認し、旧バージョンのv2rayNやバックグラウンドで残っているコアが動作していないか確認してください。

エラー:bind: An attempt was made to access a socket in a way forbidden by its access permissions

原因と対処:ポートがWindowsの除外ポート範囲に含まれているか、セキュリティポリシーの制限を受けている可能性があります。まず除外範囲を確認し、該当する場合は20808、20809など一般的な高番ポートへ変更してください。

netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp

除外ポート範囲への該当と通常のプロセス使用中は別の問題です。通常の使用中であればLISTENINGとPIDを確認できますが、除外範囲では対応するユーザープロセスが見つからなくてもシステムがバインドを拒否します。10808や新しく選んだポートが出力範囲に含まれている場合、システムサービスを強制終了せず、範囲外のポートに変更する方が安全です。

netstatとPowerShellで競合プロセスを特定する

Windowsターミナルまたはコマンドプロンプトで、まずnetstatを実行します。-aは接続と待受ポートを表示し、-nはアドレスを数値で直接表示、-oはプロセスのPIDを表示します。10808と10809を個別に検索すれば、リモート接続に偶然同じ数字が含まれていても、ローカルの待受と取り違えずに済みます。

netstat -ano -p tcp | findstr ":10808"
netstat -ano -p tcp | findstr ":10809"

結果では「ローカルアドレス」と「状態」の2列を重点的に確認します。たとえばローカルアドレスが127.0.0.1:10808、状態がLISTENING、最後の列が4321なら、PID 4321がそのポートを待ち受けています。ローカルアドレスが別のポートで、外部アドレスに10808が含まれている場合、それは探しているローカルの待受プロセスではありません。

  1. LISTENING行の最後の列にあるPIDを記録します。例:4321。
  2. tasklist /FI "PID eq 4321"を実行して、プロセス名を確認します。
  3. 名前がxray.exeまたはv2ray.exeの場合、別のv2rayNインスタンスがすでに起動していないか確認してください。
  4. 別のソフトウェアだった場合は、タスクマネージャーの「詳細」タブでPIDとファイルパスを照合します。
  5. プロセスの用途を確認してから、アプリを終了するか、サービスを停止するか、ポートを変更するか判断してください。
tasklist /FI "PID eq 4321"

Get-NetTCPConnection -State Listen |
  Where-Object { $_.LocalPort -in 10808,10809 } |
  Select-Object LocalAddress,LocalPort,OwningProcess

Get-CimInstance Win32_Process -Filter "ProcessId=4321" |
  Select-Object ProcessId,Name,ExecutablePath,CommandLine

PowerShellのOwningProcessはPIDを示します。ExecutablePathとCommandLineを使うと、現在のv2rayNが起動したコア、旧フォルダーにあるコア、その他のローカルプロキシプログラムを区別できます。一部のプロセスパスを読み取るには管理者権限が必要ですが、実行ファイル名だけを根拠にプロセスを終了しないでください。

結論:PIDとパスを必ずセットで確認する

xray.exeやv2ray.exeを見つけても、すぐに終了してよいとは限りません。コマンドライン引数と保存先フォルダーを確認し、画面を閉じた古いインスタンスに属するか確かめてください。動作中の別設定を中断するのを防げます。

残ったプロセスを終了するか、v2rayNのローカルポートを変更する

使用中のプロセスが重複起動したv2rayNなら、まずそのメインウィンドウに戻って通常の手順で終了してください。ウィンドウが消えてもコアが動作している場合は、タスクマネージャーでPIDを確認して該当プロセスを終了できます。パス、PID、用途をすべて確認してから、コマンドで強制停止してください。通常のプロキシポートを解放するために、システムサービス、仮想化サービス、セキュリティソフトを安易に終了してはいけません。

Stop-Process -Id 4321

taskkill /PID 4321 /F

使用中のポートを提供するプログラムを残す必要がある場合は、v2rayN側を変更するのが適切です。一般的な日本語インターフェースでは「設定」→「パラメーター設定」を開き、「基本設定」エリアにあるローカル待受ポートを探します。大きなバージョンの違いにより、「ローカル待受ポート」「ローカルSOCKSポート」など、似た名称で表示されることがあります。10808を20808に変更して設定を保存し、「サービスを再起動」を実行するか、v2rayNを完全に終了して再起動してください。

  1. 必要に応じて元に戻せるよう、元のポート10808をスクリーンショットまたはメモで控えます。
  2. 「設定」→「パラメーター設定」で主要なローカルポートを20808に変更します。
  3. 画面にHTTPポートが個別に表示される場合は、10809を20809に変更します。
  4. 設定を保存して現在のコアを再起動し、ログに待受成功のメッセージが表示されるか確認します。
  5. もう一度netstatを実行し、新しいPIDが127.0.0.1:20808を待ち受けていることを確認します。
方法 適用する状況 その後の操作
古いインスタンスを終了 同じクライアントを2回起動している 1つのインスタンスだけ残し、コアを再起動する
残ったコアを終了 画面を閉じた後もコアプロセスがポートを待ち受けている PIDとパスを確認してからプロセスを終了する
20808、20809へ変更 ポートを使用中のソフトウェアを動かし続ける必要がある システムプロキシと外部アプリの設定を同期する
除外範囲を避ける 待受PIDがないのにシステムがバインドを拒否する 除外範囲外の高番ポートを選ぶ

ポート変更後にシステムプロキシと外部アプリを同期する

コアが起動できるようになっただけでは、待受段階が復旧したことしか意味しません。すべてのアプリが新しいポートを使用しているとは限りません。Windowsのシステムプロキシが127.0.0.1:10809を参照したまま、v2rayNを20809へ変更すると、ブラウザーは古いポートへ接続し続けます。その結果、コアは正常でもWebページを開けなくなります。システムプロキシを再設定するか、v2rayNでシステムプロキシの自動設定を再実行してください。

v2rayNメイン画面のシステムプロキシメニューで「システムプロキシを自動設定」を選び直し、Windowsの「設定」→「ネットワークとインターネット」→「プロキシ」でアドレスとポートを確認します。手動設定したブラウザー、ダウンロードツール、ターミナル、開発ツールのプロキシはシステム設定に自動追従しないため、10808または10809を新しい値に個別変更してください。

Get-NetTCPConnection -State Listen |
  Where-Object { $_.LocalPort -in 20808,20809 } |
  Select-Object LocalAddress,LocalPort,OwningProcess

Test-NetConnection 127.0.0.1 -Port 20808

Test-NetConnectionのTcpTestSucceededがTrueなら、ローカルから対象のTCP待受ポートへ接続できることを示しますが、ノード自体が利用可能かどうかは確認できません。完全に検証するには、コアログで外向き接続が完了したかを確認し、ルーティング規則がテスト通信を想定した出口へ送っているかも確認してください。

結論:新しいポートは設定全体で統一する

待受ポート、システムプロキシのポート、アプリ内プロキシのポートは一致していなければなりません。v2rayNの入力欄を1か所だけ変更すると、「起動に失敗する」状態が「コアは起動したがアプリが接続できない」状態に変わるだけです。

よくある問題と対処の範囲

タスクマネージャーでnetstatに表示されたPIDが見つからない場合

netstatをもう一度実行してください。短時間で終了するプロセスはすでに終了し、新しいPIDに変わっている場合があります。また、管理者権限のPowerShellでGet-NetTCPConnectionを実行し、OwningProcessからプロセスを調べることもできます。

20808に変更してもポート競合が表示される場合

netstatで20808だけを検索し、WindowsのTCP除外ポート範囲も確認してください。新しいポートにもLISTENINGの記録がある場合は、使用中ではなく除外範囲にも含まれないポートへ変更します。例:21808。

10809だけが競合し、10808には問題がない場合

まずパラメーター設定でSOCKSとHTTPが個別に設定されているか確認します。独立して設定できる場合はHTTPポートだけを変更します。隣接するポートとして自動生成される場合は、主要なローカルポートを変更し、すべてのアプリの設定も同期してください。

コアを終了したのにポートがすぐ解放されない場合

数秒待ってからLISTENINGの状態を再確認します。TIME_WAITの接続は通常、待受ポートの使用中を意味しません。それでもLISTENING行が残っている場合は、別のプロセスがポートを保持しています。最新のPIDを使って引き続き特定してください。

パソコンを起動するたびに競合が発生する場合

v2rayNとポート使用中のプログラムの両方がスタートアップに登録されていないか確認し、v2rayNのフォルダーやショートカットが2つ存在しないかも確認してください。起動項目は1セットだけ残すか、2つのプログラムに別々の待受ポートを割り当てます。

確認が終わったら、最終的なポート、使用中プロセス名、PIDに対応するパス、変更したアプリを簡単に記録しておくことをおすすめします。v2rayNの更新や設定の再インポートで待受ポートがデフォルトに戻っても、すべてのプロセスを再検索せず、記録とすぐ照合できます。