「address already in use」と表示される、コア起動直後に終了する、システムプロキシを有効にしてもローカルポートが待ち受け状態にならない、といった場合に役立ちます。エラーのポートとプロトコルを確認し、使用中のプロセスを特定したうえで、プロセスを終了するかポートを変更するか判断し、最後にシステムプロキシ、ブラウザー、その他の依存設定を同期します。
まず競合しているローカルポートを確認する
V2RayまたはXrayのコアを起動すると、ローカルアドレスに待受ポートが作成されます。ブラウザーなどのアプリはこの入口へリクエストを送り、クライアントがノード設定とルーティングルールに従って処理します。v2rayN 7.xではローカル混合プロキシポートが一般的で、既存設定の多くは 127.0.0.1:10808 を使用します。古い設定ではSOCKSとHTTPを10808、10809の2ポートに分けている場合もあります。このポート番号はプロトコルサーバーのポートではなく、現在の端末上でアプリとクライアント間の入口として使われます。
同じネットワークプロトコル、待受アドレス、ポートの組み合わせを使用できるプロセスは、通常1つだけです。たとえば、既存のプロセスがTCP 127.0.0.1:10808を待ち受けている状態で、新しく起動したXrayコアが同じ組み合わせを要求すると、バインドに失敗します。「起動に失敗しました」だけでは不十分なので、v2rayNのログ画面またはコアのログを開き、listen、bind、10808を含む原文の行を確認してください。
- ポートを確認:ログに10808とあれば10808を調べ、既定値から推測しないでください。
- アドレスを確認:
127.0.0.1は同じ端末からの接続だけを受け付け、0.0.0.0はすべてのIPv4ネットワークインターフェースで待ち受けることを示します。 - プロトコルを確認:TCPとUDPの使用状況は別々に記録されます。TUNやDNS関連の問題では、特にUDPを確認してください。
- インスタンスを確認:トレイからクライアントを終了してから調べ、古いコアプロセスがバックグラウンドに残っていないようにします。
Windowsで10808ポートを使用しているプロセスを特定する
Windowsでは、まず「ターミナル」または「コマンドプロンプト」を開きます。通常の権限でも接続情報とPIDは確認できます。プロセスの詳細確認やシステムレベルのプロセス終了で拒否された場合は、管理者権限でターミナルを開いてください。最初は特定だけを行い、PIDを見つけてもすぐに強制終了しないでください。
netstat -ano | findstr :10808
出力の LISTENING は、プロセスが待ち受けていることを示します。最後の列がPIDです。たとえば次の記録は、PID 6420がローカルTCP 10808を使用していることを示します。TIME_WAITしか表示されない場合は、通常は接続終了後の一時的な状態であり、待受サービスが存在することを意味しません。
TCP 127.0.0.1:10808 0.0.0.0:0 LISTENING 6420
PIDを取得したら、タスク一覧で実行ファイルを確認します。1つのコマンドから複数の記録が返った場合は、PIDを正確に照合してください。プロセス名だけで判断するのは避けましょう。同じプログラムが複数のインスタンスで動作していることがあるためです。
tasklist /FI "PID eq 6420"
| 確認結果 | よくある意味 | 推奨する対応 |
|---|---|---|
| 別のv2rayNまたはXrayプロセス | 古いインスタンスが終了していない、またはクライアントを二重起動している | まずトレイから古いインスタンスを終了し、待受状況を再確認する |
| その他のローカルプロキシソフト | 2つのプログラムが同じ入口ポートを使用している | よく使うプログラムのポートを残し、もう一方を空いているポートへ変更する |
| 業務用の開発サービス | 開発ツールがたまたま10808を使用している | プロジェクトの依存関係に応じて、開発サービスまたはクライアントのポートを変更する |
| PIDが存在しない | 確認中にプロセスが終了した | netstatを再実行し、待受が解放されたことを確認する |
PowerShellを使えば、待受記録とプロセス情報を直接結び付けることもできます。次のコマンドはTCP 10808だけを調べ、そのポートを所有するPIDをプロセス検索に渡します。出力がない場合、条件に一致するTCP待受記録は現在ありません。
$listener = Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue
$listener | Select-Object LocalAddress, LocalPort, OwningProcess
$listener | ForEach-Object { Get-Process -Id $_.OwningProcess }
v2rayNでローカル待受ポートを変更する
使用中のプロセスを残す必要がある場合、v2rayNのローカルポートを変更するほうが、プロセスの終了を繰り返すより安定します。v2rayN 7.xの日本語画面を例にすると、まず現在のシステムプロキシの状態を控え、「設定」→「パラメーター設定」→「基本設定」を開きます。ローカル混合プロキシポートまたはローカル待受ポートを探してください。7.xのマイナーバージョンによって項目名は多少異なりますが、変更するのはインバウンドの待受項目であり、ノードのサーバーポートではありません。
- トレイメニューから一時的にシステムプロキシを無効にし、古いアドレスがアプリで使われ続けないようにします。
- 「設定」→「パラメーター設定」→「基本設定」を開き、ローカルポートを10808から例として10818に変更します。
- 設定を保存してコアを再起動します。画面にクライアントの再起動が表示された場合は、トレイのインスタンスを完全に終了してから再起動してください。
- ログを開き、
127.0.0.1:10818で待ち受けを開始した記録があり、bindやaddress already in useが表示されていないことを確認します。 - システムプロキシを再度有効にし、システムプロキシのアドレスが127.0.0.1、新しいポートに同期されていることを確認します。
新しいポートには1024から65535の範囲で空いている番号を使えますが、「番号が大きいから空いている」と判断しないでください。変更前に netstat -ano | findstr :10818を実行し、LISTENINGの記録がないことを確認してから、10818をクライアントに設定します。SOCKS、HTTP、API、DNSのインバウンドが同時に存在する場合は、各項目に異なるポートを設定し、すべての入口を同じ値にしないでください。
ポートを変更した後、「コアの起動に成功した」ことは待受ポートの競合が解消されたことを示すだけで、ブラウザーが必ず新しいポートを使うとは限りません。システムプロキシモードは通常v2rayNが自動で書き換えますが、手動プロキシ、ブラウザー独自のプロキシ、ターミナルの環境変数、開発ツールは必ずしも追従しません。これらの依存設定を1つずつ確認してください。
- Windowsのシステムプロキシ:アドレスが
127.0.0.1のままで、ポートが10808から10818に変わっていることを確認します。 - コマンドラインの環境変数:
HTTP_PROXY、HTTPS_PROXY、ALL_PROXYを設定している場合は、古いポートも同期して置き換えます。 - ブラウザー独自の設定:手動プロキシを使用している場合、HTTPとSOCKSの項目をクライアントで実際に開いているインバウンドの種類に合わせます。
- LAN共有:他の端末からの接続を許可する場合は、待受アドレス、LANアクセスのスイッチ、Windowsファイアウォールのルールを併せて確認します。
v2rayNGとv2flyNGでポートを変更するポイント
Android端末でもローカルポートの競合は発生します。別のネットワークツールが同じポートを使用している、前回のサービスが正常に停止していない、ユーザーがインポートしたカスタム設定でインバウンドを指定している、といったケースが一般的です。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。設定項目名はバージョンによって変わりますが、対処の原則は同じです。現在の接続を停止し、ローカルプロキシの入口を変更してから、サービスを再起動します。
v2rayNG 1.10.xの一般的な画面を例にすると、「設定」→「ローカルプロキシ設定」を開き、ローカルSOCKSポート、HTTPポート、その他の待受項目を確認します。現在10808なら、空いていることを確認した10818などへ変更します。メイン画面に戻り、接続を停止してから再起動し、コアにインバウンド設定を再読み込みさせます。v2flyNGでも、設定内のローカルプロキシまたは待受ポートの項目から変更してください。サブスクリプションのノードにあるリモートサーバーポートは編集しません。
エラー:listen tcp 127.0.0.1:10808: bind: address already in use
原因と対処:別のプロセスがTCP 10808を待ち受けています。競合しているプログラムを停止するか、現在のクライアントのローカル待受ポートを10818に変更してコアを再起動してください。
エラー:bind: Only one usage of each socket address is normally permitted
原因と対処:Windowsが同じアドレスとポートへの2つ目のプロセスのバインドを拒否しています。netstatでPIDを特定し、古いインスタンスを終了するかポートを変更してください。
エラー:failed to start app/proxyman/inbound
原因と対処:インバウンドモジュールの初期化に失敗しています。ポート競合はよくある原因の1つです。続くlistenまたはbindのログを確認し、ログに記載された実際のポートを調べてください。
カスタムJSON設定を使用している場合、画面上のグローバルポートが設定ファイル内の inboundsを上書きするとは限りません。この場合は、各インバウンドオブジェクトの listenと portを確認します。同じ設定内で10808を重複して指定すると、1つのコア内部でも競合が発生します。
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10818,
"protocol": "socks"
}
]
}
ポートを解放したのに、なぜ起動に失敗するのか
ポート競合を解消しても起動できない場合は、古いPIDに対処し続けるのではなく、最新のログを読み直してください。1回の起動処理で、混合プロキシ、API、DNS、TUN関連の待受が順番に作成されることがあります。10808が成功しても、他のポートまで成功したとは限りません。ログ内の次の failed、listen、bindを探し、実際のポートを使って再度確認します。
netstatで10808が見つからないのに、クライアントでは使用中と表示される?
まずログにTCPとUDPのどちらと記載されているかを確認し、待受アドレスがIPv6ではないかも調べます。TCPには netstat -ano -p tcp、UDPには netstat -ano -p udpを使います。その後、クライアントを完全に終了して最新のログを読み直してください。
10818に変更したら、ブラウザーで逆にウェブページを開けなくなった?
Windowsのシステムプロキシとブラウザーの手動プロキシが、まだ10808を指していないか確認します。アドレスはクライアントの待受アドレスに合わせ、ポートを10818に変更してから、ブラウザーを終了し、再度開いて接続します。
起動するたびにポート競合が再発する?
タスクマネージャーのスタートアップアプリで、クライアントが2つ同時に自動起動する設定になっていないか確認し、トレイに重複インスタンスがないことも確認します。自動起動の入口は1つだけ残し、同時に動かす必要があるプログラムには異なるポートを割り当ててください。
プロセスを終了したのに、PIDがすぐ再び現れるのはなぜ?
そのプログラムがバックグラウンドサービスやタスクスケジューラによって自動起動している可能性があります。まず対象プログラムで自動起動を無効にしてから正常に終了してください。強制終了コマンドと自動復旧機能を何度もぶつけるのは避けましょう。
システムプロキシは新しいポートなのに、ターミナルのコマンドは接続に失敗する?
ターミナルが個別のプロキシ環境変数を使用している可能性があります。現在のシェルに対応する環境変数の確認コマンドを実行し、127.0.0.1:10808が残っていないことを確認します。変更後はターミナルを新しく開いてください。
「ポートの使用中」と「ポートの予約」は区別する必要があります。一部のWindowsネットワークコンポーネントや仮想化機能がTCPポート範囲を予約していると、netstatで待受プロセスが見つからなくても、バインドがシステムに拒否されることがあります。次のコマンドで除外範囲を確認できます。10808が範囲内にある場合は、10818、20808など、使用中でも予約済みでもないポートを選ぶほうが、システムの予約設定を変更するより簡単です。
netsh interface ipv4 show excludedportrange protocol=tcp
変更後に行う総合確認の手順
トラブル対処を終える前に、一連の設定を確認し直してください。目的はエラーを消すことだけではなく、コアの待受、システムプロキシ、アプリの接続、ノードのアウトバウンドが同じ設定を使っていることを確認することです。次の順番で確認すれば、「クライアントは動作中なのに、通信は古いポートへ送られている」という状態を防げます。
- 古いクライアントのインスタンスを完全に終了し、トレイアイコンと関連するコアプロセスが終了するまで待ちます。
netstat -ano | findstr :10818を実行し、変更前に新しいポートを別のプロセスが待ち受けていないことを確認します。- v2rayN、v2rayNG、またはv2flyNGを起動し、ログで新しいポートの待受に成功したことを確認します。
- ポートを再度確認し、待受PIDが現在のクライアントによって起動されたコアプロセスのものか照合します。
- システムプロキシ、ブラウザーの手動プロキシ、ターミナルの環境変数、開発ツールのプロキシ設定を確認します。
- 有効なノードを1つ選んで接続テストを行います。ポートが正常に待ち受けているのに接続できない場合は、ノードの利用可否、DNS、ルーティングルール、システム時刻を確認してください。
単なる二重起動による競合なら、既定の10808を維持して古いインスタンスを整理すれば解決します。2つのローカルサービスを長期的に共存させる場合は、異なるポートを固定で割り当て、各ポートを使用するプログラムを記録してください。ポート構成が安定すれば、サブスクリプションの更新、VMessまたはVLESSノードの選択、直結とプロキシのルーティングをローカルポート変更のために作り直す必要はありません。同期が必要なのは、ローカル入口に依存するアプリ設定だけです。