為什麼「系統代理已開啟」不等於「所有流量都走代理」

Clash 用戶端的「系統代理」開關,本質是修改作業系統或桌面環境的代理設定項(Windows 的 WinINet 設定、macOS 的網路服務代理、Linux 的 GSettings 或環境變數)。這類設定只對主動讀取系統代理設定的程式生效,常見的是瀏覽器、部分 GUI 應用程式。它不是網路層的強制轉發,程式可以選擇忽略這個設定——這正是很多人遇到「代理明明開著,某個程式卻不走代理」的根本原因。

命令列工具(curl、wget、git、套件管理器等)大多不讀取系統代理設定,而是讀取環境變數(http_proxyhttps_proxyall_proxy)。這意味著系統代理開啟與終端能否走代理是兩件獨立的事,分別需要不同的排查思路。

如果需要不區分程式、統一按流量強制代理,唯一可靠的方式是 TUN 模式——它在網路介面層接管流量,不依賴應用程式是否主動讀取代理設定。本文後面會具體說明系統代理與 TUN 模式的取捨。

i

排查前先確認一件事:Clash 本身有沒有正常運作、有沒有可用節點。如果核心未啟動或訂閱節點全部失效,系統代理設定再正確也無法建立連線。這類問題建議先看運作日誌確認代理連接埠是否監聽正常。

瀏覽器不走代理的排查步驟

瀏覽器不走代理通常分為四類原因:代理開關未生效、瀏覽器有獨立代理設定、擴充功能或安全軟體攔截、DNS 未走代理導致的部分洩漏。按以下順序逐條排查。

第一步:確認系統代理開關狀態

打開 Clash 用戶端設定頁,確認「系統代理」處於開啟狀態,並核對監聽連接埠(通常是 HTTP/Mixed 連接埠,預設 7890 左右)。部分用戶端在切換設定檔後會重設該開關,升級或重新開機後也可能被系統恢復為關閉。

第二步:排除瀏覽器本身的獨立代理設定

部分瀏覽器(尤其是 Firefox)預設不跟隨系統代理,而是使用自己的連線設定。如果 Firefox 裡手動設定過代理或選擇了「不使用代理」,即使系統代理正常也不會生效。檢查路徑:

第三步:檢查擴充功能與安全軟體的攔截

廣告攔截類擴充功能、企業安全用戶端、部分 VPN 用戶端可能會強制修改網路請求路徑或劫持代理設定。可以先在瀏覽器的隱私/無痕模式下(預設停用擴充功能)測試是否恢復正常,如果恢復正常則說明問題出在某個擴充功能上,逐一停用排查即可定位。

第四步:確認 DNS 請求是否也走了代理

瀏覽器「能連上但很慢」或「部分網站正常、部分網站異常」,很多時候是 DNS 洩漏導致的——網頁資料走了代理,但域名解析走的是本機 DNS,被電信業者或本地網路提前干擾。這種情況不算嚴格意義上的「代理不生效」,但表現類似,建議同時檢查規則模式是否開啟了 DNS 劫持或 fake-ip 模式。

!

如果只想驗證代理鏈路本身是否通暢,建議直接存取 IP 查詢類頁面觀察出口 IP 是否變化,而不是先測試某個具體網站——具體網站異常可能是規則分流把它劃到了直連組,並不代表代理整體失效。

命令列終端不走代理的排查步驟

終端工具是否走代理,取決於該工具是否讀取代理環境變數,以及變數是否正確設定並被目前工作階段繼承。排查順序如下。

第一步:確認環境變數是否已設定

在 macOS / Linux 終端執行:

echo $http_proxy
echo $https_proxy
echo $all_proxy

如果輸出為空,說明目前工作階段沒有代理環境變數,終端命令自然不會走代理。手動設定範例(連接埠需替換為用戶端實際監聽連接埠):

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"

第二步:確認變數寫入了正確的設定檔

臨時用 export 設定的變數只在目前終端工作階段有效,新開的終端視窗不會繼承。如果需要長期生效,應寫入 shell 的啟動設定檔,例如 ~/.zshrc~/.bashrc~/.bash_profile(具體取決於使用的 shell 和系統),修改後需要執行 source ~/.zshrc 或重新開啟終端才能生效。

第三步:確認工具本身是否讀取這些變數

不同工具遵循的規則不完全一致:

第四步:用最小化命令驗證代理鏈路

排除工具本身邏輯干擾,直接用 curl 測試代理連接埠是否真的可用:

curl -x http://127.0.0.1:7890 -I https://www.example.com

如果這條命令能正常回傳回應標頭,說明代理連接埠本身運作正常,問題出在具體工具沒有正確讀取到代理設定;如果連這條命令都逾時或報錯,說明問題在 Clash 用戶端或節點本身,應回到用戶端檢查節點連通性與監聽連接埠。

建議把「用 curl 加 -x 參數手動指定代理測試」作為終端類問題的第一步驗證動作——它能快速把問題範圍縮小到「代理連接埠」還是「具體工具設定」兩者之一,避免在工具自身的複雜設定項裡繞圈子。

系統代理開關與 TUN 模式該怎麼選

系統代理和 TUN 模式是兩種覆蓋範圍完全不同的機制,選擇前建議先明確自己的需求場景。

系統代理開關的特點

系統代理只修改作業系統或瀏覽器讀取的代理設定項,優點是開銷小、切換靈活、對系統網路堆疊沒有侵入性;缺點是覆蓋不完整——任何不主動讀取系統代理設定的程式(部分命令列工具、遊戲、某些後台服務)都不會被代理覆蓋,需要額外手動設定環境變數或應用程式內代理選項。

TUN 模式的特點

TUN 模式會在系統中建立一個虛擬網路介面,由 Clash 核心接管經過該介面的全部流量,不區分應用程式是否主動設定代理。這意味著命令列工具、後台服務、遊戲等原本「不走系統代理」的流量也會被統一處理,更接近全域代理的效果。代價是設定項更複雜(通常需要額外開啟程式模式、處理路由表或防火牆規則),部分系統需要管理員/root 權限才能建立虛擬網卡。

兩種方式的取捨建議

i

如果開啟 TUN 模式後仍有部分流量繞過代理,通常是路由表或防火牆規則衝突導致,可先臨時關閉其他 VPN、網路加速類工具後重新測試,排除多個網路接管工具互相衝突的可能。

常見誤判場景與排查心態

系統代理相關問題裡,有幾類現象經常被誤判為「代理不生效」,實際原因並不在代理設定本身:

整體的排查思路可以概括為:先確認 Clash 本身運作正常且節點可用,再確認系統代理開關或環境變數設定正確,最後確認具體應用程式是否遵循這些設定。按這個順序逐層驗證,能避免在錯誤的層級裡反覆調整而找不到問題根源。