2026-06-27
进阶功能
预计阅读 9 分钟
Clash TUN 模式与系统代理的工作原理对比
系统代理只接管遵循代理设置的应用流量,TUN 模式通过虚拟网卡在网络层接管全部流量。两者的差异决定了命令行工具、游戏和后台服务能否被正确代理,选错模式是很多“连了但没生效”问题的根源。
系统代理的工作方式:应用主动读取配置
系统代理(System Proxy)是操作系统提供的一套标准接口,Windows 的“网络和 Internet-代理”、macOS 的“系统设置-网络-代理”都属于这一层。当 Clash 客户端开启系统代理后,实际发生的动作是把系统的 HTTP/HTTPS 代理地址写成本机的 127.0.0.1:7890(端口以实际配置为准),并写入注册表或系统配置文件。
关键点在于,这只是一份“建议配置”,能不能生效完全取决于应用程序自己有没有去读取这份配置。浏览器、大多数图形界面软件都会主动检查系统代理设置并遵循,所以浏览网页时代理立刻生效。但相当一部分程序并不遵循系统代理,包括:
不基于系统网络库、自己实现网络栈的命令行工具,例如部分用 Go 静态编译的 CLI 程序。
游戏客户端,尤其是使用 UDP 协议做实时同步的游戏,很多游戏引擎不走系统代理接口。
后台更新服务、驱动程序、系统级组件,这些进程往往运行在更高权限或独立的网络上下文中。
部分 Electron 应用如果没有显式读取代理环境变量,也可能绕过系统代理。
换句话说,系统代理是“应用层的君子协定”,Clash 把地址写好,剩下的执行权在应用程序手里。这也是为什么很多人反馈“客户端显示已连接,浏览器能上网,但某个软件还是连不上”,本质上是那个软件没有走系统代理。
!
提示: 命令行环境下想让不遵循系统代理的工具走代理,通常需要手动设置 HTTP_PROXY 和 HTTPS_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 模式切换入口,配合规则分流可以按场景灵活选择接管方式。