Clash 連接埠被佔用怎麼辦:找出 7890 衝突程序並修改混合連接埠

Clash 啟動時顯示連接埠被佔用?使用 netstat、lsof 或 ss 找出佔用程序,再同步修改 mixed-port 與系統代理設定,避免更改後仍無法連線。

先確認衝突的是哪個連接埠

出現「address already in use」、「bind failed」或「連接埠已被佔用」時,通常可以直接判斷:Mihomo 核心準備監聽某個本機連接埠,但該連接埠已被其他程序佔用。常見的衝突連接埠是 7890,也可能是 78919090,或設定中自訂的數值。

mixed-port 是混合代理連接埠,同一個監聽入口可以接收 HTTP 代理與 SOCKS5 代理連線。許多 Clash 客戶端預設使用 7890。瀏覽器擴充功能、系統代理與命令列工具通常都會連線到這個連接埠,因此發生衝突時,最直接的結果就是核心啟動失敗或代理無法連線。

設定欄位 常見連接埠 用途 能否與 mixed-port 重複
mixed-port 7890 同時接受 HTTP 與 SOCKS5 代理 只能由一個程序監聽
port 7890 僅提供 HTTP 代理 不能使用相同的監聽位址與連接埠
socks-port 7891 僅提供 SOCKS5 代理 不能使用相同的監聽位址與連接埠
external-controller 9090 提供控制介面,不承載一般代理流量 應使用獨立連接埠

從日誌擷取確切的連接埠

請先開啟客戶端的日誌頁面,搜尋 bindlistenaddress already in use連接埠。如果日誌出現 listen tcp 127.0.0.1:7890,需要排查的是 TCP 7890;如果出現 0.0.0.0:7890,表示程式準備在本機所有網路介面上監聽該連接埠,衝突範圍比只監聽 127.0.0.1 更大。

還要檢查同一份設定是否同時寫入 mixed-port: 7890port: 7890。這種情況不需要尋找外部程式,因為設定本身就要求兩個監聽器爭用同一個位址。保留混合連接埠,刪除不需要的獨立 HTTP 或 SOCKS 連接埠即可。

Windows 使用 netstat 找出佔用 7890 的程序

Windows 10 與 Windows 11 都可以使用系統內建的 netstat。先完全退出目前的 Clash 客戶端,再以系統管理員身分開啟「終端機」或「命令提示字元」,執行以下命令:

netstat -ano | findstr :7890

典型結果如下。最後一欄的 16420 是程序識別碼,也就是 PID:

TCP    127.0.0.1:7890    0.0.0.0:0    LISTENING    16420

只有狀態為 LISTENING 的記錄,才表示某個程式正在監聽該 TCP 連接埠。如果結果只是在遠端位址中包含 :7890,不能直接判定本機連接埠被佔用。應重點核對「本機位址」欄是否為 127.0.0.1:78900.0.0.0:7890[::]:7890

依 PID 查詢程式名稱

取得 PID 後繼續執行:

tasklist /FI "PID eq 16420"

也可以在 PowerShell 中查看程式路徑:

Get-Process -Id 16420
Get-CimInstance Win32_Process -Filter "ProcessId = 16420" |
  Select-Object ProcessId, Name, ExecutablePath, CommandLine

如果結果是另一個 Clash、Mihomo、sing-box 或代理客戶端,通常表示舊核心沒有隨介面一同退出。先從該客戶端的選單正常退出,再等待 3~5 秒重新查詢連接埠。在工作管理員中只關閉視窗,不一定會結束背景核心,系統匣仍可能保留執行圖示。

如果確認可以結束該程序,可在工作管理員的「詳細資料」頁面依 PID 定位,也可以執行:

taskkill /PID 16420 /F

netstat 沒有結果,卻仍然報錯

  • 確認日誌中的連接埠確實是 7890,不要把控制連接埠 9090 當成混合連接埠。
  • 同時檢查 IPv4 與 IPv6。監聽 [::]:7890 的程式可能會阻止另一個程序繫結 IPv4 位址。
  • 退出客戶端後重新執行命令,避免將目前客戶端自己的正常監聽誤判為衝突。
  • 檢查客戶端是否重複啟動了兩個核心實例,例如可攜版與安裝版同時設定為開機啟動。
  • 查看日誌是否實際顯示權限不足。權限錯誤與連接埠佔用的處理方式不同。

macOS 使用 lsof 找出監聽程式

macOS 可以使用 lsof 查看哪個程序開啟了 TCP 7890。開啟「終端機」,執行:

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

-nP 會直接顯示數字位址與連接埠,避免網域名稱解析影響速度。結果中的 COMMAND 是程序名稱,PID 是程序編號。例如:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mihomo   8421 user   10u  IPv4        0t0      TCP 127.0.0.1:7890 (LISTEN)

繼續使用以下命令檢查啟動參數,判斷它屬於哪個客戶端:

ps -p 8421 -o pid,ppid,user,command

如果程序來自另一個仍在執行的代理客戶端,應優先從選單列圖示正常退出。確認程序已失去回應後,先傳送一般終止訊號:

kill 8421

等待幾秒後再次執行 lsof。只有一般終止無效時,才考慮 kill -9 8421。強制結束可能讓客戶端來不及儲存目前設定,因此不應作為第一步。

同時排查獨立 SOCKS 連接埠

如果設定還啟用了 socks-port: 7891,應分別查詢 7890 與 7891。將混合連接埠改成 7892,並不能解決另一個獨立監聽器在 7891 上發生的衝突:

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

Linux 使用 ss 檢查連接埠監聽狀態

多數現代 Linux 發行版預設都提供 ss。它可以直接顯示監聽中的通訊端與對應程序。執行:

sudo ss -ltnp 'sport = :7890'

參數中的 l 表示只查看監聽狀態,t 表示 TCP,n 表示直接顯示數字連接埠,p 表示顯示程序。也可以使用更直觀的相容篩選方式:

sudo ss -ltnp | grep ':7890'

結果可能如下:

LISTEN 0 4096 127.0.0.1:7890 0.0.0.0:* users:(("mihomo",pid=2317,fd=8))

如果 Mihomo 由 systemd 管理,不要只使用 kill 結束程序,因為服務管理器可能會立即將它重新啟動。先查詢服務狀態,再停止對應的單元:

systemctl --type=service --state=running | grep -Ei 'mihomo|clash'
sudo systemctl status mihomo
sudo systemctl stop mihomo

在容器環境中還要檢查連接埠映射。主機上的 Docker 或 Podman 代理程序可能佔用 7890,即使容器內沒有名為 Mihomo 的主機程序:

docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Ports}}'
podman ps --format 'table {{.ID}}\t{{.Names}}\t{{.Ports}}'

修改 mixed-port 與客戶端監聽連接埠

如果佔用 7890 的程式必須保留,最穩妥的處理方式是替 Clash 或 Mihomo 更換未使用的連接埠,例如 7892。先使用前面的系統命令確認 7892 沒有監聽記錄,再修改客戶端。

從圖形介面修改

具備圖形介面的客戶端通常可以從「設定」→「參數設定」→「混合連接埠」進入。將 7890 改為 7892,儲存後重新啟動核心。不同客戶端的選單名稱可能寫成「Mixed Port」、「混合代理連接埠」或「連接埠設定」,但要修改的目標都是目前核心的 mixed-port

如果頁面同時列出 HTTP 連接埠、SOCKS 連接埠與混合連接埠,不要替多個項目填入相同數值。只需要單一入口時,可以啟用混合連接埠並關閉未使用的獨立監聽項目,以減少衝突來源。

直接編輯 YAML 設定

在設定檔中,將欄位改為:

mixed-port: 7892
allow-lan: false
mode: rule
log-level: info

mixed-port 必須是整數,不能寫成帶冒號的位址,也不能與同一份設定中的 portsocks-port 或控制介面重複。儲存後需要讓核心重新載入設定;只修改磁碟上的檔案,不會自動變更已在執行中的監聽器。

同時存在多個 Profile 時,要確認編輯的是目前啟用的設定。有些客戶端會將訂閱內容複製到應用程式資料夾,訂閱原始檔與執行時設定並不是同一個檔案。可以先在介面查看目前的 Profile 名稱,再從該設定的編輯入口進入,避免修改到未啟用的副本。

確認新連接埠已開始監聽

重新啟動核心後,不要馬上只確認網頁能否開啟。先確認系統確實出現新的監聽器,且舊連接埠不再由目前客戶端使用:

# Windows
netstat -ano | findstr :7892

# macOS
sudo lsof -nP -iTCP:7892 -sTCP:LISTEN

# Linux
sudo ss -ltnp 'sport = :7892'

預期結果是本機位址 127.0.0.1:7892 或客戶端明確設定的監聽位址處於 LISTEN 狀態。如果客戶端允許區域網路連線,可能會顯示 0.0.0.0:7892;此時還應檢查存取控制與防火牆規則,不要只為了解決本機衝突就擴大監聽範圍。

同步修改系統代理與應用程式代理

連接埠改好後網頁仍然無法開啟,最常見的原因是系統代理仍指向舊的 127.0.0.1:7890。核心已在 7892 正常執行,而瀏覽器仍繼續連線到 7890,結果看起來就像「修改沒有生效」。

優先讓客戶端重新設定系統代理

  1. 關閉客戶端中的「系統代理」開關。
  2. 確認混合連接埠已儲存為 7892,並重新啟動核心。
  3. 重新開啟「系統代理」。
  4. 進入作業系統的代理設定頁面,核對位址為 127.0.0.1、連接埠為 7892

Windows 11 可從「設定」→「網路和 Internet」→「代理」檢查手動代理伺服器。macOS 可從「系統設定」→「網路」→目前網路→「詳細資訊」→「代理」核對 Web 代理或安全 Web 代理。通常讓客戶端管理這些項目更穩妥,手動填寫時必須與實際監聽連接埠一致。

檢查瀏覽器擴充功能與命令列變數

代理切換擴充功能可能繞過系統設定,仍保留舊連接埠。需要在擴充功能的代理設定中,將 HTTP 或 SOCKS5 連接埠改為 7892。開發工具也可能透過環境變數指定代理,可分別檢查:

HTTP_PROXY=http://127.0.0.1:7892
HTTPS_PROXY=http://127.0.0.1:7892
ALL_PROXY=socks5://127.0.0.1:7892

同一個 mixed-port 可以接收上述兩種協定,但應用程式填寫的協定前綴仍必須正確。如果設定的是獨立的 socks-port,則 ALL_PROXY 應指向該獨立連接埠,而不是直接照抄混合連接埠。

TUN 模式的差異

TUN 模式會透過虛擬網路介面接管流量,正常情況下不依賴系統 HTTP 代理開關。不過,只要設定仍要求 Mihomo 建立 mixed-port: 7890,7890 被佔用仍可能導致核心啟動失敗。解決方式仍是關閉衝突程序或修改監聽連接埠。

排查時建議暫時只保留一種流量接管方式:要麼關閉 TUN,使用系統代理驗證 7892;要麼關閉系統代理,只驗證 TUN。同時啟用兩種方式會增加變數,容易將 DNS、路由或瀏覽器擴充功能問題誤判為連接埠衝突。

修改後仍顯示佔用的檢查順序

如果連接埠已換成 7892,但日誌仍顯示 7890 被佔用,表示執行時設定沒有套用剛才的修改。依照以下順序檢查,可以快速判斷問題出在設定、程序還是系統代理未同步。

  1. 重新讀取最新日誌。確認錯誤時間是在這次重新啟動之後,並記下日誌中的完整位址與連接埠。
  2. 確認目前的 Profile。檢查客戶端目前選取的設定名稱,避免編輯測試設定後,實際執行的仍是訂閱設定。
  3. 執行設定重新載入。儲存 YAML 後使用客戶端的「重新載入設定」或「重新啟動核心」,不要只關閉設定視窗。
  4. 排查重複的客戶端。檢查系統匣、選單列、開機啟動項目、systemd 服務與容器,確認沒有第二個核心實例。
  5. 檢查欄位重複。確認 mixed-portportsocks-portexternal-controller 沒有使用相同的位址與連接埠。
  6. 確認新連接埠正在監聽。使用 netstat、lsof 或 ss 驗證 7892,不要只看客戶端介面顯示「執行中」。
  7. 同步所有代理入口。更新系統代理、瀏覽器擴充功能、終端機環境變數、開發工具與區域網路裝置中的舊連接埠。

使用 curl 進行最後驗證

確認 7892 正常監聽後,可以讓 curl 明確透過混合連接埠發出請求。以下命令會顯示連線過程與 HTTP 回應標頭:

curl -I -v -x http://127.0.0.1:7892 https://example.com

輸出中應先出現連線 127.0.0.1:7892,接著建立到目標網站的 CONNECT 通道。如果顯示 Connection refused,表示該位址上沒有可用的監聽器;如果連線成功但目標請求逾時,表示連接埠衝突已解決,下一步應檢查節點、規則、DNS 或網路連通性。

可重複套用的處理結論

  • 日誌顯示 address already in use:先查詢監聽程序,不要先更換節點。
  • 舊代理程式佔用 7890:退出舊程式並清理重複的自動啟動設定。
  • 佔用程式必須保留:將 mixed-port 改為已確認閒置的連接埠,例如 7892。
  • 核心已監聽新連接埠,但應用程式無法上網:同步修改系統代理與應用程式內的代理設定。
  • 訂閱更新後問題再次出現:將連接埠調整放入客戶端的持久化覆寫設定。
  • TUN 已啟用但仍然啟動失敗:繼續檢查設定中的混合連接埠與控制連接埠是否衝突。
取得客戶端 查看全平台選擇