Clash 連接埠被佔用怎麼辦:定位衝突程序與修改混合連接埠

啟動時報錯 bind: address already in use 的完整處理流程:用 netstat 與 lsof 找出佔用 7890 連接埠的程序,判斷該終止程序還是改連接埠,並提供改連接埠後同步系統代理設定的步驟。

U1

報錯訊息在說什麼:bind: address already in use

連接埠 · 混合連接埠 · 監聽失敗

Clash 用戶端(以及基於 Clash Meta / mihomo 核心的各類衍生用戶端)啟動時會在本機監聽一個或多個連接埠,用來接收系統或瀏覽器轉發過來的代理流量。最常見的是mixed-port(混合連接埠),預設值通常是7890,它同時接受 HTTP 與 SOCKS5 協定的連線,取代了早期需要分別設定port(HTTP)與socks-port(SOCKS5)兩個連接埠的寫法。除此之外,還有用於管理面板通訊的external-controller連接埠,常見值是9090

當用戶端在啟動階段嘗試綁定這些連接埠時,如果作業系統回報該連接埠已被另一個程序佔用,就會拋出bind: address already in use這類報錯,程式隨即中止啟動或介面提示連線失敗。這是作業系統層級的資源互斥機制:同一個 TCP 連接埠在同一時刻只能被一個程序獨佔監聽,誰先搶到,後來者就會被拒絕。

提示

連接埠衝突和訂閱失效、節點無法使用是兩類完全不同的問題。前者是用戶端本身無法完成初始化,後者是用戶端已正常運作但代理節點連不通。看到bind相關的報錯文字,基本可以確定是連接埠層級的問題,不必先去排查訂閱或節點。

U2

三步定位佔用連接埠的程序

WINDOWS / MACOS / LINUX

不同作業系統查詢連接埠佔用的指令不同,但思路一致:先按連接埠號找到對應的程序 ID(PID),再按 PID 反查程序名稱,確認它到底是誰。

Windows

開啟命令提示字元或 PowerShell,執行:

netstat -ano | findstr :7890

輸出中最後一欄數字就是 PID,例如看到12480,再執行:

tasklist /FI "PID eq 12480"

即可看到佔用連接埠的程序名稱,常見的是殘留的clash.execlash-verge.exe、其他代理軟體的執行檔,或某些安全軟體的轉發元件。

macOS / Linux

macOS 與大多數 Linux 發行版都內建lsof,執行:

lsof -i :7890

輸出的COMMAND欄即為程序名稱,PID欄為程序編號。如果系統沒有lsof,Linux 下也可以用:

netstat -anp | grep 7890
# 或使用較新的 ss 指令
ss -ltnp | grep 7890

需要注意的是netstat -anp在部分發行版上需要sudo權限才能看到程序名稱,否則 PID 欄會顯示為空。

指令系統關鍵輸出欄位
netstat -anoWindows本機位址、PID
tasklist /FIWindows程序名稱、PID
lsof -i :連接埠macOS / LinuxCOMMAND、PID
ss -ltnpLinux本機位址、程序資訊
U3

該終止程序還是改連接埠:三種典型情境

判斷依據

查到佔用連接埠的程序之後,不要急著一律強制終止。先判斷它是誰、為什麼在執行,再決定處理方式。

  1. 是 Clash 自身的殘留程序。常見於上次關閉用戶端時視窗結束了但背景程序沒有完全退出,或系統當機後遺留了殭屍程序。這種情況直接終止該程序,再重新啟動用戶端即可,不需要改動任何設定。
  2. 是另一套常駐運作的代理或 VPN 工具。比如同時裝了兩款代理用戶端,或是公司強制安裝的 VPN 元件長期佔用相同連接埠。這類程序通常是有意保留的,強行終止可能影響其他功能,更穩妥的做法是修改 Clash 這一側的連接埠,避免以後每次開機都要手動處理衝突。
  3. 是系統層級服務或容器映射連接埠。某些路由軟體、Docker 容器或本機開發服務恰好用到了相同連接埠段。這種連接埠通常不方便隨意終止,同樣建議修改 Clash 的連接埠來避開。
注意

如果多次重新開機後連接埠衝突依然反覆出現,基本可以排除「暫時殘留程序」的可能,說明有另一個程式把該連接埠設成了固定監聽,應優先考慮改連接埠,而不是每次都去終止程序。

U4

修改 Clash 混合連接埠的操作步驟

YAML 設定檔 / 用戶端介面

大多數圖形化用戶端都提供了連接埠設定入口,通常在「設定」或「基礎」頁面裡能直接修改混合連接埠數值,儲存後用戶端會自動重新啟動監聽。如果用戶端沒有對應入口,或你在直接編輯設定檔,可以在 YAML 中找到並修改這一行:

mixed-port: 7891
external-controller: 127.0.0.1:9091

把預設的7890改為一個目前未被佔用的連接埠號即可,常見的替代選擇是789117890等不容易與其他常見軟體衝突的數字。如果設定檔裡用的是舊式寫法,分別宣告了port(HTTP)與socks-port(SOCKS5)而非mixed-port,記得兩個連接埠都要一起改,並確認二者不相同,否則同樣會綁定失敗。

修改完成後必須完全重新啟動用戶端(不是僅重新載入設定),因為連接埠監聽是在程序啟動階段完成的,熱重載設定往往不會重新綁定連接埠。

U5

改連接埠後同步系統代理設定

系統代理 / PAC / 環境變數

把 Clash 的連接埠改掉之後,如果之前是透過「系統代理」模式接入(而不是 TUN 模式接管全域流量),系統裡記錄的代理連接埠也必須同步修改,否則瀏覽器和其他應用程式仍會往舊連接埠發送請求,連線會直接被拒絕。

export all_proxy=http://127.0.0.1:7891
export http_proxy=$all_proxy
export https_proxy=$all_proxy

如果使用的是 PAC 自動設定腳本或系統層級「自動偵測設定」,通常無需手動改連接埠,但仍建議改完後開啟瀏覽器造訪一個網站驗證代理確實生效,避免連接埠改動後代理悄悄失效卻未察覺。

U6

兩個容易被忽略的細節

常見誤區

第一,只改了mixed-port卻沒有同步external-controller的連接埠時,如果 9090/9091 也恰好被佔用,用戶端的管理面板(Dashboard)會打不開,但代理轉發功能其實是正常的,別把這個現象誤判為「設定又壞了」。第二,部分用戶端會把連接埠號寫入本機快取或歷史設定快照,直接改 YAML 檔後如果用戶端仍從快取讀取舊值,建議先在用戶端裡手動清除或重新匯入一次設定,確保新連接埠真正生效。

危險

終止程序前務必確認程序名稱,不要按 PID 盲目taskkillkill -9系統關鍵程序。如果不確定某個陌生程序是否安全,先搜尋其執行檔名稱,再決定是否終止。

下載 Clash 用戶端

連接埠衝突處理完成後,建議直接使用官方管道的最新用戶端版本,減少因舊版本已知問題帶來的重複排查。

下載用戶端