啟用結論:程式不走系統代理時,再使用 TUN
瀏覽器可以連線,但遊戲、命令列或桌面應用程式無法連線時,先確認該程式是否遵循系統代理設定。系統代理主要是提供 HTTP 代理設定,應用程式可以採用,也可以忽略。TUN 則在網路層接收路由至虛擬網卡的 IP 封包,不必為每個程式個別填寫代理位址。
本文設定以 Clash Meta 後續專案 mihomo 的欄位為準。Clash 是常用來稱呼一類核心與用戶端生態系的名稱;介面上出現「TUN」,不代表不同核心、不同系統的實作完全相同。請先在用戶端的「關於」或核心資訊中確認實際使用的核心,再套用對應設定。
- 只使用瀏覽器:系統代理通常就足夠,排查流程也較簡單。
- 程式沒有代理設定:較適合使用 TUN,但仍須確認該程式的 TCP、UDP 流量是否確實被接管。
- 遊戲、語音或 QUIC:除了 TUN,也要確認代理協定及伺服器是否支援 UDP 轉送。
- 公司 VPN、遠端桌面正在使用中:先儲存工作,記下原本的路由和 DNS 設定;若遠端連線是唯一入口,請勿貿然變更預設路由。
虛擬網卡原理:從 IP 封包到規則分流
接管流程分為四個步驟
- 應用程式發起連線。程式準備連線至網域或 IP,系統依據路由表決定透過哪張網卡傳送。
- 路由導向 TUN。用戶端建立虛擬網卡並安裝相應路由;符合條件的封包會進入 TUN 裝置。
- 核心處理連線。網路堆疊接收 IP 封包,擷取目的位址、連接埠及可取得的網域資訊,再交由規則引擎判斷。
- 套用出口策略。直連流量透過實體網路介面傳送;代理流量則經由所選代理連線傳送,回應再沿相應路徑返回應用程式。
這裡所說的「虛擬網卡」不是新增一條實體網路,而是作業系統與使用者空間網路程式交換封包的介面。用戶端還必須避免自己的代理出口再次進入 TUN,否則會形成路由迴圈;這也是出口介面識別與權限設定很重要的原因。
接管範圍受路由與排除項目限制
auto-route: true用於自動設定導向 TUN 的路由,auto-detect-interface: true用於自動識別出口介面。這些設定不保證「所有情況都能接管」。其他 VPN 的路由、綁定特定網卡的程式、用戶端排除項目,以及 IPv6 設定,都可能改變實際流量路徑。
若只接管 IPv4,而應用程式優先使用 IPv6,部分連線可能會透過另一條路徑傳送。別只憑「網頁能開啟」就判斷接管完整;也應查看目標程式的連線記錄、規則命中結果及實際出口策略。TUN 也不會自動代理同一個區域網路中的其他裝置;若要共用閘道,須另外設定轉送與路由。
system 與 gvisor:先選網路堆疊,再測試相容性
stack控制 TUN 封包採用哪種網路堆疊處理,不是節點協定,也不是代理加密方式。效能會受作業系統、核心版本、連線類型及裝置能力影響,不能一概認定某種堆疊「最快」。
| 網路堆疊 | 處理方式 | 選擇建議 |
|---|---|---|
system |
使用系統網路堆疊處理連線,實際實作依平台而異。 | 可先採用此設定;遇到特定程式或 UDP 相容性問題時,再切換堆疊進行測試。 |
gvisor |
使用以 gVisor 為基礎的使用者空間網路堆疊處理封包。 | 適合與 system 進行對照測試;在使用者空間處理可能增加 CPU 負載。 |
mixed |
在 mihomo 中,TCP 使用 system,UDP 使用 gvisor。 | 可分別處理 TCP 與 UDP;請確認目前使用的核心和用戶端支援此選項。 |
對照測試時一次只變更一項
- 固定代理策略、規則模式與網路環境,先使用
system。 - 開啟目標應用程式觀察約 60 秒,記錄能否建立連線、是否中斷,以及 CPU 使用率是否持續偏高。
- 只將網路堆疊改為
gvisor,重新啟動核心後再重複相同操作。 - 若只有 UDP 應用程式異常,再檢查代理端是否支援 UDP,別把所有問題都歸咎於網路堆疊。
測試記錄可寫成「system:網頁正常、語音無法連線;gvisor:網頁正常、語音可連線」。這只是記錄格式,並非本文的實測結論。延遲測得 40 毫秒,也無法證明遊戲 UDP 已正確轉送。
mihomo 設定:一併檢查 TUN、DNS 與路由
以下是可合併至完整設定檔的基礎片段,不含代理伺服器資訊或策略群組。現有訂閱中的 proxies、proxy-groups 和 rules應予保留。建議優先使用用戶端的覆寫或合併功能;直接修改訂閱產生的檔案,更新時可能會被覆蓋。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
tun:
enable: true
stack: system
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
- tcp://any:53
dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
nameserver:
- 1.1.1.1
- 8.8.8.8
各連接埠的用途
7890:HTTP 與 SOCKS 共用的混合代理監聽連接埠,供系統代理或手動設定代理的應用程式連線;TUN 接管並不是把所有 IP 封包送至此連接埠。127.0.0.1:1053:本機 DNS 監聽位址,避免直接佔用系統的 53 連接埠;不代表系統 DNS 已自動改用此位址。any:53與tcp://any:53:比對進入接管路徑的一般 UDP、TCP 53 連接埠 DNS 查詢,並交由內建 DNS 處理。198.18.0.1/16:fake-ip 使用的位址池,協助核心建立網域與虛擬位址的對應,並非代理伺服器位址。
DNS 劫持的適用範圍
應用程式內建的 DoH、DoT 不會透過一般 53 連接埠查詢,因此無法只靠上述 dns-hijack改寫其 DNS 內容。這些連線仍可能經過 TUN,但內建 DNS 不一定知道最終網域。網域規則能否命中,還取決於 fake-ip 對應、嗅探設定及實際使用的協定。
在 fake-ip 模式下,外部網域解析到類似 198.18.0.23的位址可能是正常現象;這是對應結果,不是目標網站的真實 IP。若區域網路印表機、NAS 或內部網域發生相容性問題,應依實際網域設定過濾或 DNS 分流。不要只為了解決一個內部網域,就把所有網域都排除在 fake-ip 之外。
依平台啟用:先授權,再啟動核心
選單名稱可能隨用戶端版本而異。以下說明常見入口及其操作目的;若找不到同名選單,可搜尋「服務」、「權限」、「TUN」或「虛擬網卡」等功能,不要把其他用戶端的操作路徑當成目前版本的固定設定。用戶端選擇可先參考用戶端比較。
Windows:服務模式與虛擬網卡驅動程式
- 匯入設定後,先透過系統代理確認相同代理策略能連線至目標服務。混合連接埠例如設為
7890時,應與應用程式中的設定一致。 - 以 Clash Verge Rev 常見介面為例,進入「設定」→「服務模式」,依畫面提示安裝或啟用服務;過程中可能會要求系統管理員授權。
- 返回首頁啟用「TUN 模式」,或在相應版本的網路設定中啟用 TUN。若服務無法使用,請先排除服務狀態問題,不要反覆切換開關。
- 查看核心記錄,確認虛擬網卡與路由初始化沒有權限或驅動程式錯誤,再測試原先不走代理的程式。
Windows 用戶端通常需要搭配虛擬網卡驅動程式,例如 Wintun;請透過用戶端支援的流程取得並安裝。不要從不明來源複製驅動程式檔案。可在 PowerShell 中查詢目前的網卡與 IPv4 路由:
Get-NetAdapter
Get-NetRoute -AddressFamily IPv4 |
Sort-Object RouteMetric |
Format-Table DestinationPrefix, InterfaceAlias, NextHop, RouteMetric
虛擬網卡名稱由用戶端或設定決定,不一定叫做 Clash。看到網卡存在,只能表示裝置建立成功,還要檢查路由與連線記錄。若電腦同時執行其他 VPN,請先關閉其中一個再測試,避免兩套接管機制互相爭用流量。
macOS:輔助服務權限與 utun 介面
- 確認用戶端及其核心支援 TUN;只有系統代理功能的用戶端,無法只靠新增 YAML 欄位取得完整的 TUN 能力。
- 在用戶端的服務或權限設定中,依提示安裝輔助服務並完成系統管理員授權。
- 啟用 TUN,檢查記錄中的裝置、路由與 DNS 初始化資訊。
- 使用終端機查詢介面與路由,接著啟動目標程式進行驗證。
ifconfig
netstat -rn -f inet
scutil --dns
macOS 常見的虛擬介面名稱為 utun加上編號,但其他 VPN 或系統服務也可能建立 utun。不能只因為看到 utun3就認定它屬於目前的用戶端。從睡眠喚醒或切換 Wi-Fi 後發生異常,應重新檢查出口介面,而不只是更換代理節點。
Linux:TUN 裝置與網路管理權限
Linux 通常需要可用的 /dev/net/tun,以及建立介面、修改路由所需的網路管理權限。桌面用戶端可能透過服務取得權限;直接執行核心時,請依發行版和服務部署方式設定權限。不要授予不明來源的可執行檔高權限,也不要為了省事而遞迴變更整個用戶端目錄的權限。
ls -l /dev/net/tun
ip link show
ip rule show
ip route show table all
檢查路由時要查看所有路由表,因為自動接管可能使用策略路由;單獨執行 ip route未必能顯示完整規則。容器環境還需要主機提供 TUN 裝置與必要權限;在容器內啟用開關,不代表能接管主機上的應用程式。
Android 與 iOS:使用系統 VPN 授權機制
常見的 Android Clash 用戶端會透過 VpnService接管流量,首次啟用時會出現系統 VPN 連線授權提示,通常不需要 root。請檢查應用程式的 VPN 模式、略過應用程式清單,以及系統的背景執行限制。一般而言,同一使用者下只能有一個一般 VPN 服務處於啟用狀態;啟動另一個 VPN 可能會取代目前的連線。
iOS 用戶端必須自行提供並獲准使用 Network Extension 等系統功能,無法只靠桌面設定中的 TUN 欄位憑空建立這項能力。請依用戶端流程新增 VPN 設定並授權,再確認其支援的設定語法。不要將完整的 mihomo TUN 設定片段直接套用到語法不同的 iOS 用戶端。
驗證流量接管:別只看 TUN 開關
先交叉檢查三個項目
- 裝置與路由:虛擬介面已建立、接管路由已安裝,且記錄中沒有持續出現權限錯誤或裝置開啟失敗。
- 目標程式連線:開啟原先忽略系統代理的程式,在用戶端的「連線」頁面查看相應的目標位址與連接埠。例如 HTTPS 常見連接埠為 TCP 443,QUIC 常見連接埠為 UDP 443,但不能只憑連接埠判斷應用程式類型。
- 規則與出口:確認連線符合預期規則與策略。需要代理的目標若命中 DIRECT,即使 TUN 正常,結果仍不會符合預期。
若要區分兩種流量入口,可暫時關閉系統代理,並清除目標程式自行設定的 HTTP、SOCKS 代理,只保留 TUN 進行測試。瀏覽器仍可連網並不足以證明接管正常,因為直連網路也可能連得上該網站。應交叉核對連線記錄和出口策略;測試後再還原所需設定。
依症狀縮小排查範圍
| 症狀 | 優先檢查項目 |
|---|---|
| 啟用後所有程式都無法連網 | 服務權限、出口介面識別、DNS 可連線性,以及其他 VPN 的路由衝突。 |
| 網頁正常,但語音或遊戲異常 | UDP 接管、代理端的 UDP 支援、應用程式排除清單,再對照測試網路堆疊。 |
| 外網正常,但 NAS 或印表機無法使用 | 區域網路路由、內部 DNS、fake-ip 過濾,以及目前網路實際使用的網段。 |
| 切換 Wi-Fi 後失效 | 檢查出口介面是否更新、舊路由是否殘留;重新啟用 TUN 後再查看記錄。 |
| 連線記錄中沒有目標程式 | 檢查程式是否遭排除、是否使用未接管的 IPv6 或特定介面,以及記錄是否被篩選。 |
排查時可暫時將記錄層級調整為 debug,記下啟用 TUN 與啟動目標應用程式的準確時間。例如 14:32:10 啟用、14:32:20 啟動程式,就從這 10 秒前後查找裝置、路由、DNS 與連線錯誤。確認問題後恢復為 info;分享記錄前,請遮蔽訂閱網址、權杖及個人網路資訊。
關閉與還原:先恢復網路,再繼續排查
若整台裝置無法連網,請先關閉 TUN,讓用戶端撤銷自動路由,再視需要恢復系統代理。正常結束用戶端,比直接強制終止核心更有助於完成清理。退出後仍有異常,請檢查系統代理是否仍指向已停止監聽的 127.0.0.1:7890,以及 DNS、虛擬介面與路由是否已還原。
- 不要隨意刪除整張路由表;企業網路、容器與其他 VPN 可能仰賴其中的規則。
- 不要盲目停用所有虛擬網卡;先透過用戶端記錄和介面變化,確認哪些裝置屬於目前的用戶端。
- 若 fake-ip 快取仍讓應用程式取得虛擬位址,請關閉並重新開啟該應用程式;必要時依系統方式清除 DNS 快取。
- 網路恢復後,依照「權限與裝置 → 路由與出口 → DNS → 規則與策略 → 應用程式協定」的順序重新測試,每次只變更一項設定。
最後保留的設定應該能說明、能驗證,也能還原:TUN 負責流量入口,DNS 提供網域資訊,規則決定出口,代理服務承載實際連線。完整欄位說明請參閱進階設定中的 TUN 設定;首次匯入訂閱則可依照快速入門先建立基本連線。