エラーメッセージが示す内容
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を例に解説します。
ポート使用中の問題と、サブスクリプション失効・ノード接続不可の問題は全く別のものです。前者はクライアントが起動できない、または起動後すぐに終了するという症状で表れます。後者はクライアント自体は正常に動作しているが、目的のサイトに接続できないというものです。どちらの段階で発生しているエラーかを先に見極めることで、切り分けの時間を大きく節約できます。
7890を占有しやすいプロセス
7890はシステム予約ポートではないため、理論上どのプログラムでも占有し得ますが、実際の切り分けで最も頻度が高いのは以下のケースです。
- 同じマシンでClash系クライアントを2つ動かしている。例えばClash Verge RevとClash Plusを両方インストールし、どちらもデフォルトの7890を使っている場合、先に起動した方が終了していないと後発が起動できません。
- 前回のプロセスが正常終了していない。システムのスリープ、タスクマネージャーでの強制終了、コアがクラッシュしたにもかかわらず親プロセスが子プロセスを片付けなかった場合など、ゾンビプロセスがポートを占有したまま残ることがあります。
- 他の代理ツールが同じデフォルトポートを使っている。一部の古い代理ツールやパケットキャプチャツール(デバッグ用代理として設定されている場合など)も、デフォルトで7890や近い番号帯を監視することがあります。
- DockerコンテナやWSL2内のサービスがポートマッピングを行っている場合、コンテナ内サービスがホストの7890にマッピングされていることがあります。
いずれのケースでも、まず占有元が何であるかを特定し、それを終了させるか、Clash側で別のポートに変更するかを判断するのが基本の流れです。とりあえずPCを再起動して一時的に解決することもありますが、原因を突き止めない限り再発します。
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.exe や mihomo.exe)であれば、残留プロセスであることが確定です。タスクマネージャーで手動終了するか、次を実行します。
taskkill /PID 18420 /F
終了後、クライアントを再起動すれば問題ありません。PIDが見慣れないプログラムを指している場合は、まずその役割を確認し、そのプログラムを終了するか、Clashの監視ポートを変更するか(後述)を検討してください。
プロセスの用途を理解しないまま taskkill を実行しないでください。PIDがシステムサービスやセキュリティソフトのものであった場合、強制終了によって他の異常が発生する可能性があります。このような場合はプロセスを終了するより、ポート変更を優先してください。
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 を付けてください。
方法1:クライアント画面から直接ポートを変更する
7890を占有しているのが簡単には終了できない常駐プログラム(長期間動作させておく必要がある別のツールなど)の場合は、相手を触らずにClash側のポートを変更するほうが手早く解決できます。多くのGUIクライアントは設定画面にポート変更の項目を用意しており、手順はおおむね次の通りです。
-
クライアントの設定パネルを開く
メイン画面の「設定」または歯車アイコンから、ネットワーク/ポート関連の設定セクションに移動します。クライアントによって名称は多少異なりますが、mixed-port、HTTPポート、SOCKSポートなどの項目がまとめて表示されます。
-
mixed-port(混合ポート)の項目を探す
元の
7890を使用されていないポート番号(例:17890や7899)に変更します。1024以上10000未満で、あまり一般的でない番号帯を選ぶと他のソフトとの衝突を避けやすくなります。 -
保存してコアを再起動する
多くのクライアントではポートを変更した後、「コアを再起動」または「適用」ボタンを押さないと変更が反映されません。設定画面を保存するだけでは即座に再バインドされない場合があります。
-
システムプロキシのポート設定も同期する
クライアントで「システムプロキシに設定」機能を有効にしている場合、mixed-portを変更したら、システムプロキシ設定側のポート番号も必ず同期して更新してください。そうしないと、コアは正常に動作しているのに通信が繋がらない状態になります。
方法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ではなくこちらの行を変更する必要があります。編集・保存後にクライアントを再起動、または設定を再読み込みすると、新しいポートが有効になります。
設定ファイルを手動で変更した後、クライアントが「サブスクリプション自動更新でローカル設定を上書き」する設定になっている場合、次回のサブスクリプション更新時にポートの変更がデフォルト値に戻されてしまう可能性があります。長期的に使うカスタムポートは、クライアント画面側でも同じ設定をしておき、両方を一致させておくことをお勧めします。
ポート変更後に再確認すべき3つのポイント
ポート番号を変更した後は、元の7890に依存していた一部の設定も同期して調整する必要があります。そうしないと「クライアントは起動したのに、ウェブページが開けない」という新たな問題が発生します。
- ブラウザ拡張機能内のプロキシポート。SwitchyOmegaなどのブラウザ拡張機能で
127.0.0.1:7890のプロキシアドレスを手動設定していた場合、ポート変更後は拡張機能側のポート番号も同期して変更する必要があります。 - システムレベルのプロキシ設定。Windowsの「設定 → ネットワークとインターネット → プロキシ」、macOSの「システム設定 → ネットワーク → プロキシ」でポート番号を手動入力していた場合も、同様に更新が必要です。
- TUNモードは影響を受けません。システムプロキシではなくTUNモードを有効にしている場合、通信は仮想ネットワークカードを経由し、mixed-portは経由しません。この場合、ポート変更が既存のTUN設定に影響することは通常ありませんが、コアが完全に再読み込みされたことを確認するため、一度クライアントを再起動しておくと安心です。