Clash起動時「ポートが使用中」エラーの対処法:占有プロセス特定とポート変更の全手順

7890/9090のポート競合はClash起動失敗の主因。Windows・macOS・Linux別の占有プロセス確認コマンドと、設定ファイル・クライアントでの安全なポート変更手順を解説。

「ポートが使用中」エラーが出る理由

Clashのコアはプロキシサービスを提供するために、いくつかの固定ポートを確保する必要があります。混合プロキシポート(通常は7890、設定項目名はmixed-port、旧バージョンではportsocks-portに分かれている場合もある)、外部コントローラーポート(通常は9090、項目名はexternal-controller)、一部のクライアントではさらにDNSリスニング用のポートも確保します。これらのポートがシステム内の別のプロセスに先に占有されていると、OSは再バインドを拒否し、コアのログには「address already in use」「bind: ポートは既に使用されています」といったエラーが出ます。クライアント側では起動ボタンを押した直後に元に戻る、接続状態が「未接続」のまま変わらない、あるいはエラーダイアログが表示されるといった症状になります。

占有の原因は大きく3種類に分けられます。1つ目は「多重起動」で、同じPCに複数のClash系クライアントを入れている(例:Clash Vergeと旧世代のClash for Windowsを両方インストールしている)場合や、前回終了時にプロセスが完全に終了せず、バックグラウンドにゾンビプロセスが残ってポートを占有し続けている場合です。2つ目は「ポートの衝突」で、開発用のデバッグプロキシ、企業VPNクライアント、ネットワークテストツール、さらにはデータベースやメッセージキューのデフォルトポートが偶然7890や9090の近辺と重なっているケースです。3つ目はOSレベルのポート予約で、特にWindowsでは一部のシステムサービスが一定範囲のポートを予約しており、たまたま7890が含まれてしまうことがあります。この場合、タスクマネージャーで見ても直接対応するプロセス名が見つからないことが多いです。

調査の基本方針は2ステップです。まず誰がそのポートを占有しているのかを確認し、その上で「占有元を終了する」か「Clash側のポートを変更する」かを判断します。多くの場合はポート変更のほうが手軽で、他のソフトの設定を触らずに済むためリスクも低くなります。

Windowsで占有プロセスを特定する

コマンドプロンプトまたはPowerShellを開き、まずnetstatでポートに対応するプロセスID(PID)を確認します。

netstat -ano | findstr "7890"

出力の最後の列の数字がPIDです。タスクマネージャーか以下のコマンドでプロセス名を逆引きできます。

tasklist | findstr "PID番号"

9090ポートで競合が出ている場合も、コマンド内のポート番号を9090に置き換えて再度確認してください。無関係なプロセスが占有していると確認できたら、そのプロセスを直接終了するか、そのソフトの設定画面でポート番号を変更します。逆に、見つかったプロセスがClash自身の過去のインスタンス(例:clash-verge.exemihomo.exeの残留プロセス)であった場合は、タスクマネージャーで手動終了してからクライアントを再起動すれば、通常はこれで解決します。

注意:セキュリティソフトやOSのポート予約範囲の影響で、netstatで具体的なプロセスが確認できない(PIDが0やシステムプロセスとして表示される)場合があります。この場合はClash側のポートを直接変更するのが最も時間の節約になり、占有元を無理に特定する必要はありません。

macOSで占有プロセスを特定する

ターミナルを開き、lsofでポートの占有状況を確認するのが最も直接的です。

lsof -i :7890

出力のCOMMAND列がそのポートを占有しているプロセス名、PID列がプロセス番号です。9090ポートも同様に数字を置き換えるだけで確認できます。占有プロセスを終了する場合は以下のコマンドを使います。

kill -9 対応するPID番号

macOSでよくあるのは、Clash Vergeと旧世代のClashX系クライアントを同時にインストールしているケースです。両者のデフォルトポートが同じため、片方がバックグラウンドに常駐している(例:ログイン時に自動起動する設定になっている)と、もう片方を起動した際に競合が発生します。システム設定のログイン項目を一度確認し、自動起動するクライアントを1つだけに絞ることをおすすめします。

Linuxで占有プロセスを特定する

Linuxではssコマンドの利用を推奨します(従来のnetstatより高速で、多くの現代的なディストリビューションに標準搭載されています)。

ss -tulnp | grep 7890

システムにssがない場合は、netstatlsofで代用できます。

lsof -i :7890

プロセスのPIDを確認したらkillで終了します。

kill -9 対応するPID番号

コマンドライン版のコア(mihomo/Clash core)をsystemdでサービス管理しているユーザーは特に注意してください。コアがsystemdのユニットファイルから起動されている場合、そのままkillしてもsystemdの再起動ポリシーによって自動的に再起動され、再度ポートを占有してしまうことがあります。この場合はまずsystemctl stopで対応するサービスユニットを停止し、ポートが解放されたことを確認してから競合の原因を調査するべきで、kill を繰り返すのは避けてください。

設定ファイルでポートを変更する

終了できない他のプログラムにポートを占有されていると確認できた場合、最もクリーンな対処法は相手のソフトをいじらずにClash側のポートを変更することです。主要な設定項目はconfig.yamlの先頭にまとまっています。

mixed-port: 7891
allow-lan: false
external-controller: 127.0.0.1:9091
secret: ""

mixed-portを空いているポート番号に変更します(1024~65535の範囲内で、よく使われるサービスと衝突しない数字、例えば7891や17890などがおすすめです)。external-controllerの後のポート番号も同様に変更しますが、こちらは「アドレス:ポート」という完全な書式になっているため、コロンの前のリスニングアドレスを消さないように注意してください。一部の古い設定ファイルでは、統合されたmixed-portではなくport(HTTPプロキシポート)とsocks-port(SOCKS5プロキシポート)が分かれて記述されていますが、こちらも同様に空いている番号に変更すれば原理は同じです。

ヒント:ポート変更後はクライアントの再起動または設定の再読み込みが必要です。YAMLファイルを保存するだけでコアを再起動しないと、変更は自動的には反映されません。

クライアント画面からポートを変更する

YAMLを直接編集したくない場合、主要なクライアントでは設定画面にポート入力欄が用意されています。手順はおおむね以下の通りです。

  1. クライアントの設定画面を開く

    「設定」や「一般」カテゴリの中から、「混合ポート」「HTTPポート」「SOCKSポート」または「プロキシポート」といった項目を探します。

  2. 新しいポート番号を入力する

    占有されていないことを確認済みのポート番号を入力します。前述のコマンドで事前に空きポートであることを確認しておくのがおすすめです。

  3. コントロールポートも同時に変更する

    クライアントに「外部コントロールポート」や「APIポート」(external-controllerに対応)の項目が別途表示されている場合は、こちらも空いている値に変更し、両方が重複しないようにします。

  4. 保存してサービスを再起動する

    設定を保存すると、多くのクライアントはコアの再起動やアプリの再起動を促すメッセージを表示します。案内に従って操作し、再起動を促されている間に接続ボタンを何度も押さないようにしてください。

  5. システムプロキシ設定を確認する

    システムのネットワークプロキシ設定でポート番号を手動入力していた場合(クライアントの自動設定に追従していない場合)、システムプロキシ側のポート番号も新しい値に合わせて変更してください。そうしないと通信が旧ポートに向いたままとなり、接続に失敗します。

ポート変更後の反映確認方法

クライアントを再起動したら、まずコマンドラインで新しいポートがリスニング状態になっているかを確認しましょう。ブラウザで直接テストするのはおすすめしません(システムプロキシ設定やDNSキャッシュなどの要因が絡んで、判断材料としては不十分です)。Windowsでは引き続きnetstat -ano | findstr "新ポート番号"を使い、LISTENING状態が確認できればコアが正常にバインドできています。macOSとLinuxではlsof -i :新ポート番号を使い、対応するClashコアのプロセス名(一般的にはmihomoclash-meta、またはクライアント同梱のコア実行ファイル名)が確認できれば正常です。

リスニング状態を確認できたら、システムプロキシやブラウザ拡張機能に設定しているポート番号が新しいポートと一致しているかも確認してください。両方が揃って初めて実際に通信できるようになります。コントロールパネル系クライアントに付属する「接続テスト」や「遅延測定」機能を使っている場合は、この段階で正常に結果が返り、接続拒否エラーは出なくなっているはずです。

ポート競合を予防するための習慣

次回同じ問題に遭遇しないために、いくつかの習慣を身につけておくと良いでしょう。1つ目は、同じデバイスにはできるだけClash系クライアントを1つだけ残すこと。新バージョンにアップグレードする前に旧バージョンをアンインストールまたは完全終了しておき、両者がバックグラウンドで同時に常駐して競合するのを防ぎます。2つ目は、PCで他のプロキシツールや特定のポートを固定利用する開発環境が動いている場合、あらかじめClashのポートを明らかに使われにくい数字(5桁の高位ポートなど)に設定し、そもそも衝突が起きないようにしておくことです。3つ目は、ポート設定を変更するたびに、どの値に変更したかをメモしておくことです。次回のトラブル対応時に参照しやすくなりますし、特にチームで設定ファイルを共有している場合は、ポート番号の変更内容を設定ファイルの先頭にコメントとして残しておくとよいでしょう。

同じソフトとの間でポート競合が繰り返し発生する場合(例えば、固定インストールされた企業向けソフトが長期的に9090を占有しているケースなど)、より根本的な対処法はClashのデフォルトポートを恒久的に変更してしまうことです。毎回その場しのぎでポートを空けるのではなく、設定ファイルとクライアント設定を一度だけ変更しておけば、以後は長期的に中断されずに使い続けられます。

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