Clash 7890番ポートが使用中のときの対処法:使用プロセスの特定と混合ポートの変更
Windows・macOS・Linuxで「address already in use」の原因となるプロセスを特定し、mixed-portと外部コントローラーポートを変更する方法。
まずエラーを確認:競合しているのはプロキシポートかコントロールポートか
Clashまたはmihomoの起動時にbind: address already in useと表示される場合、カーネルが待ち受けようとしたローカルアドレスとポートを、現在の設定ではバインドできない状態です。よくある原因は、同じ待ち受けアドレスを別のプロセスがすでに使用していることです。まずはPC上の待ち受け状況を調べましょう。サブスクリプションを買い直したり、プロキシノードを変更したりする必要はありません。サブスクリプションに記載されたリモートサーバーのポートと、PC上の7890は別のものです。
クライアントのログを開き、listen、bind、ポート番号を含む行をコピーします。以下は項目を見分けるための例で、すべてのクライアントが同じ形式で出力するとは限りません。
listen tcp 127.0.0.1:7890: bind: address already in use
listen tcp 127.0.0.1:9090: bind: address already in use
| 設定項目 | 用途 | 確認ポイント |
|---|---|---|
mixed-port: 7890 | HTTPとSOCKSのプロキシ接続を同じ入口で受け付ける | ブラウザー、システムプロキシ、コマンドラインから接続する入口 |
port: 7891 | HTTP専用のプロキシ入口 | 混合ポートと重複していないか確認する |
socks-port: 7892 | SOCKS専用のプロキシ入口 | SOCKSの個別リスナーと関連アプリの設定を確認する |
external-controller: 127.0.0.1:9090 | クライアントやパネルからカーネルを操作する管理APIを提供する | ブラウザー用のプロキシポートとしては使えない |
表のポート番号は設定例であり、すべてのクライアントの初期値ではありません。ログと実際に適用されている設定を確認してください。ログに9090とある場合は、まずコントロールインターフェースを確認します。mixed-portだけを7890から別の値に変えても、コントロールインターフェースの競合は解消しません。
Windows:netstatとPowerShellで使用プロセスを特定する
1. 7890番ポートの待ち受けPIDを調べる
「スタート」を開き、「ターミナル」または「PowerShell」を検索します。まず状態を確認してください。他のユーザーのプロセスを調べる場合やサービスを停止する場合に権限不足と表示されたら、管理者として開き直します。以下のコマンドは状態を読み取るだけで、プロセスを終了しません。
netstat -ano -p tcp | findstr ":7890"
ローカルアドレスが127.0.0.1:7890、0.0.0.0:7890、または[::]:7890で、状態がLISTENINGの行を確認します。最後の列がPIDです。:7890を含む行でも、リモート接続の場合があります。すべての行を待ち受け中の競合と判断しないでください。ローカルの待ち受けだけを絞り込むには、次のコマンドを使います。
Get-NetTCPConnection -LocalPort 7890 -State Listen -ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
2. プロセスのパスを調べ、トレイ常駐アプリとバックグラウンドサービスを見分ける
PID 1234が返されたとします。以下の数値は実際のPIDに置き換えてください。まずプロセス名を確認し、続けて実行ファイルのパスと起動引数を調べます。
tasklist /FI "PID eq 1234"
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" |
Select-Object ProcessId, ExecutablePath, CommandLine
よくあるのは、古いクライアントがタスクトレイで動いたまま新しいクライアントを起動し、カーネルが二重に起動しているケースです。サービスモードのmihomoがすでに待ち受けている状態で、GUIからもう一つ起動している場合もあります。まず該当クライアントのメニューから「終了」を選ぶか、「タスク マネージャー」→「詳細」でPIDを確認してください。バックグラウンドサービスだと確認できた場合は、「サービス」管理ツールでサービス名と実行ファイルのパスを調べ、停止する対象を判断します。
通常の終了操作後もプロセスが残る場合は、対象のPIDを確認してからStop-Process -Id 1234を実行できます。終了前に設定を保存し、他のユーザーが利用中のサービスではないことを確認してください。プロキシプロセスを名前で一括終了するコマンドは使わないでください。
3. 待ち受けが見つからないのにバインドできない場合
まず最新のログを読み直し、address already in useとaccess permissionsを区別します。後者はシステムの予約済みポートやセキュリティポリシーが原因の可能性があり、通常のポート競合として処理できません。Windowsでは、続けてTCPの除外範囲を確認します。
netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp
対象ポートが表示された範囲内にある場合は、範囲外の空きポートを選んでください。7890を固定で使うために、システムの除外範囲を安易に削除しないでください。仮想化、コンテナー、ネットワーク共有機能がこれらの設定に依存している場合があります。
macOS・Linux:待ち受けアドレスを調べ、起動元を確認する
macOS:lsofを使う
「アプリケーション」→「ユーティリティ」→「ターミナル」を開き、次のコマンドを実行します。-nPは数値のアドレスとポートを表示し、名前解決による表示の変化を防ぎます。-sTCP:LISTENはTCPの待ち受けだけを表示します。
sudo lsof -nP -iTCP:7890 -sTCP:LISTEN
出力のCOMMAND、PID、NAMEを確認します。PIDが1234の場合は、続けて起動コマンドを調べます。
ps -p 1234 -o pid,ppid,user,command
まずメニューバーから該当クライアントを終了します。手動で起動したカーネルの場合は、起動したターミナルに戻ってControl-Cを押してください。停止して問題のない残存プロセスだと確認できた場合に限り、kill -TERM 1234を実行します。PIDがすぐに変わって再び待ち受ける場合は、「システム設定」→「一般」→「ログイン項目と機能拡張」と、自分で設定したlaunchdサービスを確認し、自動起動の元を対処してください。
Linux:ssを使い、systemdサービスを確認する
sudo ss -ltnp 'sport = :7890'
ps -p 1234 -o pid,ppid,user,args
ssの-lは待ち受け、-tはTCP、-nは数値表示、-pはプロセス表示を意味します。systemd管理下のカーネルが表示された場合は、実際のユニット名を確認してください。インストール時にmihomo.serviceを使用した場合に限り、次のコマンドを実行します。
systemctl status mihomo.service
sudo systemctl stop mihomo.service
ユーザー単位のサービスはsystemctl --userで確認・管理します。Dockerで構成している場合は、docker psでホスト側のポートマッピングも確認してください。ホストの7890を使用しているのはコンテナーの公開ポートで、デスクトップクライアントではない可能性があります。
mixed-portを変更する:空きポートを選び、実際に適用される設定を編集する
既存のプログラムで7890を使い続ける必要がある場合は、現在のClashクライアントの入口を17890などに変更できます。この数値は例であり、使用可能とは限りません。先ほどの確認コマンドで7890を17890に置き換え、空き状況を確認してください。
ローカル待ち受けの最小設定例
mixed-port: 17890
allow-lan: false
bind-address: 127.0.0.1
external-controller: 127.0.0.1:19090
secret: "local-api-19090-change-before-use"
これは待ち受けに関する項目を説明するためのYAML例です。ノード、ポリシーグループ、ルールを含まないため、サブスクリプション全体の代わりには使えません。コントロールポートを19090にする例も示しています。元のコントロールポートに競合がなければ、そのままの値を使えます。secretの例は自分で生成したランダムな文字列に変更し、管理パネルにも同じ値を設定してください。
- トップレベルの項目は一つだけにする:既存の
mixed-portを変更し、末尾に同じキーを重複して追加しないでください。YAMLのインデントにはスペースを使い、Tabは使いません。 - 個別ポートを確認する:
portまたはsocks-portも有効な場合、個別の待ち受けと混合ポートで同じアドレス・ポートを使わないでください。混合ポートだけでよければ、クライアントが対応する方法で不要な入口を無効にできます。 - 待ち受け範囲を確認する:ローカル利用では
allow-lan: falseのままにしてください。競合解消のために全ネットワークインターフェースで待ち受ける設定にすると、プロキシ入口にアクセスできる範囲が広がるおそれがあります。 - コントロールインターフェースはローカルに限定する:
external-controllerは管理APIに使用します。127.0.0.1にバインドしてシークレットを設定し、インターネットに直接公開しないでください。
サブスクリプションファイル、オーバーライド、実行時設定の違い
GUIクライアントでは通常、サブスクリプションとローカル設定を統合し、mihomoに渡す設定を生成します。ダウンロードキャッシュ内のYAMLを直接編集すると、次回のサブスクリプション更新で上書きされることがあります。一時的な実行ファイルを編集した場合も、再起動時に変更が失われる可能性があります。まずクライアントに「混合ポート」「ポート設定」「オーバーライド」などの項目がないか確認してください。項目名はクライアントのバージョンによって異なります。
変更を保存したら、設定画面を閉じるだけでなくカーネルを再起動します。その後、起動ログに表示される待ち受けポートを確認するか、待ち受け状況を再度調べてください。mihomoの実行ファイルを単独で使う場合は、設定ファイルのあるディレクトリでmihomo -t -f config.yamlを実行し、設定を検証できます。構文が正しくてもポートをバインドできるとは限らないため、実際の起動結果も確認してください。
ポート変更後はシステムプロキシとコマンドライン環境も更新する
カーネルが17890で待ち受けるようになっても、7890に通信を送るアプリは接続に失敗するか、以前の別のプロキシに誤接続します。クライアントの「システムプロキシ」をいったんオフにしてからオンに戻し、OSに保存された接続先も確認してください。
- Windows 11:「設定」→「ネットワークとインターネット」→「プロキシ」→「手動プロキシ セットアップ」。手動プロキシを使う場合は、サーバーに
127.0.0.1、ポートに17890を指定します。PACを使っている場合は、手動プロキシだけでなくPACルールが指定する接続先を確認してください。 - macOS:「システム設定」→「ネットワーク」→現在のネットワーク接続→「詳細」→「プロキシ」。有効になっているWebプロキシ、安全なWebプロキシ、SOCKSプロキシのポートを確認します。
- 個別アプリ:ブラウザーのプロキシ拡張機能、ダウンロードツール、エディター、Gitなどのカスタムプロキシ設定は、システム設定に連動して更新されるとは限りません。それぞれ個別に確認してください。
コマンドラインツールは環境変数を参照する場合もあります。以下で、Windows PowerShellとmacOS・Linuxの現在のターミナルに設定されたプロキシ変数を確認できます。
# Windows PowerShell
Get-ChildItem Env: | Where-Object Name -Match 'proxy'
# macOS / Linux
env | grep -i proxy
たとえばHTTPS_PROXY=http://127.0.0.1:7890を設定していた場合は、新しいポートに合わせて変更します。ここでのhttp://はローカルのHTTPプロキシへの接続方式を示すもので、接続先サイトにHTTPしか使えないという意味ではありません。環境変数を永続的に変更した後は、通常ターミナルを開き直す必要があります。起動済みのプロセスには新しい値が自動で反映されません。
TUNモードは仮想ネットワークインターフェースに流れる通信を取り込み、混合ポートの待ち受けとは別の段階で動作します。TUNを有効にしても、別のプロセスが使用中の7890は解放されません。HTTPプロキシやSOCKSプロキシを明示的に使うアプリでは、引き続きポートの確認が必要です。ルールモードとグローバルモードを切り替えても、ローカルの待ち受け競合は解消しません。
修復を確認する:待ち受け、プロキシリクエスト、再起動後の設定をチェック
- 待ち受けプロセスを確認:
17890を再度調べ、PIDが想定どおりのClashまたはmihomoのインスタンスを指していることを確認します。元のエラーが出たポートも調べ、別のサービスが引き続き使用しているか確認してください。 - 起動ログを確認:新たなバインドエラーがないことを確認します。
9090や7891などのエラーも出ている場合は、それぞれ個別に対処してください。一つの入口が正常に起動しただけで確認を終えないでください。 - プロキシ経由でリクエストを送信:ブラウザーのキャッシュだけでプロキシの動作を判断せず、次のcurlコマンドで確認します。
- 設定の保持を確認:クライアントを再起動して、もう一度確認します。次回のサブスクリプション更新後もポートを確認し、ローカルのオーバーライドが引き続き適用されていることを確かめてください。
# Windows PowerShell
curl.exe --noproxy "" -I --connect-timeout 5 --max-time 15 --proxy http://127.0.0.1:17890 https://example.com/
# macOS / Linux
curl --noproxy "" -I --connect-timeout 5 --max-time 15 --proxy http://127.0.0.1:17890 https://example.com/
ここでの--noproxy ""は、今回のリクエストでプロキシをバイパスする設定を空にするためのものです。--connect-timeout 5は接続段階の待ち時間を、--max-time 15はリクエスト全体の待ち時間を制限します。これらはテスト用のオプションであり、通信速度の測定値ではありません。
127.0.0.1:17890にすぐ接続できない場合は、待ち受けとアドレスを確認し直してください。ローカルプロキシに接続できた後でTLS、DNS、リモート接続のタイムアウトが発生する場合は、ノード、DNS、ルールを調べます。HTTPSのテストで200 Connection establishedだけが表示された場合、プロキシがCONNECTトンネル要求を受け付けたことしか分かりません。接続先サイトの応答とクライアントログも確認してください。
よくある質問:再インストール、ファイアウォール、クライアントの二重起動
Clashを再インストールすれば7890番ポートの競合は解消しますか?
別のカーネルが動作中でポートを使用している場合、現在のクライアントを再インストールしても、そのプロセスは通常停止しません。何度もアンインストールするより、まずPIDから起動元を特定しましょう。設定を削除するとサブスクリプションやオーバーライドを失うこともあるため、調査前に必要なローカル設定を保存してください。
ファイアウォールを無効にすれば「address already in use」は解決しますか?
ファイアウォールは主に通信の許可・遮断に関わるもので、アプリが使用中の待ち受けポートを解放する機能はありません。バインドの失敗と、LAN上の機器からアクセスできない問題は別です。ローカルのポート競合に対して、まずファイアウォールを無効にするのは避けてください。
Clashのクライアントを2つ同時に起動できますか?
待ち受けポートとコントロールポートが重複しないよう設定すれば、同時起動は可能です。ただし、システムプロキシ、TUNルート、DNSの制御も調整する必要があります。一般的なデスクトップ利用では、システムネットワークを管理するカーネルを一つにすると運用しやすくなります。並行テストが必要な場合は、2つ目のクライアントを独立したローカルプロキシ入口だけに使い、システムプロキシやTUNを奪い合わないようにしてください。
ログにUDPポートの競合とある場合も、同じコマンドで確認できますか?
ここまでのコマンドは主にTCPの待ち受けを調べています。ログにUDPと明記されている場合は、プロトコルに合わせて別途確認してください。WindowsはGet-NetUDPEndpoint -LocalPort 7890、macOSはsudo lsof -nP -iUDP:7890、Linuxはsudo ss -lunp 'sport = :7890'を使います。TCPとUDPは別々のポート空間を使うため、TCPの確認で何も表示されなくても、UDPポートが空いているとは限りません。
修復完了の目安は、想定したカーネルが正常に待ち受け、新しいポートを使ったリクエストが完了し、再起動やサブスクリプション更新後も設定が維持されることです。その後も接続に問題がある場合は、ヘルプセンターでDNS、サブスクリプション、ルールの問題を切り分けるか、高度な設定でmihomoの設定項目を確認してください。