Clash 連接埠被佔用怎麼辦:定位衝突程序與修改混合連接埠
啟動時報錯 bind: address already in use 的完整處理流程:用 netstat 與 lsof 找出佔用 7890 連接埠的程序,判斷該終止程序還是改連接埠,並提供改連接埠後同步系統代理設定的步驟。
啟動時報錯 bind: address already in use 的完整處理流程:用 netstat 與 lsof 找出佔用 7890 連接埠的程序,判斷該終止程序還是改連接埠,並提供改連接埠後同步系統代理設定的步驟。
Clash 用戶端(以及基於 Clash Meta / mihomo 核心的各類衍生用戶端)啟動時會在本機監聽一個或多個連接埠,用來接收系統或瀏覽器轉發過來的代理流量。最常見的是mixed-port(混合連接埠),預設值通常是7890,它同時接受 HTTP 與 SOCKS5 協定的連線,取代了早期需要分別設定port(HTTP)與socks-port(SOCKS5)兩個連接埠的寫法。除此之外,還有用於管理面板通訊的external-controller連接埠,常見值是9090。
當用戶端在啟動階段嘗試綁定這些連接埠時,如果作業系統回報該連接埠已被另一個程序佔用,就會拋出bind: address already in use這類報錯,程式隨即中止啟動或介面提示連線失敗。這是作業系統層級的資源互斥機制:同一個 TCP 連接埠在同一時刻只能被一個程序獨佔監聽,誰先搶到,後來者就會被拒絕。
連接埠衝突和訂閱失效、節點無法使用是兩類完全不同的問題。前者是用戶端本身無法完成初始化,後者是用戶端已正常運作但代理節點連不通。看到bind相關的報錯文字,基本可以確定是連接埠層級的問題,不必先去排查訂閱或節點。
不同作業系統查詢連接埠佔用的指令不同,但思路一致:先按連接埠號找到對應的程序 ID(PID),再按 PID 反查程序名稱,確認它到底是誰。
開啟命令提示字元或 PowerShell,執行:
netstat -ano | findstr :7890
輸出中最後一欄數字就是 PID,例如看到12480,再執行:
tasklist /FI "PID eq 12480"
即可看到佔用連接埠的程序名稱,常見的是殘留的clash.exe、clash-verge.exe、其他代理軟體的執行檔,或某些安全軟體的轉發元件。
macOS 與大多數 Linux 發行版都內建lsof,執行:
lsof -i :7890
輸出的COMMAND欄即為程序名稱,PID欄為程序編號。如果系統沒有lsof,Linux 下也可以用:
netstat -anp | grep 7890
# 或使用較新的 ss 指令
ss -ltnp | grep 7890
需要注意的是netstat -anp在部分發行版上需要sudo權限才能看到程序名稱,否則 PID 欄會顯示為空。
| 指令 | 系統 | 關鍵輸出欄位 |
|---|---|---|
| netstat -ano | Windows | 本機位址、PID |
| tasklist /FI | Windows | 程序名稱、PID |
| lsof -i :連接埠 | macOS / Linux | COMMAND、PID |
| ss -ltnp | Linux | 本機位址、程序資訊 |
查到佔用連接埠的程序之後,不要急著一律強制終止。先判斷它是誰、為什麼在執行,再決定處理方式。
如果多次重新開機後連接埠衝突依然反覆出現,基本可以排除「暫時殘留程序」的可能,說明有另一個程式把該連接埠設成了固定監聽,應優先考慮改連接埠,而不是每次都去終止程序。
大多數圖形化用戶端都提供了連接埠設定入口,通常在「設定」或「基礎」頁面裡能直接修改混合連接埠數值,儲存後用戶端會自動重新啟動監聽。如果用戶端沒有對應入口,或你在直接編輯設定檔,可以在 YAML 中找到並修改這一行:
mixed-port: 7891
external-controller: 127.0.0.1:9091
把預設的7890改為一個目前未被佔用的連接埠號即可,常見的替代選擇是7891、17890等不容易與其他常見軟體衝突的數字。如果設定檔裡用的是舊式寫法,分別宣告了port(HTTP)與socks-port(SOCKS5)而非mixed-port,記得兩個連接埠都要一起改,並確認二者不相同,否則同樣會綁定失敗。
修改完成後必須完全重新啟動用戶端(不是僅重新載入設定),因為連接埠監聽是在程序啟動階段完成的,熱重載設定往往不會重新綁定連接埠。
把 Clash 的連接埠改掉之後,如果之前是透過「系統代理」模式接入(而不是 TUN 模式接管全域流量),系統裡記錄的代理連接埠也必須同步修改,否則瀏覽器和其他應用程式仍會往舊連接埠發送請求,連線會直接被拒絕。
http_proxy、https_proxy、all_proxy等變數裡的連接埠號,例如:export all_proxy=http://127.0.0.1:7891
export http_proxy=$all_proxy
export https_proxy=$all_proxy
如果使用的是 PAC 自動設定腳本或系統層級「自動偵測設定」,通常無需手動改連接埠,但仍建議改完後開啟瀏覽器造訪一個網站驗證代理確實生效,避免連接埠改動後代理悄悄失效卻未察覺。
第一,只改了mixed-port卻沒有同步external-controller的連接埠時,如果 9090/9091 也恰好被佔用,用戶端的管理面板(Dashboard)會打不開,但代理轉發功能其實是正常的,別把這個現象誤判為「設定又壞了」。第二,部分用戶端會把連接埠號寫入本機快取或歷史設定快照,直接改 YAML 檔後如果用戶端仍從快取讀取舊值,建議先在用戶端裡手動清除或重新匯入一次設定,確保新連接埠真正生效。
終止程序前務必確認程序名稱,不要按 PID 盲目taskkill或kill -9系統關鍵程序。如果不確定某個陌生程序是否安全,先搜尋其執行檔名稱,再決定是否終止。
連接埠衝突處理完成後,建議直接使用官方管道的最新用戶端版本,減少因舊版本已知問題帶來的重複排查。