Clash 提示連接埠被佔用怎麼辦:定位 7890 連接埠衝突程序並修改混合連接埠
啟動時報 bind: address already in use 代表預設連接埠被其他程式佔用。本文提供 Windows、macOS、Linux 三平台查找佔用程序的指令,以及在客戶端修改 mixed-port 的完整步驟。
錯誤訊息說明什麼問題
Clash 核心啟動時會依照設定檔裡的連接埠設定監聽本機連接埠,預設的混合連接埠 mixed-port 是 7890,同時相容 HTTP 與 SOCKS5 兩種協定。啟動記錄裡如果出現類似下面這行,說明核心嘗試綁定 7890 連接埠時失敗:
level=fatal msg="Start Http Server error: listen tcp 127.0.0.1:7890: bind: address already in use"
這條錯誤和網路是否連通沒有關係,純粹是作業系統層面的連接埠佔用衝突:某個程序已經在監聽 7890 連接埠,新啟動的 Clash 核心搶不到這個連接埠,於是直接退出或者代理頁面顯示「未執行」。常見觸發場景包括:上一次 Clash 程序沒有完全退出、同一台機器上裝了兩個 Clash 系列客戶端、或者其他代理軟體(比如某些下載工具、開發除錯代理)恰好也把預設連接埠設成了 7890。
排查思路很直接:先確認到底是誰佔著這個連接埠,再決定是關掉那個程序,還是把 Clash 的連接埠改成別的數字。下面按平台給出具體指令。
Windows:用 netstat 定位佔用程序
開啟命令提示字元或 PowerShell,執行:
netstat -ano | findstr 7890
輸出的最後一欄是程序 PID,例如:
TCP 127.0.0.1:7890 0.0.0.0:0 LISTENING 8824
拿到 PID 之後,用工作管理員搜尋這個 PID 對應的程序名稱,或者繼續用命令列查看:
tasklist /FI "PID eq 8824"
確認是殘留的舊 Clash 程序或者其他不需要保留的程式後,可以直接結束它:
taskkill /PID 8824 /F
如果佔用程序就是 Clash 自己的另一個殘留執行個體(常見於強制關機後程序沒清乾淨),結束後重新啟動客戶端即可恢復正常。如果佔用方是另一個長期需要執行的程式,建議採用後文的改連接埠方案,而不是每次都手動終止程序。
macOS 與 Linux:用 lsof 或 ss 定位佔用程序
macOS 和大多數 Linux 發行版都內建 lsof 指令,可以直接按連接埠號查詢:
lsof -i:7890
輸出裡 COMMAND 欄是程序名稱,PID 欄是程序號碼,例如:
COMMAND PID USER FD TYPE NODE NAME
clash-core 3021 dev 3u IPv4 TCP *:7890 (LISTEN)
確認後用 kill 結束該程序:
kill -9 3021
部分精簡版 Linux 系統(比如某些容器映像檔或路由器 OpenWrt)可能沒有預裝 lsof,這種情況下改用 ss 指令,效果相同:
ss -tulnp | grep 7890
ss 的輸出會在最後一欄直接給出程序名稱和 PID,格式類似 users:(("clash",pid=3021,fd=3)),同樣可以用 kill -9 結束。舊版系統如果連 ss 也沒有,可以退回用 netstat -tulnp | grep 7890,原理一致。
在客戶端裡修改 mixed-port
如果佔用 7890 連接埠的程式不方便關閉,或者這種衝突反覆出現,更省心的做法是把 Clash 的監聽連接埠改成別的數字,徹底避開衝突。修改方式因客戶端而異,但底層改的都是同一個設定項目。
方式一:客戶端設定面板直接改
Clash Verge、Clash Nyanpasu、FlClash 等主流客戶端都在「設定」或「一般」頁面提供連接埠輸入框,找到「混合連接埠」「Mixed Port」或「本機連接埠」欄位,直接改成一個未被佔用的數字,建議範圍是 10000 以上的高位連接埠,例如 17890 或 27890,避開系統常用連接埠段。儲存後客戶端會自動重啟核心生效。
方式二:直接編輯設定檔
如果客戶端沒有對應設定項,或者使用命令列方式執行核心,可以在設定檔裡手動修改:
mixed-port: 17890
allow-lan: false
mode: rule
log-level: info
如果設定檔裡用的是舊式的分離連接埠寫法(port 對應 HTTP、socks-port 對應 SOCKS5),而不是合併後的 mixed-port,同樣需要把衝突的那個連接埠號改掉:
port: 17891
socks-port: 17892
mixed-port 與 port/socks-port 通常只需要保留一種寫法,同時存在容易混淆到底哪個連接埠在生效,建議統一用 mixed-port。改完連接埠後還要同步檢查的地方
連接埠改完不是儲存設定就結束了,還有幾個聯動的地方容易漏掉,導致代理看起來「開了但沒生效」:
- 系統代理設定:如果客戶端開啟了「設定為系統代理」這類開關,系統層面記錄的連接埠號是舊值,需要關閉再重新開啟這個開關,讓系統代理設定刷新成新連接埠。
- 瀏覽器擴充功能:部分瀏覽器擴充功能(比如 SwitchyOmega 一類的代理切換工具)會單獨儲存一份連接埠設定,和客戶端設定是兩套獨立資料,需要進入擴充功能設定手動改成新連接埠。
- 命令列工具的代理環境變數:如果習慣用
export https_proxy=http://127.0.0.1:7890這類指令給終端機設代理,記得把連接埠號一起改掉,否則終端機裡的請求還是指向舊連接埠,會連線失敗。 - 區域網路內其他裝置:如果有別的裝置透過這台電腦的區域網路代理上網,對方儲存的位址裡連接埠號也需要更新。
常見的連接埠佔用來源
除了 Clash 自身殘留程序,7890 連接埠衝突還經常來自這幾類程式,排查時可以優先懷疑:
- 同時裝了兩個 Clash 系列客戶端:比如電腦上同時裝了 Clash Verge 和 ClashX Meta,兩者預設連接埠都是 7890,只要有一個先啟動,另一個必然衝突。建議只保留一個常駐使用的客戶端。
- 命令列直接執行核心**未正確退出:透過終端機手動執行核心程式除錯時,如果用
Ctrl+C之外的方式強制關閉終端機視窗,核心程序可能變成孤兒程序繼續佔用連接埠,需要按前文指令手動找到並結束。 - 其他代理或封包截取工具:一些網路除錯工具、下載管理器內建的代理模組偶爾會用到 7890 這個常見連接埠號,和 Clash 衝突的機率不算低。
- 虛擬機器或容器連接埠映射:如果本機執行了虛擬機器或 Docker 容器,並把容器內某個服務映射到了主機的 7890 連接埠,同樣會造成佔用,這種情況下建議改容器的映射連接埠,而不是改 Clash。
定位到衝突源之後,選擇結束佔用程序還是修改 Clash 連接埠,取決於哪個程式更需要固定在預設連接埠上。對大多數日常使用場景,把 Clash 的 mixed-port 改成一個不常用的高位連接埠是最省心的一次性方案,改完之後基本不會再遇到同類衝突。