v2rayNの起動時に10808のバインド失敗が表示される場合や、ブラウザーが古いポートを参照している場合に役立ちます。まずエラーがローカルの待ち受けに関するものか確認し、プロセスIDから使用中のプロセスを特定します。重複して起動したインスタンスを終了できるなら元のポートを使い、終了できない場合は空き状況を確認した10818に変更します。最後にシステムプロキシ、ブラウザー、コマンドラインツールの設定をそろえ、ローカル待ち受けと外部への接続を個別に確認します。
まず切り分ける:ローカル待ち受けの失敗か、ノードへの接続失敗か
127.0.0.1:10808はローカルのプロキシ入口であり、サブスクリプションサーバーのアドレスでも、ノードの接続先ポートでもありません。v2rayNの管理画面が開いていても、Xrayが正常に起動したとは限りません。コアが入口にバインドできない場合、画面にノード一覧が表示されていても、ブラウザーが接続できるローカルプロキシはありません。
切り分けは通信経路の左側から始めます。まずv2rayNのログを開き、起動時刻と一致するlisten、bind、10808の記述を探してください。エラーが待ち受けアドレスを明示している場合に限り、この記事の手順で対処します。リモート接続のタイムアウト、証明書エラー、サブスクリプションの更新失敗は、ローカルポートを適当に変更しても解決しません。
bind: address already in use
原因と対処:対象のアドレスとポートをすでに別のプロセスが使用しています。使用中のプロセスを特定し、重複して起動したインスタンスを終了するか、v2rayNの待ち受けポートを空きが確認できた値に変更してください。
Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因と対処:Windowsでは、同じソケットアドレスへの重複バインドが拒否されます。ログに記載されたIPアドレス、TCPまたはUDPの別、ポートを確認し、数字だけで競合対象を判断しないでください。
An attempt was made to access a socket in a way forbidden by its access permissions.
原因と対処:システムのポート除外範囲やセキュリティポリシーが関係している可能性があり、通常のプロセスが使用しているとは限りません。待ち受けプロセスが見つからない場合は、ポートの予約状況も確認してください。
Windows:netstatで使用中のプロセスを特定する
PowerShellまたはコマンドプロンプトを開き、以下のコマンドを実行します。いずれも状態を確認するだけで、プログラムを停止することはありません。プロセスのパスを確認できない場合は、管理者としてターミナルを開き直して試してください。
netstat -ano -p tcp | findstr ":10808"
netstat -ano -p udp | findstr ":10808"
TCPの出力では、「ローカルアドレス」列とLISTENINGの状態を重点的に確認します。検索文字列がリモートアドレスや、同じ数字で始まるより長いポート番号にも一致することがあるため、すべての行を競合と判断しないでください。UDPには同じ待ち受け状態の列がありません。ログにUDPのバインドが記載されている場合に限り、該当する結果を重点的に確認します。
TCP 127.0.0.1:10808 0.0.0.0:0 LISTENING 6420
これは説明用のサンプル行で、実機で取得した結果ではありません。末尾の6420はサンプルのプロセスID(PID)です。実際に操作する際は、必ず自分の出力にある値に置き換えてください。TCPのローカル待ち受けポートを正確に絞り込むには、PowerShellで次のコマンドを使えます。
Get-NetTCPConnection -LocalPort 10808 -State Listen -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, State, OwningProcess
tasklist /FI "PID eq 6420"
Get-CimInstance Win32_Process -Filter "ProcessId=6420" |
Select-Object ProcessId, Name, ExecutablePath, CommandLine
- 同じフォルダーに残ったコア:まずトレイメニューからv2rayNを終了し、数秒待ってからポートが解放されたか確認してください。
- 別のフォルダーから起動したインスタンス:プロセスのパスを手がかりに該当するウィンドウやトレイアイコンを見つけ、不要なインスタンスを終了します。複数の自動起動設定が同じポートを取り合わないようにしてください。
- ほかの通常アプリ:そのまま動作させ、v2rayN側のポートを変更してください。プロキシの入口を確保するために、業務プロセスを無理に終了しないでください。
- システムプロセスまたは用途不明のプロセス:まずプロセスの由来と関連するサービスを調べ、強制終了コマンドをすぐに実行しないでください。
macOSとLinux:lsofで待ち受けプロセスを確認する
デスクトップ版v2rayNの画面はOSによって多少異なることがありますが、待ち受けの競合を判断する方法は同じです。macOSではlsofを使えます。Linuxでもこのツールがインストールされていれば、同じコマンドを使用できます。TCPとUDPはそれぞれ別に実行してください。
lsof -nP -iTCP:10808 -sTCP:LISTEN
lsof -nP -iUDP:10808
出力のCOMMANDはプロセス名、PIDはプロセスID、NAMEは待ち受けアドレスを示します。Linuxでは次のコマンドでもTCPの待ち受けとプロセス情報を確認できます。プロセス情報を表示する権限がない場合は、システムの管理ルールに従って権限を昇格したターミナルから確認してください。
ss -ltnp 'sport = :10808'
ps -p 6420 -o pid,comm,args
- まずアプリのメニューから通常の手順で終了し、再度確認してください。いきなり強制終了するのは避けましょう。
- ウィンドウを閉じても、バックグラウンドサービスが終了するとは限りません。トレイ、メニューバー、サービス管理ツールも確認してください。
- サービス管理ツールによってプロセスが自動的に再起動される場合は、該当サービスの設定を変更するか、v2rayNのポートを変更してください。プロセスを繰り返し終了させる方法は避けましょう。
v2rayNのローカル待ち受けポートを変更する
ここでは10808を10818に変更する例を紹介します。10818は区別しやすくするための例で、必ず空いているポートではありません。まず前述のコマンドで10818を調べ、関連する待ち受けがないことを確認してから設定を変更してください。変更前に現在のポート、待ち受けアドレス、LANからの接続を許可しているかどうかを記録します。
-
現在の設定を記録する
「設定」→「パラメーター設定」を開き、「基本設定」にある現在のローカルポートを記録します。バージョンによって項目名は多少異なります。7.xの画面では「Core: 基本設定」グループの「ローカル混合待ち受けポート」が一般的ですが、実際の画面を確認してください。
-
空いているポートを入力する
「ローカル混合待ち受けポート」を
10818に変更します。使用中のバージョンでローカルSOCKSポートとHTTPポートが別々に表示される場合は、それぞれ記録して該当する項目を変更してください。独立した2つの待ち受けに同じポートを設定しないでください。 -
ループバック待ち受けを維持する
ローカルのみで使う場合は、ループバックアドレスでの待ち受けを維持してください。「LANからの接続を許可」を有効にしても、ポート競合は解消しません。待ち受け範囲を広げても使用中のポートは解放されず、入口にアクセスできる範囲が変わるだけです。
-
保存して再起動する
「OK」をクリックして保存します。画面上でコアが自動的に再起動しない場合は、トレイメニューからv2rayNを通常終了し、プログラムを起動し直してください。その後10818を確認し、新しい待ち受けが今回起動したコアのものか確認します。
-
システムプロキシを再設定する
トレイメニューの「システムプロキシ」で、まず「システムプロキシを解除」を選び、次に「システムプロキシを自動設定」を選択します。これにより現在のプロキシアドレスが再設定されます。ルーティングルールの直結モードやプロキシモードを切り替える操作ではありません。
旧バージョンの6.xとそれ以降では、独立したHTTP入口、混合入口、項目名に違いがあります。「HTTPは必ず10809」といった経験則をそのまま当てはめないでください。混合入口は1つのポートでHTTPとSOCKSのリクエストを受け付けますが、独立した入口では実際の設定に合わせて個別に入力します。また、自動生成された一時的なコア設定ファイルは変更しないでください。画面で保存したりノードを切り替えたりすると、変更が上書きされる場合があります。
ブラウザー、システムプロキシ、コマンドラインの設定をそろえる
コアが10818で待ち受けているのにアプリが10808へ接続するのは、ポート変更後によくある見落としです。システムプロキシの設定が反映されるのは、その設定に従うプログラムだけです。プロキシを手動設定しているアプリ、環境変数、コマンドごとの引数も個別に確認してください。
| 接続方法 | 確認する項目 | この例の設定値 |
|---|---|---|
| Windowsのシステムプロキシ | 「設定」→「ネットワークとインターネット」→「プロキシ」を開き、手動プロキシのアドレスとポートを確認 | アドレス:127.0.0.1、ポート:10818 |
| ブラウザーの手動プロキシ | ブラウザーの接続設定またはプロキシ拡張機能で有効になっている設定 | 入口の種類に合わせてHTTPまたはSOCKS5を指定し、ポートは10818 |
| コマンドラインツール | HTTP_PROXY、HTTPS_PROXY、ALL_PROXY、およびコマンドの引数 | 10808を参照している値を置き換える |
| その他のアプリ | アプリ内の「ネットワーク」または「プロキシ」設定 | 保存後、接続を確立し直す |
PACスクリプトを使っている場合は、スクリプトのアドレスが変わったかだけでなく、スクリプトが実際に返すプロキシポートも確認してください。ブラウザーが古いスクリプトをキャッシュしたり、既存の接続を再利用したりする場合があります。設定を更新したらスクリプトを再読み込みするか、該当アプリを再起動してください。アプリの手動プロキシとシステムプロキシで異なるポートを指定したまま、ウェブページがたまに開くことだけで成功と判断しないでください。
# Windows PowerShell:現在のターミナルのプロキシ環境変数を確認
Get-ChildItem Env: | Where-Object Name -Match '^(HTTP|HTTPS|ALL|NO)_PROXY$'
# macOS / Linux:現在のターミナルのプロキシ環境変数を確認
env | grep -iE '^(http|https|all|no)_proxy='
環境変数の変更が反映されるのは、通常、その後に起動するプロセスです。すでに開いているターミナル、エディター、ダウンロード処理には古い値が残ることがあります。変数が見つかった場合は、ターミナルの設定ファイルやシステム環境変数の画面など、実際に設定した場所を更新してから該当プログラムを開き直してください。一時的なターミナルだけを変更して確認を終えないようにしましょう。
結果を確認する:ローカル接続だけでは外部接続の成功はわからない
確認は2段階で行います。まずローカルの入口が存在することを確認し、その後にプロキシ経由のリクエストをテストします。Windows PowerShellでは、まず次のコマンドを実行してください。TcpTestSucceededがTrueでも、TCPポートに接続できたことを示すだけで、サブスクリプション、ノード、DNSが正常とは限りません。
Test-NetConnection 127.0.0.1 -Port 10818
10818が混合入口であれば、HTTPとSOCKSをそれぞれテストできます。以下ではドキュメント用のサンプルドメインにリクエストを送ります。ノードの速度測定や、常に利用できることを示すものではありません。Windows PowerShellではcurl.exeを明示し、古い環境でcurlが別のコマンドとして解釈されるのを防ぎます。macOSとLinuxではcurlを使います。
curl.exe --noproxy "" --proxy http://127.0.0.1:10818 --connect-timeout 10 --max-time 20 -I https://example.com/
curl.exe --noproxy "" --proxy socks5h://127.0.0.1:10818 --connect-timeout 10 --max-time 20 -I https://example.com/
- すぐに接続拒否と表示される:まずポート、アドレス、コアが動作中かを確認してください。ノードの変更はまだ不要です。
- 入口には接続できるが、リクエストがタイムアウトする:コアのDNS、ルーティング、アウトバウンドのログを確認してください。ローカルのバインド問題はすでに解決している可能性があります。
- コマンドは成功するが、ブラウザーでは失敗する:ブラウザーで使用中のプロキシ設定、PACのキャッシュ、既存の接続を確認してください。
- HTTPまたはSOCKSの片方だけ失敗する:そのポートが混合入口なのか、特定プロトコル専用の入口なのかを確認してください。プロトコルの不一致をポート使用中と誤認しないようにしましょう。
よくある質問:プロセスが見つからない、再起動後に再発する場合
netstatに結果がないのに、ポートが使えないと表示されるのはなぜ?
まずログが今回の起動時に出たものか確認し、IPv4とIPv6、TCPとUDPの別を照合してください。Windowsでは以下のコマンドでTCPの除外範囲を確認できます。10808が範囲内にある場合は、その範囲外で、なおかつ待ち受けに使われていないポートに変更してください。システムの予約項目を直接削除しないでください。
パソコンを再起動するたびに、10808がまた使用中になるのはなぜ?
Windowsの「設定」→「アプリ」→「スタートアップ」とタスクスケジューラを確認し、異なるフォルダーにあるv2rayNが同時に起動していないか調べてください。実際に使うインスタンスだけを残し、使用中プロセスの完全なパスを確認します。プロセス名が同じという理由だけで判断しないでください。
10818に変更すると、VMessやVLESSのノードに影響しますか?
ローカル待ち受けポートとノードの接続先ポートは別々の設定です。ローカル入口を変更しても、サブスクリプション内のVMessやVLESSサーバーのポートを変更したり、ユーザーIDを再生成したりする必要はありません。設定をそろえる必要があるのは、ローカルプロキシに接続するアプリです。
TUNを有効にしたり、管理者として実行したりすれば競合を回避できますか?
TUNでは通信の取り込み方法が異なりますが、コアがローカルのインバウンドを起動する場合があり、重複バインドを回避できるとは限りません。管理者権限を使っても、別のプロセスが使用しているソケットは自動的に解放されません。まずログに記載された待ち受けの失敗を解決し、その後でTUNのルーティングとDNSを個別に確認してください。
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp