Clash TUN 模式與系統代理的運作原理對比

系統代理只接管遵循代理設定的應用程式流量,TUN 模式則透過虛擬網路卡在網路層接管全部流量。兩者的差異決定了命令列工具、遊戲和背景服務能否被正確代理,選錯模式是很多「連上了卻沒生效」問題的根源。

系統代理的運作方式:應用程式主動讀取設定

系統代理(System Proxy)是作業系統提供的一套標準介面,Windows 的「網路和網際網路-代理伺服器」、macOS 的「系統設定-網路-代理伺服器」都屬於這一層。當 Clash 用戶端開啟系統代理後,實際發生的動作是把系統的 HTTP/HTTPS 代理位址寫成本機的 127.0.0.1:7890(連接埠以實際設定為準),並寫入登錄檔或系統設定檔。

關鍵在於,這只是一份「建議設定」,能不能生效完全取決於應用程式自己有沒有去讀取這份設定。瀏覽器、大多數圖形介面軟體都會主動檢查系統代理設定並遵循,所以瀏覽網頁時代理立刻生效。但相當一部分程式並不遵循系統代理,包括:

  • 不基於系統網路庫、自行實作網路堆疊的命令列工具,例如部分用 Go 靜態編譯的 CLI 程式。
  • 遊戲用戶端,尤其是使用 UDP 協定做即時同步的遊戲,很多遊戲引擎不走系統代理介面。
  • 背景更新服務、驅動程式、系統層級元件,這些程序往往在更高權限或獨立的網路環境中執行。
  • 部分 Electron 應用程式如果沒有明確讀取代理環境變數,也可能繞過系統代理。

換句話說,系統代理是「應用層的君子協定」,Clash 把位址寫好,剩下的執行權在應用程式手上。這也是為什麼很多人反映「用戶端顯示已連線,瀏覽器能上網,但某個軟體還是連不上」,本質上是那個軟體沒有走系統代理。

提示:在命令列環境下想讓不遵循系統代理的工具走代理,通常需要手動設定 HTTP_PROXYHTTPS_PROXY 環境變數,這也是系統代理模式下常見的補救辦法,但只對讀取這兩個環境變數的程式有效。

TUN 模式的運作方式:虛擬網路卡接管網路層

TUN 模式(在 Clash Meta / mihomo 核心中也稱 Tun Mode)走的是完全不同的路徑。開啟後,用戶端會在系統裡建立一塊虛擬網路介面(虛擬網路卡),並透過修改本機路由表,把流量在網路層(IP 層)就導向這塊虛擬網路卡,再由 Clash 核心接收、解析、依規則轉發。

因為攔截發生在路由層而不是應用層,所以流量是否被代理不再取決於某個程式有沒有實作代理協定支援,只要這個程序會產生 IP 封包並交給系統網路堆疊,就會被虛擬網路卡截獲。這意味著:

  • 不認得系統代理設定的 CLI 工具,能被 TUN 模式覆蓋。
  • 大多數遊戲的 UDP 流量,能被 TUN 模式覆蓋(具體效果仍與遊戲使用的傳輸方式、是否走 IPv6 有關)。
  • 系統背景服務、非瀏覽器程序發出的請求,同樣會經過虛擬網路卡。

可以把系統代理理解成「在門口貼一張告示,進來的人自願配合安檢」;TUN 模式則是「把門口改成必經的安檢通道,出入的人都會被掃一遍」。前者依賴對方配合,後者不依賴。

TUN 模式常見的設定項

在 mihomo 核心的設定檔裡,TUN 模式的核心欄位大致如下(以 YAML 片段示意,具體欄位名以所用用戶端的實際設定結構為準):

tun:
  enable: true
  stack: system     # 或 gvisor / mixed,決定虛擬網路卡的實作方式
  dns-hijack:
    - any:53
  auto-route: true   # 自動接管系統路由表
  auto-detect-interface: true

auto-route 決定是否自動修改路由表,dns-hijack 決定是否把 DNS 查詢也一併劫持到 Clash 內部解析,這與 fake-ip 之類的 DNS 處理機制配合使用,可以避免部分應用程式繞過代理直接發出 DNS 請求。

兩種模式的差異對照

把關鍵差異整理成表格,方便直接比較。

比較項目 系統代理 TUN 模式
攔截層級 應用層,依賴程式主動讀取代理設定 網路層,透過虛擬網路卡與路由表強制接管
覆蓋範圍 僅覆蓋遵循系統代理的應用程式(多數瀏覽器、部分 GUI 軟體) 覆蓋幾乎所有產生網路流量的程序,包括 CLI 工具和遊戲
權限要求 一般無需管理員/root 權限 建立虛擬網路卡、修改路由表通常需要管理員或 root 權限
UDP 流量 依賴應用程式本身是否支援透過代理轉發 UDP 可直接在網路層轉發 UDP,相容性更好
典型問題 命令列工具、遊戲、背景服務繞過代理 路由衝突、部分安全軟體攔截虛擬網路卡驅動
關閉後的清理 清空系統代理設定即可,幾乎無殘留 需要正常關閉以還原路由表,異常退出可能導致斷網需手動修復

命令列工具和遊戲該怎麼選

結合上面的原理差異,可以給出一個相對明確的判斷路徑。

命令列工具情境

如果日常使用的是終端機裡的套件管理工具、版本控制工具、腳本請求函式庫,先檢查它是否支援讀取 HTTP_PROXY / HTTPS_PROXY 環境變數。若支援,開啟系統代理並配合設定環境變數通常已經足夠,不需要額外開啟 TUN 模式。只有當工具明確不支援代理環境變數、且又需要連網時,才考慮開啟 TUN 模式作為備援方案。

# 在目前終端機工作階段中暫時設定代理環境變數(範例連接埠以實際設定為準)
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890

遊戲情境

遊戲用戶端大多不會讀取系統代理設定,尤其是使用自訂網路協定或 UDP 直連伺服器的遊戲。這類情境下系統代理基本無效,需要依賴 TUN 模式在網路層強制接管。開啟 TUN 模式後,建議在用戶端的規則裡為遊戲對應的網域或 IP 段單獨設定策略組,避免遊戲流量與其他流量走同一條節點造成延遲波動。

注意:部分對戰類遊戲的反作弊機制會偵測虛擬網路卡或路由異常,開啟 TUN 模式前建議先確認該遊戲的反作弊規則是否允許使用虛擬網路卡類工具,避免引發誤判。

日常瀏覽與辦公情境

如果主要需求只是瀏覽器上網、看影片、用少數幾個遵循系統代理的桌面應用程式,系統代理模式已經足夠,沒有必要額外開啟 TUN 模式。TUN 模式雖然覆蓋面更廣,但需要更高權限、對路由表的變動也更徹底,出現異常時排查成本更高,屬於「功能更強但也更重」的方案,按需開啟即可。

切換模式時的常見問題

開啟 TUN 模式後完全無法上網

多數情況是權限不足導致虛擬網路卡建立失敗,或路由表被其他網路工具(如某些 VPN 用戶端)同時占用產生衝突。可以先關閉其他同樣會修改路由表的網路工具,用管理員/root 權限重新啟動 Clash 用戶端。

開啟 TUN 模式後部分網站存取異常

通常與 DNS 劫持和分流規則有關,檢查 dns-hijack 設定以及規則中是否有需要直連的網域被錯誤路由到了代理節點。

系統代理開著但某個軟體依舊直連

這屬於本文開頭解釋的正常現象,該軟體沒有讀取系統代理設定。解決辦法是為它單獨設定代理環境變數,或者直接切換到 TUN 模式。

兩種模式能否同時開啟

技術上可以同時開啟,但意義不大,因為 TUN 模式已經在網路層接管了絕大部分流量,系統代理的作用會被覆蓋或產生冗餘判斷,一般建議依情境二選一,減少排查時的變數。

下載用戶端體驗兩種模式

Clash Verge、mihomo party 等主流用戶端均內建系統代理與 TUN 模式切換入口,配合規則分流可以依情境靈活選擇接管方式。

下載用戶端