TUN 與系統代理:流量接管入口不同

Clash TUN 模式會透過虛擬網路介面接收 IP 封包,再交由核心解析、比對規則並建立對外連線。系統代理則提供 HTTP 或 SOCKS 代理入口,必須由應用程式主動遵循代理設定。因此,若瀏覽器能連網,但命令列工具、遊戲或部分桌面軟體沒有經過代理,問題可能出在流量接管入口,而非節點本身。

本文設定適用於 Clash Meta 後續發展而來的 mihomo 核心。客戶端名稱含有 Clash,不代表使用相同核心;舊版 Clash、舊版 Premium 與 mihomo 的設定功能也不能直接畫上等號。開始前請先在客戶端的核心資訊或啟動記錄中確認目前執行的是 mihomo,並以該核心支援的設定欄位為準。

檢查項目系統代理TUN 模式
接管位置應用程式的代理介面系統路由與虛擬網路介面
應用程式需求必須遵循系統代理設定或個別設定進入對應路由的流量可由 TUN 接管
UDP 流量一般 HTTP 系統代理無法全面接管可接管,但代理的對外連線仍須支援 UDP
權限需求通常不需要建立網卡的權限通常需要管理員權限、特權服務或網路能力授權
分流依據由核心規則決定仍由核心規則決定

啟用前檢查:節點、權限與設定保存

  1. 確認基本連線正常。先使用系統代理開啟已知可連線的網站,確認訂閱已匯入,且策略群組中有可用節點。TUN 無法修復過期訂閱、節點驗證失敗或伺服器離線等問題。
  2. 備份目前生效的設定。記下目前模式、DNS 設定和既有路由。客戶端可能會根據訂閱內容產生執行設定,直接修改產生的檔案可能在更新後遺失;請使用客戶端提供的覆寫、合併或持久化設定功能。
  3. 暫停其他流量接管工具。先關閉其他 VPN、網路加速器和虛擬網卡代理,降低預設路由、DNS 與防火牆規則衝突的機會。排查完成後再逐一恢復。
  4. 保留本機操作管道。遠端桌面或 SSH 連線可能因路由變更而中斷。首次啟用時請在裝置本機操作,不要透過唯一的遠端連線直接修改路由。

選單名稱會因客戶端而異,請確認以下三項實際狀態:特權服務可正常使用、TUN 開關已啟用,且執行設定中有正確的 tun 區段。介面上的開關亮起,不代表虛擬網卡已成功建立。

mihomo TUN 設定:stack、路由與 DNS

以下範例可合併至現有 mihomo 設定,並非包含節點與策略群組的完整訂閱。範例保留既有代理與規則,只示範流量接管入口和 DNS。若頂層已存在 dns 或 tun,請合併欄位,不要重複宣告同名鍵。

mode: rule

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53
    - tcp://any:53

dns:
  enable: true
  listen: 127.0.0.1:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://1.1.1.1/dns-query

stack:先使用 mixed,再依問題切換

mihomo 提供 system、gvisor、mixed 等 TUN 協定堆疊選項。mixed 會將 TCP 交給 system 堆疊、UDP 交給 gVisor 堆疊,是明確的起始選擇。不同系統與核心建置版本的相容性可能不同;若遇到連線異常,每次只切換一種堆疊,並以同一個目標重新測試,不要同時更換節點、DNS 和路由。

切換堆疊不會改變節點的傳輸能力。即使本機成功接管 UDP,若選用的代理協定或伺服器不支援 UDP 轉送,遊戲語音、QUIC 等連線仍可能失敗。此時應檢查對外連線能力,而不是反覆安裝虛擬網卡。

auto-route:設定路由,不會變更分流規則

auto-route: true 會讓核心自動設定通往 TUN 的路由。auto-detect-interface: true 用來自動識別對外網路介面,避免代理伺服器的連線再次進入 TUN 而形成迴圈。在有線、無線與虛擬網卡並存的裝置上,自動識別可能受既有路由影響;若需手動指定對外介面,請先確認實際介面名稱,再依目前核心支援的設定方式指定。

dns-hijack:接收傳統 DNS,不代表能接管加密 DNS

any:53 會比對進入 TUN 的 UDP 53 請求,tcp://any:53 則對應 TCP 53。這些設定會將符合條件的流量交由核心 DNS 處理,但無法自動將瀏覽器內建的 DoH 或應用程式自建的 DoT 還原為一般 DNS。測試期間可暫時關閉瀏覽器的「安全 DNS」,先確認系統的 DNS 解析流程。

範例中的 127.0.0.1:1053 是本機 DNS 監聽位址,不是系統代理連接埠,也不需要將網卡 DNS 設為含連接埠的位址。TUN 劫持和本機監聽是不同的入口。fake-ip 會回傳供核心映射使用的虛擬位址;解析結果落在 198.18.0.0/16 範圍內,不代表發生故障。

Windows:先確認服務權限,再檢查虛擬網卡

  1. 先退出其他 VPN。前往「設定」→「網路和網際網路」→「Proxy」,記下原有的手動 Proxy 設定,避免測試時混淆兩種流量接管入口。
  2. 在客戶端中安裝或啟用其提供的服務模式,並依 Windows 使用者帳戶控制提示授權。若客戶端沒有服務模式,可依其說明暫時以系統管理員身分執行,確認問題是否與權限有關。
  3. 啟用 TUN 並維持規則模式,查看記錄中是否出現建立介面或設定路由失敗的訊息。請勿從不明來源另行下載網卡驅動程式,以取代客戶端附帶的元件。
  4. 在客戶端中關閉系統代理,再執行下方命令查看介面與路由,並測試實際連線。測試完成後,可視需要恢復系統代理。
Get-NetAdapter -IncludeHidden |
  Format-Table Name, InterfaceDescription, Status

Get-NetRoute -AddressFamily IPv4 |
  Sort-Object RouteMetric |
  Format-Table DestinationPrefix, InterfaceAlias, NextHop, RouteMetric

Resolve-DnsName example.com
curl.exe --noproxy "*" -I https://example.com

請在 PowerShell 中執行上述命令。--noproxy "*" 會讓 curl 忽略應用程式層的代理設定,但不會繞過系統路由,因此適合用來輔助檢查 TUN。網卡名稱視客戶端設定而異,不應只憑是否出現特定名稱判斷。也請確認核心連線記錄中有這次連線。

若記錄顯示存取遭拒,請先處理服務權限;若介面存在,但沒有請求進入核心,請再檢查路由、其他 VPN 及安全軟體的封鎖記錄。不要將關閉整個防火牆當成長期解決方案。

macOS:授權輔助服務,辨識 utun 介面

macOS 建立 TUN 介面及調整路由需要相應權限。桌面客戶端通常透過特權輔助服務完成;請依應用程式提示安裝或授權,並在系統要求時前往「系統設定」→「隱私權與安全性」確認。不同散布方式使用的授權機制各異,不要因為系統中沒有某個固定開關,就判定安裝失敗。

  1. 先使用一般代理模式確認節點可用,再啟用客戶端提供的特權輔助服務與 TUN。
  2. 若要單獨驗證 TUN,可前往「系統設定」→「網路」→目前的網路連線→「詳細資訊」→「代理伺服器」,檢查 HTTP、HTTPS 和 SOCKS 代理狀態。
  3. 使用終端機查看介面、路由與 DNS,再透過核心連線記錄確認測試請求命中的規則及對外連線。
ifconfig
netstat -rn -f inet
scutil --dns
curl --noproxy '*' -I https://example.com

utun 介面也可能由系統功能或其他 VPN 建立,只看介面數量無法判斷 Clash TUN 是否正常運作。請比對啟用前後的路由變化與記錄時間。macOS 可依介面和網域指派解析器;排查系統 DNS 狀態時,scutil --dns 比單獨查看 /etc/resolv.conf 更合適。

Linux:檢查 /dev/net/tun 與服務身分

Linux 需要可用的 TUN 裝置,以及建立介面、修改路由所需的權限。通常會涉及 CAP_NET_ADMIN,實際要求也會受核心功能、服務沙箱與執行環境影響。桌面客戶端可透過配套服務執行這些操作;直接執行 mihomo 時,請使用已審核的服務設定,不要任意授權來源不明的執行檔。

ls -l /dev/net/tun
ip -br link
ip route show table all
ip rule show
resolvectl status

resolvectl 適用於使用 systemd-resolved 的系統;其他 Linux 發行版請檢查實際使用的解析服務。若已安裝名為 mihomo.service 的 systemd 單元,可使用以下命令查看服務狀態和本次啟動記錄;若單元名稱不同,請以安裝時使用的名稱為準。

systemctl status mihomo.service
journalctl -u mihomo.service -b --no-pager -n 100

檢查路由時,不要只查看主要路由表。自動路由可能搭配策略路由運作,因此還需查看 ip rule show 和所有路由表。容器中的 root 不等於擁有主機的完整權限;容器還必須正確掛載 TUN 裝置並設定所需能力,不應以直接啟用特權容器取代權限檢查。

驗證步驟:分別確認流量接管、規則與出口

  1. 確認流量已接管。關閉系統代理,執行前述 curl 請求並查看核心連線記錄。若能看到目標網域或目標 IP,代表請求已進入核心;只確認網頁能開啟還不足以判斷。
  2. 確認分流規則。分別連線至預期直連和預期代理的服務,記錄符合的規則、策略群組與最終節點。TUN 正常運作但命中 DIRECT,屬於分流結果,不是接管失敗。
  3. 確認 DNS。先測試系統解析,再執行 DNS 洩漏檢測。檢測網站顯示的是遞迴解析的出口,不一定與代理出口 IP 相同;應確認結果是否符合預先設定的 DNS 路徑。
  4. 確認 IPv6。若系統已啟用 IPv6,請分別檢查 IPv4 與 IPv6 的連線結果及核心記錄。只驗證 IPv4,不能代表雙協定堆疊的流量都已接管。
  5. 確認 UDP。使用實際需要的遊戲、語音或支援 HTTP/3 的應用程式重新測試,並確認節點具備 UDP 傳輸能力。一般網頁的 TCP 請求成功,不代表 UDP 運作正常。

建議記錄「啟用前、啟用後、關閉後」三組結果,包括系統代理狀態、命中規則、DNS 上游和錯誤記錄。延遲會受節點、目標網站、網路路徑和快取影響,不能只憑一次測速結果推斷 TUN 比系統代理更快。

常見故障排查與安全復原

現象優先檢查項目處理方式
啟用後立刻無法連網介面權限、路由迴圈、上游 DNS 可連性關閉 TUN 以恢復網路,再逐項查看啟動記錄
網域連線失敗,但 IP 可連線核心 DNS、53 連接埠劫持、應用程式加密 DNS單獨驗證 DNS 解析流程,避免同時更換節點
瀏覽器正常,遊戲異常UDP 對外連線、節點能力、目標規則確認 UDP 連線記錄及伺服器支援情況
無法連線區域網路裝置私人網路路由、目標位址、網域映射依實際網段設定路由排除或直連規則
切換 Wi-Fi 後連線異常對外介面識別、舊路由、網路變更記錄網路穩定後重新啟動核心並檢查路由

區域網路直連與排除流量接管是兩回事

將某個私人網路位址比對至 DIRECT,只代表流量進入核心後直接連線;將該網段排除於 TUN 路由之外,則代表流量不經過核心。兩種做法的記錄可見度與 DNS 行為不同。印表機、NAS 或公司內網連線異常時,請先確認目標的實際位址與網段,不要為了解決單一裝置的問題,就排除整個來源不明的位址範圍。

關閉後的復原順序

先關閉 TUN,等待客戶端移除介面和路由,再恢復原本的系統代理與 DNS 設定。若仍無法連網,請正常結束客戶端,並檢查殘留的代理、路由和其他 VPN 狀態;不要直接清空所有路由表。若更換 DNS 或 fake-ip 設定後仍連到舊位址,確認設定無誤後,可清除系統 DNS 快取並重新啟動相關應用程式。

最後請保留一份已驗證可正常運作的設定,明確記錄核心類型、TUN 堆疊、DNS 上游、對外介面選擇及必要的區域網路例外。後續更新訂閱時,只應變更預期內容;每次修改流量接管或 DNS 設定後,都依相同順序重新測試,才能分辨是設定、節點還是系統網路發生問題。