v2rayNのローカルポートが使用中:競合プロセスの特定と待ち受けポートの変更

OS標準コマンドで10808などのポートを使用しているプロセスを特定し、クライアントの待ち受けポートを変更。ブラウザーやシステムプロキシの設定も更新します。

この記事の概要

v2rayNの起動時にコアの起動に失敗する、ログにアドレス使用中と表示される、またはポート変更後もブラウザーが接続できない場合に役立ちます。まずポート競合とアクセス権限の問題を切り分け、WindowsとmacOSのコマンドで待ち受けプロセスを特定します。ポートを変更する場合は、10808を20808に変更する例をもとに、クライアントの接続先、システムプロキシ、手動プロキシの設定をまとめて更新し、実際の待ち受け状態とリクエスト結果を確認します。

まずログを確認:ポート競合はノードの障害とは限らない

ローカルの待ち受けポートは、アプリからプロキシコアへ接続するための入口であり、ノード側のサーバーポートではありません。ブラウザーから127.0.0.1:10808にアクセスすると、リクエストはいったんローカルのコアに届き、その後ルーティングルールに従って直接接続またはプロキシ経由で送信されます。コアがポートをバインドできない場合、サブスクリプションやVMess、VLESSのノードを変更しても、通常は解決しません。

アプリのプロキシ設定 ローカルの待ち受け口 ルーティングルールの判定 直接接続またはプロキシ経由 接続先サイト

まずv2rayNのメイン画面でログ欄を開き、失敗した行に表示されるアドレス、ポート、エラーメッセージを記録します。127.0.0.1:10808、0.0.0.0:10808、[::1]:10808は同じ意味ではありません。待ち受け範囲やアドレスファミリーが異なります。特に、すべてのIPv4アドレスにバインドするプロセスは、ローカルのループバックアドレスだけにバインドしようとするプロセスと競合することがあります。

bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

原因と対処:Windowsでよく見られるアドレス使用中のエラーです。ログに記録されたポートで待ち受けプロセスを検索し、どのアプリのものか確認します。重複して起動しているインスタンスを終了するか、現在のクライアントに空いているポートを割り当ててください。

bind: address already in use

原因と対処:macOSなどでよくあるバインド競合です。lsofで同じポートを待ち受けているプロセスを確認し、すぐにリモートサーバーの問題だと決めつけないでください。

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

原因と対処:Windowsがバインドを拒否しています。システムの除外ポート範囲やセキュリティポリシーが関係している可能性があります。待ち受けプロセスが見つからなくても発生することがあるため、除外範囲を確認し、関係のないプロセスを何度も終了させないでください。

Windows:ポートからPIDと実行ファイルのパスを特定する

PowerShellで次のコマンドを実行します。ここではログに表示された10808を例にしています。別のポートでエラーが出ている場合は、数字を置き換えてください。ローカルポートと待ち受け状態を条件に検索するため、数字を含む行を単純に検索するより正確です。

Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
  Select-Object LocalAddress, LocalPort, State, OwningProcess

OwningProcessはプロセスのPIDです。検索結果が6420だった場合は、次の2つのコマンドを実行します。この数字は操作例なので、必ず実際のPCで確認したPIDに置き換えてください。

Get-Process -Id 6420 | Select-Object Id, ProcessName, Path

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

実行ファイルのパスやコマンドラインを確認すると、現在のv2rayNが起動したコア、別の展開先に残っている古いインスタンス、その他のアプリを見分けやすくなります。プロセス情報の一部は管理者権限がないと確認できない場合があります。通常の権限で情報が不十分な場合は、管理者としてターミナルを開き直してください。プロセス名が同じという理由だけで終了しないでください。

PowerShellで結果が表示されない場合

netstat -ano -p tcp | findstr :10808
tasklist /FI "PID eq 6420"
  • netstatの出力にある「ローカル アドレス」列を確認し、ポートが10808で、状態がLISTENINGになっていることを確かめます。
  • findstrは単なるテキスト検索のため、リモートアドレスや同じ数字を含む別のポートにも一致することがあります。表示された行をすべてローカルポートの使用中と判断しないでください。
  • TIME_WAITは、プロキシプロセスがポートを待ち受けていることを意味しません。この状態を根拠に、まとめてプロセスを終了させないでください。
  • エラーがUDPに関するものだと明確な場合は、Get-NetUDPEndpoint -LocalPort 10808でも確認します。UDPの検索結果にはTCPのような待ち受け状態の項目はありません。

macOS:待ち受けプロセスを調べ、重複したインスタンスを見分ける

「ターミナル」を開き、macOS標準のlsofでTCPの待ち受けポートを調べます。-nPを指定すると、アドレスとポートが数字のまま表示され、ログと照合しやすくなります。

lsof -nP -iTCP:10808 -sTCP:LISTEN

結果のCOMMANDはプロセス名、PIDはプロセス番号、NAMEは待ち受けアドレスです。通常の検索で結果が表示されないものの、別ユーザーのプロセスが使用している可能性がある場合は、sudo lsof -nP -iTCP:10808 -sTCP:LISTENで再確認してください。結果が空だからといって、ポートが必ず使用可能とは限りません。失敗ログが直近の起動時に記録されたものかも確認しましょう。

  1. PIDが分かったら、ps -p 6420 -o pid,ppid,commandを実行します。例のPIDを実際の値に置き換え、起動コマンドと親プロセスを確認してください。
  2. 別のv2rayNインスタンスが原因であれば、該当インスタンスのメニューバーまたはアプリメニューから終了し、残したいインスタンスを起動し直します。
  3. 使用中の別アプリがポートを使用している場合は、そのアプリを終了せず、v2rayNに別のローカル待ち受けポートを設定してください。
  4. プロセスの所有元を確認し、通常の終了方法で止められない場合に限り、「アクティビティモニタ」から終了することを検討してください。コアを終了すると、既存の接続が切れることがあります。

待ち受けポートを変更する:10808から20808に変更する例

ポートを使用しているアプリを終了できない場合は、ローカルの接続先ポートを変更するのが手早い方法です。以下では、v2rayN 7.xでよく使われる画面を例に説明します。バージョンや新旧の画面によって設定項目の分類名が異なることがあるため、現在のバージョンにある「ローカル待ち受けポート」の項目を確認してください。まず20808がすでに使用されていないことを調べてから、設定を変更します。この例のポートが、すべてのPCで空いているとは限りません。

  1. 現在の設定を記録する

    「設定」→「パラメーター設定」を開き、ローカルの待ち受け設定を探します。現在のポート、混合ポートの有効・無効、待ち受けアドレス、LANからの接続設定を記録してください。ノード編集画面にあるリモートサーバーのポートは変更しないでください。

  2. 変更先のポートを確認する

    Windowsでは先ほどの検索コマンドを-LocalPort 20808に変更します。macOSではlsof -nP -iTCP:20808 -sTCP:LISTENを実行してください。すでに使用されている場合は、別の数字に変えて再確認します。

  3. 待ち受けポートを設定する

    「設定」→「パラメーター設定」で、該当する「ローカル待ち受けポート」を20808に変更して保存し、画面の案内に従ってコアを再起動します。保存後に設定が再読み込みされない場合は、v2rayNを通常の手順で終了してから起動し直してください。

  4. プロキシを再設定する

    メイン画面またはタスクトレイの「システムプロキシ」メニューで、まず「システムプロキシをクリア」を選択し、続けて「システムプロキシを自動設定」を選択します。手動プロキシを使っているアプリは個別に設定を更新してください。この操作だけですべてのアプリが更新されるわけではありません。

  5. 最新のログを確認する

    20808を再度調べ、使用するコアが待ち受けていることを確認してから、今回の起動でバインドエラーが出ていないか確認します。ポート番号を変えただけでコアの起動に成功していなければ、ブラウザーは接続できません。

プロキシの接続先も更新:アプリが古いポートに接続しないようにする

ポートを変更しても「接続が拒否されました」と表示される場合、アプリが古い接続先を参照していることがよくあります。システムプロキシ、ブラウザー拡張機能、ターミナルの環境変数は、それぞれ別の設定です。あるアプリが接続できるようになっても、すべてのアプリの設定が更新されたとは限りません。

設定項目確認場所更新時のポイント
v2rayNのシステムプロキシ「システムプロキシ」メニュー「システムプロキシを自動設定」を再度実行し、設定されたローカルポートを確認します。
Windowsの手動プロキシ「設定」→「ネットワークとインターネット」→「プロキシ」手動設定を使っている場合は、アドレスとポートが古い接続先のままになっていないか確認します。
macOSのネットワークプロキシ「システム設定」→「ネットワーク」→現在の接続→「詳細」→「プロキシ」実際に使用しているWebプロキシまたはSOCKSプロキシを確認してください。2つのプロトコルを安易に置き換えないでください。
ブラウザー個別のプロキシ設定ブラウザーのネットワーク設定またはプロキシ拡張機能の設定ポートを明示的に指定している場合は、新しい接続先に手動で変更します。システム設定に従う場合は、システムプロキシを確認してください。
ターミナルと開発ツール環境変数、各ツールのネットワーク設定HTTP_PROXY、HTTPS_PROXY、ALL_PROXYと、固定されたプロキシ設定を確認します。

次のPowerShellの例は、現在の接続先がHTTPプロキシに対応している場合にのみ使用できます。変更されるのは現在のターミナルプロセスの環境変数だけです。すでに開いている他のターミナルには反映されず、システム設定にも保存されません。

$env:HTTP_PROXY = "http://127.0.0.1:20808"
$env:HTTPS_PROXY = "http://127.0.0.1:20808"

HTTPS_PROXYの値にhttp://を使っても矛盾ではありません。これはローカルのHTTPプロキシへの接続方法を示すもので、HTTPSの接続先には通常CONNECTトンネルを使います。SOCKSの接続先を使う場合は、各ツールが対応しているプロトコルを指定してください。プロトコル名だけを変更しても、そのツールが認識するとは限りません。

使用中のプロセスが見つからない場合:除外範囲と動作結果を確認する

Windowsでアクセス権限に関するバインドエラーが出ているのに、TCPの待ち受けプロセスが見つからない場合は、システムの除外ポート範囲を確認します。仮想化、コンテナー、ネットワーク共有に関するコンポーネントが予約範囲に関係している可能性があります。具体的な関連性は、使用中のPCで確認した結果に基づいて判断してください。

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

エラーが出たポートがいずれかの範囲内にある場合は、その範囲外で、待ち受けプロセスもないポートを選んでください。プロキシの接続先を確保するために、システムの予約設定を安易に削除しないでください。また、常に管理者権限で実行することを一般的な解決策にしないでください。ポートが範囲外なら、セキュリティソフトのブロック履歴とコアのログを確認します。最初から保護機能全体を無効にする必要はありません。

3つの段階で動作を確認する

  • 待ち受け:新しいポートを、使用するコアプロセスが待ち受けていることを確認します。WindowsではTest-NetConnection 127.0.0.1 -Port 20808でTCP接続を確認できますが、成功してもプロキシプロトコルやリモート接続が正常とは限りません。
  • プロキシ:HTTP対応の接続先では、次の明示的なプロキシリクエストを実行して、システムプロキシ設定による影響を切り分けます。SOCKSの接続先には2つ目のコマンドを使います。接続先の種類に応じて、どちらか一方を選んでください。
  • アプリ:明示的なプロキシリクエストが成功したら、ブラウザーから同じサイトにアクセスします。コマンドでは成功してブラウザーでは失敗する場合、ブラウザー個別のプロキシ設定、拡張機能、古いポート情報のキャッシュを優先して確認してください。
curl --proxy http://127.0.0.1:20808 --connect-timeout 5 --max-time 15 -I https://example.com/

curl --proxy socks5h://127.0.0.1:20808 --connect-timeout 5 --max-time 15 -I https://example.com/

Windows PowerShellでは、環境によってcurlが別名として扱われ、引数の解析に影響する場合があります。その場合はcurl.exeと記述してください。5秒は接続タイムアウト、15秒はリクエスト全体の制限時間であり、実測した性能値ではありません。HTTPレスポンスが返ればリクエストに応答があったことは分かりますが、そのドメインがルーティングルールで直接接続されている場合、プロキシ経由の通信が正常とは証明できません。実際の通信経路はコアのログで確認してください。

よくある質問:再起動後に再発する場合とポート変更の注意点

PCを再起動すると10808がまた使用中になります。どうすればよいですか?

PIDと実行ファイルのパスを改めて調べ、v2rayNが複数起動していないか、別のアプリが自動起動していないか確認します。Windowsでは「設定」→「アプリ」→「スタートアップ」、macOSでは「システム設定」→「一般」→「ログイン項目」を確認してください。必要な項目だけを残し、以前記録したPIDを使ってプロセスを終了しないでください。

ポートを使用しているプロセスを強制終了してもよいですか?

まず実行ファイルのパスと用途を確認し、該当するアプリから通常の手順で終了してください。ポートを使っているのは稼働中のサービスや、別ユーザーのアプリかもしれません。残す必要がある場合は、v2rayNのポートを変更するほうが適切です。コアを強制終了すると、システムプロキシの接続先が停止したポートのまま残る場合があるため、クリアするか再設定してください。

ローカルポートを変更すると、サブスクリプションやノードに影響しますか?

ローカルの待ち受け設定だけを変更する場合、サブスクリプションURL、ノードサーバーのアドレス、ノード側のサービスポートは変わりません。更新が必要なのは、ローカルの接続先を使用するアプリの設定です。誤ってノード編集画面のポートを変更した場合は、サーバーから提供された値に戻してください。リモート側のポートに20808を設定してはいけません。

すべてのアドレスで待ち受けるようにすれば、競合を回避できますか?

127.0.0.1を0.0.0.0に変更しても解決にはなりません。待ち受け範囲が広がることで、既存のバインドと競合する可能性があります。このPCだけで使う場合はループバックアドレスで待ち受けてください。LANから接続する必要がある場合は、アクセス制御とファイアウォールのルールを別途設定します。

新しいポートで待ち受けているのに、Webページを開けません。なぜですか?

まず明示的なプロキシコマンドでテストし、接続先のプロトコル、システムプロキシ、ブラウザーの設定を確認します。リクエストがコアに届いた後でリモート接続のタイムアウト、認証エラー、ドメイン名の解決エラーが発生する場合は、ローカルポートではなくノードの設定、DNS、ルーティングを調べてください。

クライアントのダウンロード