系统代理是 Clash 最基础的接管方式,通过设置操作系统 HTTP/SOCKS5 代理参数将支持代理的应用流量转入 Clash 处理。但系统代理存在本质局限——游戏客户端、命令行工具等直接建立网络连接的程序不受其控制。Clash 官方推出的 TUN 模式通过虚拟网卡在网络层接管全部系统流量,是实现真正全局透明代理的官方解决方案。
TUN 模式的工作原理
TUN(Network Tunnel)是操作系统提供的一种虚拟网络接口机制,工作在 OSI 模型的第三层(网络层)。Clash 开启 TUN 模式后,会在系统中创建一块名为 utun(macOS)或 Meta(Windows/Linux)的虚拟网卡,并修改系统路由表,将所有出站 IP 流量导入这块虚拟网卡。
流量进入虚拟网卡后,Clash 在用户空间对其进行解析,识别出目标地址,再根据规则配置决定是走代理还是直连,最后通过实际的物理网卡发出。整个过程对应用程序完全透明,应用程序无需做任何配置。
与 TAP 模式(工作在第二层,以太网帧级别)相比,TUN 模式无需处理 ARP、以太网头等二层细节,性能更高,也更容易实现跨平台兼容。
如何开启 TUN 模式
开启 TUN 模式有两种方式。图形化客户端通常在设置页面提供 TUN 开关,以 Clash for Windows 为例,需要先在「常规」设置中安装「Service Mode」(服务模式),安装完成后再开启「TUN Mode」开关。服务模式的安装需要管理员权限,目的是让 Clash 以系统服务的身份运行,从而获得修改路由表的权限。
另一种方式是在配置文件中直接声明 TUN 配置:
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
auto-route: true
auto-detect-interface: true
三种 TUN 栈模式的选择
Mihomo 内核提供三种 TUN 协议栈实现,各有优劣:
- system:直接调用操作系统原生的 TCP/IP 栈。性能最高,CPU 和内存开销最小,但在少数系统配置下可能出现兼容性问题。
- gvisor:使用 Google gVisor 项目中的用户空间 TCP/IP 协议栈实现。与操作系统内核完全隔离,兼容性最好,适合排查问题或在特殊环境下使用,但性能略低于 system 模式。
- mixed:TCP 连接使用 system 栈,UDP 连接使用 gVisor 栈。综合了两者的优点——TCP 性能接近原生,UDP 兼容性好。这是目前最推荐的选择,绝大多数场景下表现最佳。
DNS 劫持与防泄漏
dns-hijack: [any:53] 这个配置至关重要。它的作用是将所有发往任意 IP 地址的 53 端口 DNS 请求,都强制重定向到 Clash 内置的 DNS 模块处理。
为什么必须劫持 DNS?因为在 TUN 模式下,如果某些应用直接向 8.8.8.8:53 发送 DNS 请求(绕过系统 DNS 设置),这个请求会直接走物理网卡出去,不经过 Clash 的规则判断。这不仅可能导致 DNS 泄漏(暴露你的真实访问记录),还会造成某些域名无法正确路由到代理节点。开启 DNS 劫持后,所有 DNS 请求都由 Clash 统一处理,配合 Fake-IP 模式可以实现最优的 DNS 防污染效果。
验证与排查
开启 TUN 模式后,可以通过以下方法验证是否正常工作:在终端运行 curl -I https://www.google.com,如果能收到正常的 HTTP 响应头,说明命令行工具的流量已经走代理了。你也可以在 Clash 的「连接」页面实时查看所有经过 TUN 接管的连接,包括之前系统代理无法覆盖的程序。
如果开启后网络完全断开,最常见的原因是 auto-detect-interface 未能正确识别出口网卡。可以手动指定:
tun:
enable: true
stack: mixed
auto-route: true
interface-name: en0 # macOS 物理网卡名,Windows 通常是 以太网 或 WLAN