TUN 模式深度解析
系统代理只是表层方案,TUN 模式才是让「所有流量都走代理」的根本解法。本文从原理到配置,全面讲解 TUN 模式的使用方法。
系统代理的局限
Windows 和 macOS 都有「系统代理」机制:在系统偏好设置里填入代理服务器地址和端口,浏览器、邮件客户端等有良好网络规范的程序会读取这个设置并通过代理发送请求。这个机制实现简单,兼容性广,是 Clash 最常用的工作方式。
但系统代理有一个根本性局限:它完全依赖应用程序的自觉配合。系统代理的本质只是一个「建议」,操作系统无法强制所有程序遵守,应用可以直接调用底层网络 API 绕过它。以下几类常见场景,系统代理完全无能为力:
游戏客户端:Steam、Epic Games、EA App 等游戏平台通常自己管理网络请求,不读取系统代理设置。玩需要低延迟的多人游戏时,即使 Clash 已经开启,游戏流量仍然走直连,无法获得代理加速。
UWP 应用(Windows):Windows Store 应用运行在沙箱中,受 AppContainer 权限隔离,无法访问系统代理设置。Xbox 应用、Spotify Windows 版、部分微软自带工具都属于这类。
命令行工具:git、npm、pip、docker pull 等命令行工具在未手动配置 HTTP_PROXY 环境变量时不会使用系统代理。这对开发者来说尤为头疼,每次在终端操作都需要手动 export 代理变量。
iOS / Android 原生应用:移动端系统代理通常只对 HTTP/HTTPS 请求生效,UDP 通讯(如很多游戏、视频通话、DNS 请求)完全游离在代理之外。
什么是 TUN 模式
TUN(TUNnel)是操作系统内核提供的一种虚拟网络设备接口,最早用于 VPN 实现。TUN 模式让 Clash 在系统内核层创建一张虚拟网卡(通常命名为 utun 或 Meta),并通过修改系统路由表,将设备上所有的网络流量(而不仅仅是支持系统代理的流量)转发到这张虚拟网卡,再由 Clash 按规则分流处理。
这样一来,流量在进入任何应用程序的网络库之前,就已经在内核层被 Clash 接管了。不管应用程序是否遵守系统代理设置,不管使用什么编程语言、什么网络框架,只要产生网络请求,就必须经过 Clash 的规则引擎。这是「真全局代理」的含义:没有任何程序能逃脱代理的管辖。
工作原理
开启 TUN 模式后,Clash 对系统做了以下几件事:
第一步,创建虚拟网卡。在操作系统内核注册一张虚拟网络设备,分配一个私有 IP 段(如 198.18.0.0/16)。这张网卡没有物理对应,完全由 Clash 程序在用户态模拟其行为。
第二步,修改系统路由表。向系统路由表添加两条覆盖全局的路由规则:所有目标为 0.0.0.0/1 和 128.0.0.0/1 的流量(合起来等于全部 IPv4 地址)都转发到虚拟网卡。这两条路由的优先级高于默认网关路由,确保所有出站流量都先经过 Clash。
第三步,DNS 劫持(Fake-IP)。TUN 模式通常配合 Fake-IP DNS 模式使用。当应用发起 DNS 查询时,Clash 立即返回一个「假的」内部 IP(198.18.x.x),应用拿到这个假 IP 开始连接,Clash 在虚拟网卡层截获这条连接,还原出原始域名,再按规则决定直连还是走代理。这个过程对应用透明,但省去了实际的 DNS 查询延迟,速度更快,且彻底防止了 DNS 泄漏(DNS 请求不会发到系统默认 DNS 服务器)。
第四步,流量分流处理。Clash 接收到所有流量后,按照配置文件中的规则集判断每条连接的去向:命中直连规则的直接转发到真实网卡,命中代理规则的通过代理节点中转,命中拦截规则的直接丢弃。
典型使用场景
代理加速游戏:这是 TUN 模式最常见的使用动机。Steam 下载、游戏内 Matchmaking 服务、语音通话(Discord)等均使用 UDP,系统代理完全无效。开启 TUN 模式后,UDP 流量同样被接管,可以有效降低跨区游戏的延迟并提升稳定性。
开发者工具:不再需要手动 export 代理环境变量。npm install、git clone、docker pull 等命令在 TUN 模式下自动走代理,开发体验大幅改善。
流媒体解锁:部分流媒体客户端(如 Netflix 官方 App 而非浏览器版)绕过系统代理,TUN 模式确保其流量也能经过解锁节点。
iOS 全局流量管理:iOS 上 Clash Plus 默认就是 TUN/VPN 模式,所有 App 的流量(包括 UDP 视频通话)都在代理的管辖下,可以统一管理和分流。
各平台配置方法
Windows
以管理员权限运行 Clash Plus(右键→「以管理员身份运行」或在任务管理器中确认进程权限)。进入「Settings → TUN Mode」,打开「Enable TUN Mode」开关。首次启用时,程序会尝试安装虚拟网卡驱动,系统弹出 UAC 授权框时点击「是」。安装完成后,在设备管理器中可以看到名为「Mihomo」或「WinTun」的虚拟网卡,代表安装成功。
macOS
进入「Settings → TUN Mode」,打开开关。首次启用时,macOS 会弹出「系统扩展已阻止」的通知,前往「系统设置→隐私与安全性」,在「安全性」区域找到相关扩展,点击「允许」。此后需要输入管理员密码并重启 Clash Plus。之后每次开启 TUN 模式时,无需再次授权。
Android / iOS
移动端的 Clash Plus 默认即为 TUN/VPN 工作模式,点击主页的「连接」按钮,系统弹出 VPN 权限请求时点击「允许」,代理即处于 TUN 模式下,无需额外配置。iOS 上建议同时开启「On Demand(按需连接)」,防止锁屏后代理断开。
Stack 模式选择
Clash Plus(Mihomo 内核)的 TUN 模式支持三种网络协议栈(Stack),在配置文件的 tun 部分用 stack 字段指定:
| Stack | 实现方式 | 适用场景 |
|---|---|---|
system | 调用操作系统的 TCP/IP 协议栈 | 兼容性最好,性能稳定,推荐默认使用 |
gvisor | 使用 Go 语言实现的用户态网络栈(Google gVisor) | 隔离性更强,适合有特殊隔离需求的场景 |
mixed | TCP 用 system,UDP 用 gvisor | 兼顾 TCP 性能与 UDP 兼容性,推荐 |
对于大多数用户,推荐选择 mixed 模式:TCP 连接使用操作系统协议栈保证性能,UDP 连接使用 gVisor 确保更好的 DNS 处理和 UDP 穿透兼容性。如果你遇到某些 UDP 应用异常,可以尝试将 Stack 切换回 system 排查问题。
注意事项
权限要求:TUN 模式需要管理员 / root 权限,因为修改系统路由表是特权操作。Windows 上忘记以管理员权限运行 Clash Plus 是 TUN 模式启动失败的最常见原因。
与系统代理叠加:开启 TUN 模式时,可以同时保留系统代理。对于支持系统代理的应用,系统代理处理其 HTTP(S) 请求;TUN 模式兜底接管其他所有流量。两者不会冲突,只是系统代理处理的那部分流量在 TUN 层面会形成回环,Clash 内部会自动处理,防止无限循环。
性能开销:TUN 模式在内核层拦截并处理所有流量,比系统代理消耗更多的 CPU 和内存。在低端设备(老款手机、树莓派)上可能出现明显的性能降低,日常轻量使用建议优先选择系统代理。
防止代理环路:确保 Clash 连接代理服务器的流量本身不经过 TUN 接管,否则会形成死循环。Mihomo 内核会自动将出站代理连接标记为直连流量,正常情况下无需手动干预,但如果遇到连接挂起的情况,检查是否有路由环路问题。