故障排除 閱讀時間約 10 分鐘

Clash 7890 埠號遭占用:查詢占用程序與變更 mixed-port 的方法

使用系統指令找出占用 7890 等埠號的程序,判斷該結束程序或變更埠號,並了解修改 mixed-port 後如何同步系統代理與瀏覽器設定。

先確認:是監聽失敗,還是代理位址填錯

處理順序如下:查詢占用程序 → 決定關閉舊執行個體或更換埠號 → 同步代理設定 → 確認監聽與請求。不要一看到網頁無法開啟就重新安裝用戶端。埠號衝突發生在本機監聽階段,通常與訂閱是否過期、節點延遲高低沒有直接關係。

7890 是常見的設定值,不是 Clash 或 mihomo 必須使用的埠號。用戶端可以將它設為 HTTP 代理埠號,也可以設為混合埠號,實際用途取決於目前生效的欄位。先開啟用戶端的記錄檔頁面,尋找包含 listen、bind 和埠號的錯誤訊息。

listen tcp 127.0.0.1:7890: bind: address already in use

上方是常見的錯誤訊息,表示無法再次繫結該位址上的 TCP 埠號。Windows 也可能顯示「通常每個通訊端位址只允許使用一次」。如果記錄檔顯示 permission denied 或「不允許存取」,還需檢查埠號保留、系統原則等限制,不能直接判定是已有程序占用。

  • 記錄檔明確指出繫結失敗:先執行下方的系統指令,找出正在監聽的程序。
  • 核心正常監聽,但瀏覽器顯示代理連線失敗:優先確認瀏覽器與系統代理是否仍指向舊埠號。
  • 只有少數網站無法開啟:接著檢查規則、DNS 和節點,不要反覆更換本機埠號。

Windows:透過 PID 找出占用 7890 的程式

方法一:使用 PowerShell 精確查詢監聽埠號

在 Windows 10 或 Windows 11 開啟 PowerShell,執行下列指令。若查詢結果為空,表示這次沒有找到正在監聽該 TCP 埠號的程序;若出現權限不足的提示,請改用系統管理員終端機。

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

記下 OwningProcess 欄位中的程序編號。假設結果是 6420,再查詢程序名稱、路徑和啟動指令。這裡的數字僅供示範,實際操作時請使用本機查詢到的 PID。

Get-Process -Id 6420 | Select-Object Id, ProcessName, Path
Get-CimInstance Win32_Process -Filter "ProcessId = 6420" |
  Select-Object ExecutablePath, CommandLine

不要只看名稱是否包含 Clash。桌面介面和核心經常是兩個不同的程序;同一個 mihomo.exe 也可能分別由系統匣用戶端、Windows 服務或手動指令啟動。可執行檔路徑和啟動參數有助於判斷它屬於哪一份安裝。

方法二:使用命令提示字元查詢

netstat -ano -p tcp | findstr ":7890"
tasklist /FI "PID eq 6420"

netstat 的結果需要自行核對:查看「本機位址」欄位中埠號正好是 7890、狀態為 LISTENING 的列。遠端位址含有 7890、狀態為 ESTABLISHED,或本機埠號是 78901,都不是同一種情況。

macOS 與 Linux:檢查監聽程序和背景服務

macOS:使用 lsof 查看 TCP 監聽狀態

開啟「終端機」,查詢正在監聽 7890 的程式。若一般使用者權限無法顯示完整資訊,再加上 sudo。

sudo lsof -nP -iTCP:7890 -sTCP:LISTEN

結果中的 COMMAND 是程式名稱,PID 是程序編號,NAME 是監聽位址。退出系統匣應用程式後再執行一次查詢。如果仍有監聽,可能是獨立執行的核心或背景服務;這不代表剛才的退出操作完全沒有效果。

Linux:使用 ss 查看埠號和程序

sudo ss -ltnp 'sport = :7890'

其中 -l 只顯示監聽中的通訊端,-t 只查詢 TCP,-n 保留數字埠號,-p 顯示關聯程序。若要查詢 UDP,可另外執行下列指令;TCP 和 UDP 是不同的傳輸協定,不能只根據 UDP 查詢結果推斷 TCP 已遭占用。

sudo ss -lunp 'sport = :7890'

如果程式結束後立刻又出現,請檢查是否由 systemd、使用者服務或其他程序管理工具自動重新啟動。先確認實際的服務單元,再停止對應服務,不要反覆強制結束程序。若使用容器部署,也要檢查主機的埠號映射:兩個容器各自監聽內部 7890 可以並存,但不能同時將同一主機位址的 7890 映射出去。

結束舊程序,還是將 mixed-port 改為 7891

判斷依據是占用程序是否仍有執行必要,而不是「先啟動的就一定正確」。如果只是重複啟動舊用戶端,建議先從系統匣選單正常退出;如果是必須保留的其他代理程式或開發服務,則為目前的 Clash 執行個體更換埠號。

發現的情況建議操作注意事項
舊用戶端重複執行正常退出舊用戶端檢查是否重複設定開機啟動
退出介面後,服務仍在執行確認後透過所屬用戶端或服務管理工具停止服務可能會自動重新啟動核心
另一個必要程式正在監聽 7890將目前的 mixed-port 改為 7891先確認 7891 是否未被占用
沒有監聽程序,卻仍顯示禁止存取檢查埠號保留和權限限制不要任意刪除系統保留項目

確認程式身分並儲存必要工作後,才考慮結束程序。優先使用程式本身的退出功能;以命令列啟動的核心,可在對應終端機按 Ctrl + C。Windows 的 taskkill /PID 6420 /F 屬於強制結束,應在一般退出方式無效時才使用,也不要直接照抄範例 PID。

如果 Windows 查不到監聽程序,卻持續出現存取權限錯誤,可以查看 TCP 排除埠號範圍。虛擬化或容器相關元件有時會影響可用埠號;發現保留項目時,改用未占用的埠號通常比修改系統保留範圍更穩妥。

netsh interface ipv4 show excludedportrange protocol=tcp
netsh interface ipv6 show excludedportrange protocol=tcp

修改 mixed-port:欄位要改對,也要確保設定持續生效

mixed-port 會在同一個監聽埠號接受 HTTP 和 SOCKS 代理連線。它不是訂閱網址、節點伺服器埠號,也不是面板控制介面的埠號。如果目前實際使用的是獨立的 port 或 socks-port,只修改 mixed-port 不一定會變更原本的連線入口。

先確認 7891 未被占用,再備份目前的設定。下方片段可合併至設定檔頂層,並非包含節點和規則的完整訂閱設定。僅供本機使用的代理,維持本機存取範圍即可。

config.yaml:頂層監聽欄位

mixed-port: 7891
allow-lan: false
bind-address: 127.0.0.1
  • 維持頂層縮排:mixed-port 不要放在 dns:、tun: 或任何節點定義之下。
  • 取代既有欄位:不要在檔案末尾再加上一個同名欄位,重複的欄位可能造成解析錯誤或行為不一致。
  • 檢查獨立埠號:如果仍有 port: 7890,原本的 HTTP 監聽衝突可能依然存在。請依實際需求修改或移除舊的監聽欄位。
  • 區分控制埠號:external-controller 用於由用戶端或面板控制核心,不能當作瀏覽器的 HTTP 代理入口。

為什麼儲存後又變回 7890

圖形介面用戶端可能會透過全域埠號設定、覆寫設定或合併設定來產生最終 YAML。訂閱檔案中的本機修改也可能在下次更新時被覆蓋。因此,建議優先使用用戶端提供的持續性埠號設定或覆寫機制;選單名稱會因用戶端版本而異,不要將某款用戶端的「設定」步驟套用到所有 Clash 用戶端。

修改後,使用用戶端提供的設定重新載入或重新啟動核心,並查看記錄檔是否顯示新的監聽位址。介面輸入框顯示 7891,只能證明設定已儲存,不能證明核心已成功繫結。其他欄位的說明請參閱YAML 手冊。

同步更新系統代理、瀏覽器和終端機中的舊埠號

將埠號從 7890 改為 7891 後,核心只會負責新的連線入口,外部應用程式不會全部自動跟著變更。最常見的疏漏是核心已正常啟動,但 Windows 系統代理仍設定為 127.0.0.1:7890,因此所有使用系統代理的瀏覽器都會顯示連線失敗。

系統與瀏覽器的檢查位置

  • Windows 11:「設定」→「網路和網際網路」→「Proxy」→「手動 Proxy 設定」→「使用 Proxy 伺服器」旁的「設定」,確認位址和埠號。如果用戶端負責管理系統代理,通常先關閉再開啟用戶端的「系統代理」,然後回到這裡確認設定。
  • macOS:「系統設定」→「網路」→目前網路連線的「詳細資訊」→「代理伺服器」,分別檢查已啟用的網頁代理、安全網頁代理或 SOCKS 代理。埠號必須與實際監聽入口一致。
  • Firefox:「設定」→「一般」→「網路設定」→「設定」。選擇「使用系統 Proxy 設定」時會跟隨系統;選擇「手動設定 Proxy」時,則需另外修改埠號。
  • Chromium 核心瀏覽器:通常會使用系統代理,但啟動參數和代理擴充功能可能會覆寫設定。如果只有一個瀏覽器出問題,請檢查這些個別設定。

如果使用自動 Proxy 設定指令碼(PAC),也要檢查指令碼回傳的 PROXY 127.0.0.1:7890 是否仍是舊值。HTTP 代理也能透過 CONNECT 通道連線至 HTTPS 網站,不要因為造訪 HTTPS 網站,就自行將本機代理位址改成 https://127.0.0.1:7891。

終端機環境變數需另外更新

終端機程式可能會讀取 HTTP_PROXY、HTTPS_PROXY 或 ALL_PROXY,而不是桌面系統代理。可在 PowerShell 目前工作階段中使用下列指令更新 HTTP 代理入口:

$env:HTTP_PROXY = "http://127.0.0.1:7891"
$env:HTTPS_PROXY = "http://127.0.0.1:7891"

macOS 或 Linux 常用的 shell 可使用下列寫法。如果原本也設定了大小寫不同的代理變數、ALL_PROXY 或工具本身的設定,也要確認其中沒有殘留 7890;各程式採用的優先順序不盡相同。

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

最後確認:檢查監聽、請求與重新啟動後的狀態

  1. 確認新的監聽埠號:將前面查詢指令中的 7890 改為 7891,確認監聽程序屬於目前的用戶端。如果舊埠號仍有程序監聽,請判斷它是否為預計保留的程式。
  2. 明確指定代理並送出請求:不要只依賴瀏覽器快取的頁面,使用下列指令確認可以連線到新的入口。
  3. 確認設定持續生效:正常退出並重新啟動用戶端,再檢查埠號。訂閱更新後也要再檢查一次,確認持續性覆寫設定沒有被覆蓋。

Windows 使用 curl.exe 可避免部分 PowerShell 環境中 curl 別名的差異;macOS 和 Linux 則直接使用 curl。

curl.exe --noproxy "" --proxy http://127.0.0.1:7891 --connect-timeout 5 --max-time 15 -I https://example.com
curl --noproxy "" --proxy http://127.0.0.1:7891 --connect-timeout 5 --max-time 15 -I https://example.com

這裡的 5 秒連線逾時和 15 秒總逾時是測試上限,並非速度保證。如果顯示無法連線至 127.0.0.1:7891,請繼續檢查監聽狀態和設定是否生效;如果代理通道已建立,之後才出現 TLS、上游連線或目標網站回應錯誤,排查重點就應轉向節點、規則或目標網站。只看到 200 Connection established 不代表整個請求已成功,還要查看後續輸出。

明確指定代理的請求成功後,再移除指令中的代理參數,回到瀏覽器確認系統代理連線。修改本機入口埠號不會自動改變規則模式的流量分流結果,也不會讓節點變快。完成這輪檢查後,就能分辨「本機埠號衝突已解決」和「仍有其他網路問題」,避免混為一談而反覆重新安裝。其他連線問題請參閱疑難排解。

下載最新版 Clash