Clash 啟動提示埠被占用?Windows 下用 netstat 查行程並改 mixed-port

先釐清:Clash 在 Windows 上為什麼會「搶不到埠」?

多數圖形化用戶端(如 Clash Verge Rev、其他基於 mihomo/Clash Meta 的包裝版)在啟動內部核心前,都必須在本機特定 TCP 埠上成功接聽(LISTEN)。當作業系統回報該埠已有其他行程占用,核心就無法綁定,介面上便出現「埠被占用」「address already in use」「bind: Only one usage…」之類訊息,實務上常見的數字包含 78907891、以及設定檔裡的 mixed-port(混合埠,同時承載常見的 HTTP 與 SOCKS 連入)。

這與訂閱、規則或節點品質無關,屬於本機作業系統層的衝突。本文主線是Windows:用內建 netstat 與(選用)PowerShell 找出占用端的行程識別碼(PID),再決定要結束衝突程式,或把 Clash 的 mixed-port/獨立 port 改成空閒埠。防火牆與路由器設定多半不會造成「埠已被占用」,那是另一路徑的問題,不在此主線展開。

第一步:從日誌或畫面鎖定「是哪一個埠」在失敗

在改任何設定前,請先從用戶端日誌或彈出視窗抄下完整埠號。有時同一畫面會接連報兩三個埠失敗,例如 mixed-portController(外部控制)儀表板(Dashboard)埠、或 DNS 相關埠;每一個都必須分別對應到 netstat 查詢,因為實際占用者可能是不同行程。若您只改 mixed-port 卻沒處理另一個衝突,核心仍會起不來。

圖形介面若提供「一鍵釋放/重啟服務」,可優先使用;若沒有或仍失敗,再手動用下列指令。完整選單與服務模式說明可一併參考 Clash Verge Rev 使用教學,先確認沒有殘留的多開實例或「系統服務與可攜式雙重啟動」之類衝突。

第二步:在 CMD 用 netstat 找出 LISTEN 與 PID

以系統管理員身份開啟「命令提示字元」或一般權限即可先試(僅查 PID 多數情況足夠)。下列指令列出所有正在監聽的 TCP 埠最後一欄的 PID

netstat -ano | findstr LISTENING

若您已從日誌得知埠號是例如 7890,可縮小範圍(將 7890 代換成您實際的數字):

netstat -ano | findstr :7890

輸出中請對齊 本機位址一欄:同時留意 0.0.0.0:7890127.0.0.1:7890[::]:7890 等寫法,代表接聽介面不同,但「占用同埠號」的實質效果類似。記下最後的PID 數字。若一個埠旁邊出現多行,多為同一行程重複顯示或不同位址,仍以 PID 作為之後辯識依據。

第三步:在 PowerShell 用 Get-NetTCPConnection(選用,語意更直觀)

在 Windows 10/11 上,可開啟 PowerShell 使用下列寫法(同樣將埠號代換成您的實例):

Get-NetTCPConnection -LocalPort 7890 -State Listen -ErrorAction SilentlyContinue | Select-Object LocalAddress,LocalPort,OwningProcess

OwningProcess 即為 PID。好處是欄位清楚;若執行原則阻擋,可改用前節的 netstat。兩者擇一即可,不需要重複糾結。

第四步:從 PID 還原成「是哪一支程式」

在 CMD 中可用:

tasklist /FI "PID eq 12345"

12345 代換成您查到的 PID。工作管理員中亦可切到「詳細資料」分頁,以 PID 欄位排序尋找。常見情況包括:另一份 Clash/舊版核心仍在背景其他代理/加速軟體已開啟的 Docker 或 WSL 相關工具(參考 Docker Desktop 與 Clash 同機Windows 11 與 WSL2 路由專文的網路疊加情境,但埠占用本質仍是「先找到 PID」)。

若難以判斷執行檔路徑,可在系統管理員的 PowerShell 中檢視該 PID 的映像路徑(實際 cmdlet 因版本可能略有差異,必要時以工作管理員「開啟檔案位置」最直覺)。確認不是系統關鍵處理程序後,再考慮結束該次工作。

第五步:兩條路——釋放埠,或讓 Clash 改聽空閒埠

路徑 A:結束占用行程 — 在確認可安全關閉的前提下,可於工作管理員結束工作,或於 CMD 使用(同樣替換 PID):

taskkill /PID 12345 /F

關掉後,立刻再啟用您的 Clash 用戶端。若佔用者其實是「自己先前卡住的 mihomo」,結束後重新啟動一次通常就能恢復;若佔用者必須常駐(例如公司規定的其他代理),就改走路徑 B。

路徑 B:改 Clash 的 mixed-port 與相關埠位 — 於設定檔或圖形介面中,將 mixed-port 改為未出現在 netstat LISTENING 清單的埠(例如從 7890 改為 17890,僅為示意,實務請以您本機實測空閒者為準)。若您關閉了 mixed 而分開寫 port(HTTP)與 socks-port,三組數字都必須彼此不重複且與他軟體不衝突。變更後重新載入或重啟用戶端,並一併檢查瀏覽器或其他程式是否仍寫死舊的本機代理埠,必要時一併更新,否則只是核心成功啟動、應用卻仍連到舊埠。

第六步:別忘了外部控制、儀表板與 DNS 埠

實務上,使用者一開始盯著 7890,卻沒看到日誌裡還有第二個衝突點。若設定中啟用了 外部控制(external-controller) 或內建 Web UI,也會佔用獨立埠;DNS 監聽或某些擴充功能同樣可能占用固定埠。建議在錯誤訊息出現當下,逐埠用本文第二節的 netstat 或 PowerShell 篩選指令查一次。全部 LISTEN 成功後,核心才算真正就緒。

可選:用「資源監視器」圖形化比對

若偏好圖形介面,可開啟「資源監視器」→「網路」相關區段(實際版本介面用語可能顯示為 TCP 關聯、接聽埠等),依埠號尋找對應執行檔。概念與 netstat 相同,主線邏輯仍為:埠 → PID → 程式。此法不作為必備步驟,但對不熟悉命令列的讀者較友善。

建議核對重點(避免反覆卡同一關)

  • 多開:安裝更新後,舊的 Clash/核心處理程序是否仍在背景,導致自己搶自己。
  • 埠號一不致:圖形介面顯示的埠與實際寫入的 config.yaml 是否已同步,熱重載有時未覆寫舊的 mixed-port。
  • 只改一個不夠:同時衝突的可能是 mixed-port 與 controller 埠,要對照日誌列出的所有失敗埠。
  • 他軟體常駐:與其強殺不認識的行程,不如在可行範圍內讓兩邊改不同埠,降低風險。

結語

在 Windows 上,Clash 埠被占用本質是「同一個本機 TCP 埠只能有一個贏家」。先用 netstat 或 PowerShell 把「埠 → PID → 程式」這條鍊釐清,多數情況就能在幾分鐘內決定是關掉殘留行程、或把 mixed-port 與關聯選項改到空閒埠。與在論壇零散搜尋不同,掌握固定順序後,下次換系統、換殼或更新版本,也能用同一套方法自檢。

相較於隨意下載來歷不明的修改版,使用持續維護的用戶端、並從可信來源取得安裝檔,通常更能減少服務多開與路徑混亂。若您還在尋找 Windows 與其他平台的合適建置,可先從本站 下載頁面 取得一致入口,再回頭對照各篇專文完成設定。

Clash 無法啟動時,與其先改訂閱,不如先確認日誌裡的埠字串與 netstat 是否相符;兩邊一對上,排查範圍就縮到「是誰在聽那個埠」。想略過雜亂的第三方鏡像、直接取得整理後的用戶端下載,也歡迎使用本站提供的入口。→ 立即免費下載 Clash,開啟流暢上網新體驗