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
注意:結束程序前先確認 PID 對應的程式不是系統服務或正在使用中的其他工具,誤殺會導致相關程式的資料未儲存就退出。

如果佔用程序就是 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-portport/socks-port 通常只需要保留一種寫法,同時存在容易混淆到底哪個連接埠在生效,建議統一用 mixed-port

改完連接埠後還要同步檢查的地方

連接埠改完不是儲存設定就結束了,還有幾個聯動的地方容易漏掉,導致代理看起來「開了但沒生效」:

  • 系統代理設定:如果客戶端開啟了「設定為系統代理」這類開關,系統層面記錄的連接埠號是舊值,需要關閉再重新開啟這個開關,讓系統代理設定刷新成新連接埠。
  • 瀏覽器擴充功能:部分瀏覽器擴充功能(比如 SwitchyOmega 一類的代理切換工具)會單獨儲存一份連接埠設定,和客戶端設定是兩套獨立資料,需要進入擴充功能設定手動改成新連接埠。
  • 命令列工具的代理環境變數:如果習慣用 export https_proxy=http://127.0.0.1:7890 這類指令給終端機設代理,記得把連接埠號一起改掉,否則終端機裡的請求還是指向舊連接埠,會連線失敗。
  • 區域網路內其他裝置:如果有別的裝置透過這台電腦的區域網路代理上網,對方儲存的位址裡連接埠號也需要更新。

常見的連接埠佔用來源

除了 Clash 自身殘留程序,7890 連接埠衝突還經常來自這幾類程式,排查時可以優先懷疑:

  1. 同時裝了兩個 Clash 系列客戶端:比如電腦上同時裝了 Clash Verge 和 ClashX Meta,兩者預設連接埠都是 7890,只要有一個先啟動,另一個必然衝突。建議只保留一個常駐使用的客戶端。
  2. 命令列直接執行核心**未正確退出:透過終端機手動執行核心程式除錯時,如果用 Ctrl+C 之外的方式強制關閉終端機視窗,核心程序可能變成孤兒程序繼續佔用連接埠,需要按前文指令手動找到並結束。
  3. 其他代理或封包截取工具:一些網路除錯工具、下載管理器內建的代理模組偶爾會用到 7890 這個常見連接埠號,和 Clash 衝突的機率不算低。
  4. 虛擬機器或容器連接埠映射:如果本機執行了虛擬機器或 Docker 容器,並把容器內某個服務映射到了主機的 7890 連接埠,同樣會造成佔用,這種情況下建議改容器的映射連接埠,而不是改 Clash。

定位到衝突源之後,選擇結束佔用程序還是修改 Clash 連接埠,取決於哪個程式更需要固定在預設連接埠上。對大多數日常使用場景,把 Clash 的 mixed-port 改成一個不常用的高位連接埠是最省心的一次性方案,改完之後基本不會再遇到同類衝突。

取得全平台 Clash 客戶端

Windows、macOS、Android、iOS、Linux 安裝包與設定說明。

下載客戶端