Clashでポート使用中エラーが出た場合の対処法:7890競合プロセスの特定とポート変更手順

起動時の bind: address already in use は7890番ポートが他プロセスに使われているのが原因であることが多いです。本記事では netstatlsof で占有プロセスを特定し、設定ファイルとクライアント画面の両方で mixed-port を変更する手順を解説します。

SEC-01

エラーメッセージが示す内容

Clash系クライアント(mihomoコアを使う各種GUIを含む)は起動時にローカルのいくつかのポートを監視状態にし、システムやブラウザからの代理接続要求を受け付けます。最も代表的なのがmixed-port 7890で、HTTPとSOCKS5の両プロトコルの接続を同時に受け付けます。このポートが既に別のプログラムに使われていると、コアは次のようなエラーをログに出して直ちに終了します。

FATA[0000] Start Mixin server error: listen tcp 127.0.0.1:7890: bind: address already in use

このログの要点は bind: address already in use です。問題はサブスクリプションやルールにあるのではなく、OSレベルでこのポート番号が既に使用中であり、新しいプロセスが同じポートを再度バインドできない状態にあることを示しています。同様のエラーは 7891(一部クライアントのSOCKSポート)、9090(外部コントロールポート external-controller)、53(DNS監視ポート)でも発生し得ます。切り分け方の考え方は同じなので、本記事では最も遭遇頻度の高い7890を例に解説します。

NOTE

ポート使用中の問題と、サブスクリプション失効・ノード接続不可の問題は全く別のものです。前者はクライアントが起動できない、または起動後すぐに終了するという症状で表れます。後者はクライアント自体は正常に動作しているが、目的のサイトに接続できないというものです。どちらの段階で発生しているエラーかを先に見極めることで、切り分けの時間を大きく節約できます。

SEC-02

7890を占有しやすいプロセス

7890はシステム予約ポートではないため、理論上どのプログラムでも占有し得ますが、実際の切り分けで最も頻度が高いのは以下のケースです。

  • 同じマシンでClash系クライアントを2つ動かしている。例えばClash Verge RevとClash Plusを両方インストールし、どちらもデフォルトの7890を使っている場合、先に起動した方が終了していないと後発が起動できません。
  • 前回のプロセスが正常終了していない。システムのスリープ、タスクマネージャーでの強制終了、コアがクラッシュしたにもかかわらず親プロセスが子プロセスを片付けなかった場合など、ゾンビプロセスがポートを占有したまま残ることがあります。
  • 他の代理ツールが同じデフォルトポートを使っている。一部の古い代理ツールやパケットキャプチャツール(デバッグ用代理として設定されている場合など)も、デフォルトで7890や近い番号帯を監視することがあります。
  • DockerコンテナやWSL2内のサービスがポートマッピングを行っている場合、コンテナ内サービスがホストの7890にマッピングされていることがあります。

いずれのケースでも、まず占有元が何であるかを特定し、それを終了させるか、Clash側で別のポートに変更するかを判断するのが基本の流れです。とりあえずPCを再起動して一時的に解決することもありますが、原因を突き止めない限り再発します。

SEC-03

Windowsでnetstatを使って占有プロセスを特定する

コマンドプロンプトまたはPowerShellを開き、次を実行します。

netstat -ano | findstr :7890

正常な場合は次のような1行または複数行が出力されます。

TCP    127.0.0.1:7890    0.0.0.0:0    LISTENING    18420

最後の列 18420 がこのポートを占有しているプロセスのPIDです。次にこのPIDでプロセス名を逆引きします。

tasklist | findstr 18420

出力結果が前回終了しなかったクライアント本体のプロセス(例:clash-verge.exemihomo.exe)であれば、残留プロセスであることが確定です。タスクマネージャーで手動終了するか、次を実行します。

taskkill /PID 18420 /F

終了後、クライアントを再起動すれば問題ありません。PIDが見慣れないプログラムを指している場合は、まずその役割を確認し、そのプログラムを終了するか、Clashの監視ポートを変更するか(後述)を検討してください。

WARN

プロセスの用途を理解しないまま taskkill を実行しないでください。PIDがシステムサービスやセキュリティソフトのものであった場合、強制終了によって他の異常が発生する可能性があります。このような場合はプロセスを終了するより、ポート変更を優先してください。

SEC-04

macOS / Linuxでlsofを使って占有プロセスを特定する

macOSと大半のLinuxディストリビューションには lsof(List Open Files)が標準搭載されており、ポートの確認には netstat より直感的です。

lsof -i :7890

出力例:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mihomo    22187 alice    7u  IPv4 0x1a2b      0t0  TCP 127.0.0.1:7890 (LISTEN)

COMMAND 列に直接プロセス名が表示され、PID 列がプロセス番号です。残留したClashコアのプロセスであることを確認したら、終了させます。

kill -9 22187

システムに lsof がない場合(一部の軽量Linuxコンテナなど)は、ss コマンドで代替できます。

ss -tlnp | grep 7890

このコマンドも末尾に pid= フィールドを出力するので、操作方法は前述と同様です。Linuxで占有プロセスが一般ユーザー権限では終了できない場合は、コマンドの前に sudo を付けてください。

SEC-05

方法1:クライアント画面から直接ポートを変更する

7890を占有しているのが簡単には終了できない常駐プログラム(長期間動作させておく必要がある別のツールなど)の場合は、相手を触らずにClash側のポートを変更するほうが手早く解決できます。多くのGUIクライアントは設定画面にポート変更の項目を用意しており、手順はおおむね次の通りです。

  1. クライアントの設定パネルを開く

    メイン画面の「設定」または歯車アイコンから、ネットワーク/ポート関連の設定セクションに移動します。クライアントによって名称は多少異なりますが、mixed-port、HTTPポート、SOCKSポートなどの項目がまとめて表示されます。

  2. mixed-port(混合ポート)の項目を探す

    元の 7890 を使用されていないポート番号(例:178907899)に変更します。1024以上10000未満で、あまり一般的でない番号帯を選ぶと他のソフトとの衝突を避けやすくなります。

  3. 保存してコアを再起動する

    多くのクライアントではポートを変更した後、「コアを再起動」または「適用」ボタンを押さないと変更が反映されません。設定画面を保存するだけでは即座に再バインドされない場合があります。

  4. システムプロキシのポート設定も同期する

    クライアントで「システムプロキシに設定」機能を有効にしている場合、mixed-portを変更したら、システムプロキシ設定側のポート番号も必ず同期して更新してください。そうしないと、コアは正常に動作しているのに通信が繋がらない状態になります。

SEC-06

方法2:設定ファイルのポート項目を直接編集する

手動管理している設定ファイルを使っている場合、あるいはクライアントの画面に一時的にアクセスできない場合は、YAML設定を直接編集することもできます。サブスクリプションの設定ファイル内で以下の行を探します(項目名はバージョンによって多少異なる場合があります)。

mixed-port: 7890
allow-lan: true
external-controller: 127.0.0.1:9090

mixed-port の後ろの値を空いているポートに変更します。例:

mixed-port: 17890

クライアントが統一されたmixed-portではなく、独立したHTTPポートとSOCKSポートを使っている場合、対応する項目は通常次のようになります。

port: 7890
socks-port: 7891

必要に応じてそれぞれ変更してください。external-controller は別のポート(デフォルト9090)を使い、これはパネル/ダッシュボード用の管理インターフェースであり、通信転送用のポートとは全く別のものです。エラーメッセージが9090の占有を指している場合は、mixed-portではなくこちらの行を変更する必要があります。編集・保存後にクライアントを再起動、または設定を再読み込みすると、新しいポートが有効になります。

WARN

設定ファイルを手動で変更した後、クライアントが「サブスクリプション自動更新でローカル設定を上書き」する設定になっている場合、次回のサブスクリプション更新時にポートの変更がデフォルト値に戻されてしまう可能性があります。長期的に使うカスタムポートは、クライアント画面側でも同じ設定をしておき、両方を一致させておくことをお勧めします。

SEC-07

ポート変更後に再確認すべき3つのポイント

ポート番号を変更した後は、元の7890に依存していた一部の設定も同期して調整する必要があります。そうしないと「クライアントは起動したのに、ウェブページが開けない」という新たな問題が発生します。

  • ブラウザ拡張機能内のプロキシポート。SwitchyOmegaなどのブラウザ拡張機能で 127.0.0.1:7890 のプロキシアドレスを手動設定していた場合、ポート変更後は拡張機能側のポート番号も同期して変更する必要があります。
  • システムレベルのプロキシ設定。Windowsの「設定 → ネットワークとインターネット → プロキシ」、macOSの「システム設定 → ネットワーク → プロキシ」でポート番号を手動入力していた場合も、同様に更新が必要です。
  • TUNモードは影響を受けません。システムプロキシではなくTUNモードを有効にしている場合、通信は仮想ネットワークカードを経由し、mixed-portは経由しません。この場合、ポート変更が既存のTUN設定に影響することは通常ありませんが、コアが完全に再読み込みされたことを確認するため、一度クライアントを再起動しておくと安心です。

SEC-08

ポートが空いたことを確認する方法

占有プロセスを終了、またはポートを変更した後は、感覚で「もう大丈夫だろう」と判断せず、コマンドで再確認するのが最も確実です。Windowsでは再度以下を実行します。

netstat -ano | findstr :7890

何も出力されなければ、そのポートは現在空いている状態です。安心して使用できます。macOS / Linuxでは対応するコマンドを実行します。

lsof -i :7890

同様に、出力がなければポートは空いています。その後Clashクライアントを起動すると、正常な場合、以前の FATA レベルのエラーではなく、次のような成功ログが表示されます。

INFO[0000] Mixed(http+socks) proxy listening at: 127.0.0.1:7890

この行が表示されれば、mixed-portのバインドは成功し、クライアントは正常に監視状態に入っています。続けてシステムプロキシやブラウザ拡張機能の設定を行えます。

SEC-09

ポート変更後も問題が解決しない場合

ごく稀に、「空いているはず」のポートに変更しても同じバインドエラーが出続けることがあります。その場合は以下の項目を追加で確認してください。

  1. 変更したのが実際に読み込まれている設定であるか確認する

    一部のクライアントは複数の設定ファイル(プロファイル)を持っており、Aのファイルを変更したのに実際にはBのファイルが読み込まれている場合、変更は反映されません。

  2. セキュリティソフトがポート監視をブロックしていないか確認する

    一部のセキュリティ対策ソフトは、未知のプログラムによるローカルポートのバインド動作をブロックすることがあります。Clashクライアントを信頼リストに追加するか、関連するブロック項目を一時的に無効化してから再度テストしてください。

  3. まったく使われていないポート番号に変更して再テストする

    一部の番号帯はシステムや他のバックグラウンドサービスに予約されている場合があります。5桁で丸い数字ではないポート番号(例:27891)に変更して再度試し、番号帯自体の問題を排除してください。

これらの項目を一つずつ確認していけば、ポート使用中トラブルの大半のケースをカバーできます。この種の障害の核心は常に同じで、まずシステムコマンドでどのプロセスがポートを占有しているかを確認し、そのプロセスを終了するか、Clash側で別のポートに切り替えるかを判断することです。クライアントの再インストールやサブスクリプションの再取得は不要です。

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