先做三分鐘基礎確認
很多「系統代理不生效」的狀況,其實卡在最基礎的一層。動手改任何設定之前,先依序把下面四項確認一遍,大多能直接找出問題所在。
- 確認用戶端確實在執行。系統列能看到圖示、主畫面能正常開啟,而不是縮到背景後已經悄悄退出。
- 確認節點可用。在代理頁對目前節點做一次延遲測試,超時或延遲異常的節點先換掉。系統代理只是入口,節點不通,入口設對了也沒用。
- 確認系統代理真的寫進了系統。用戶端裡開關顯示「已開啟」還不夠,要到作業系統裡看實際數值:Windows 在「設定 → 網路和網際網路 → 代理伺服器」裡看「使用 Proxy 伺服器」;macOS 在「系統設定 → 網路 → 詳細資訊 → 代理伺服器」裡看網頁代理伺服器與安全網頁代理伺服器;Linux(GNOME)在「設定 → 網路 → 網路代理」裡看是否為手動模式。位址應為 127.0.0.1,埠號要與用戶端一致。
- 確認埠號對得上。用戶端設定頁顯示的埠號必須與系統裡寫入的埠號相同。改過埠號卻忘了重新切換開關,是常見的踩雷點。
埠號以用戶端設定頁為準
Clash 系用戶端的預設 mixed 埠號多為 7890,但部分用戶端把預設值改成了 7897 等埠號。排查前先在設定頁確認實際監聽埠號,下文指令裡的 7890 都要換成自己的埠號。
系統代理開關到底做了什麼
理解原理能省掉一半瞎試。這個開關只做一件事:把「127.0.0.1 + 用戶端監聽埠號」寫進作業系統的代理設定。之後,凡是遵循系統代理的應用程式——絕大多數瀏覽器與桌面軟體——發起連線時會先把流量交給 Clash 核心,由核心依規則分流;不讀系統代理的應用程式則完全不受影響,命令列工具就是最典型的一類。
因此「開關開了沒效果」只可能出在三個地方:
- 寫入失敗:系統裡根本沒有這條設定,常見於權限不足、被安全軟體攔截、被另一個代理軟體搶占。
- 應用程式不讀:應用程式使用自己的代理設定,或根本不看系統代理。
- 入口不通:設定寫對了,但 Clash 的埠號沒在監聽,或目前節點不可用。
第一、三種在上一節的基礎確認裡就能排除。剩下的,按瀏覽器與終端兩條線分別處理。
瀏覽器路線:先查擴充功能與獨立設定
先用一條指令確認 Clash 入口本身是通的。開啟終端機,明確指定代理存取 IP 查詢介面:
curl -x http://127.0.0.1:7890 https://api.ip.sb
回傳的應該是節點出口 IP。這一步就失敗,說明問題出在用戶端或節點,與瀏覽器無關,回到第一節處理;這一步正常但瀏覽器不生效,再依下面順序查:
- 停用代理類擴充功能。SwitchyOmega 一類的擴充功能會接管瀏覽器代理,優先權高於系統設定。先全部停用再測,確認恢復後逐一啟用,找出是哪一個在搶。
- 用隱私瀏覽視窗對照。隱私瀏覽模式預設不載入擴充功能,若隱私瀏覽視窗正常、一般視窗不正常,基本可以判定是擴充功能在搶代理。
- 檢查 Firefox 的獨立設定。Firefox 的代理設定獨立於系統面板,若之前手動改過,到「設定 → 網路設定」裡確認選回「使用系統代理設定」。
- 清掉殘留的自動設定腳本。系統代理裡若留著「使用自動代理設定(PAC)」位址,瀏覽器會照腳本走而不是走 Clash,把該項關閉。
- 用出口 IP 做最終對照。開啟 IP 查詢網站,切換節點後重新整理,出口 IP 跟著變,表示連線已通;個別網站仍打不開,那是規則或節點的問題,已經不是系統代理的問題。
終端路線:命令列不讀系統代理
這是最常見的誤會:終端機以及裡面的 curl、git、npm 預設完全不讀系統代理,開關開再久它們照樣直連。終端機要走代理,得另外設定環境變數。
macOS / Linux(bash、zsh):
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890
Windows PowerShell:
$env:http_proxy="http://127.0.0.1:7890"
$env:https_proxy="http://127.0.0.1:7890"
Windows cmd:
set http_proxy=http://127.0.0.1:7890
set https_proxy=http://127.0.0.1:7890
設定完執行 curl https://api.ip.sb 驗證,回傳節點 IP 即生效。還有幾個細節值得記住:
- 環境變數只對目前視窗生效,關閉視窗即失效;想長期生效,寫進 shell 設定檔(如 ~/.zshrc)。
- 只想讓單條指令走代理,在 macOS / Linux 下可以臨時加前綴:
https_proxy=http://127.0.0.1:7890 curl https://api.ip.sb。 - 存取本機與內網位址應繞過代理:
export no_proxy=localhost,127.0.0.1。 - 取消終端代理:macOS / Linux 執行
unset http_proxy https_proxy all_proxy;PowerShell 把對應變數重新設為空即可。 - git 走自己的設定,部分環境下不看環境變數:
git config --global http.proxy http://127.0.0.1:7890;取消用git config --global --unset http.proxy。注意這只影響 HTTP(S)遠端,SSH 遠端不受影響。
埠號衝突:監聽失敗時開關形同虛設
埠號被其他程式占用時,Clash 的埠號監聽會失敗——開關照常能開、系統設定照常寫入,但入口後面沒有服務在接流量,表現就是「開了跟沒開一樣」。
先查埠號被誰占用。Windows(PowerShell 或 cmd):
```bash
netstat -ano | findstr :7890
```
有輸出說明埠號已被占用,最後一欄是占用行程的 PID,再用 `tasklist | findstr 改完埠號必須重新切換開關 系統代理寫入的是「改之前」的埠號。只改設定不重新切換開關,系統仍指向舊埠號,問題依舊。 埠號正常卻仍不生效,往下查這三類常見原因: 還有一個反向問題值得知道:退出用戶端前沒關系統代理,系統裡會一直留著 127.0.0.1:7890 這條設定,而本機已經沒有服務在監聽,表現為「關了 Clash 反而斷網」。解法是重新開啟用戶端把開關關一次,或手動到系統代理設定裡把它關掉。 企業或校園裝置若被群組原則、設定描述檔鎖定代理設定,手動寫入會被立即改回。這種環境不必再折騰系統代理,直接走終端環境變數,或看下一節的 TUN 模式。 系統代理天生的短板是「依賴應用程式配合」:應用程式不讀系統設定,開關就管不到它。日常要在終端機裡跑 git、npm、docker 的用戶,更省心的方案是 TUN 模式——它建立一張虛擬網卡,在系統網路層接管全域流量,不挑應用程式,命令列工具無需任何設定就會自動走代理。 以 mihomo 核心為基礎的用戶端(Clash Verge Rev、Clash Nyanpasu、FlClash 等)都在設定頁提供 TUN 開關;Windows 與 macOS 上首次開啟通常需要安裝服務模式或完成一次管理員授權。TUN 與系統代理可以同時開,兩者不衝突,TUN 在路由層接管,系統代理管應用層,各走各的。 排查陷入僵局時,依這份清單從頭過一遍: 絕大多數「系統代理不生效」到第三步就能分出方向:入口通,查應用程式;入口不通,查用戶端與埠號。按線排查,比重裝用戶端快得多。權限、殘留與多用戶端互搶
終端工具多,直接換 TUN 模式
一頁複查清單