TUN 虚拟网卡与系统代理对比:两种流量接管机制的覆盖范围与取舍
系统代理依赖应用主动遵守设置,TUN 在网络层接管全部流量。本文对比两者的覆盖范围、权限要求与兼容性,并给出选择建议。
一、先区分流量接管与代理分流
系统代理和 TUN 解决的是同一个前置问题:应用产生的连接怎样进入 Clash 内核。连接进入内核后,才由规则、策略组和节点决定直连、代理或拒绝。因此,开启 TUN 不等于开启全局代理,系统代理也不等于只能使用规则模式。
本文中的 TUN 配置以 Clash Meta(mihomo)内核为例。不同客户端提供的开关、服务安装方式与默认端口并不统一;旧版 Clash 客户端也未必支持下文所有字段。操作前先在客户端的内核信息中确认实际运行的是 mihomo,而不是只看应用名称里有没有 Clash。
两条常见连接路径
- 系统代理:浏览器读取系统代理设置,将连接发到本机 HTTP 代理端口,再由内核执行分流。
- TUN:应用按正常方式发起 IP 连接,操作系统路由把符合条件的数据包送入虚拟网卡,再由内核处理。
- 应用内代理:在 Git、命令行或聊天工具里单独填写 SOCKS5 或 HTTP 地址。这是第三种入口,不必依赖系统代理开关。
二、覆盖范围对比:浏览器、命令行与 UDP
系统代理本质上是一组供应用读取的设置,不是网络层拦截器。Windows 的不同网络 API、应用自带的网络库,以及 macOS 应用对代理配置的支持都可能不同。浏览器可用,只能证明这条浏览器连接可用,不能代表同一设备上的全部应用都已接入。
| 对象 | 系统代理 | TUN 模式 |
|---|---|---|
| 遵守系统设置的浏览器 | 通常可以接入,适合网页访问 | 通常可以接入,仍受路由与规则影响 |
| curl、Git 与构建工具 | 未必读取,常需环境变量或应用配置 | 通常不必逐个设置代理地址 |
| 游戏、语音与 QUIC | HTTP 系统代理通常不覆盖其 UDP 连接 | 可接管受支持的 UDP,节点与链路也需支持 |
| 局域网打印机、NAS | 取决于代理绕过列表和应用行为 | 需核对本地路由、直连规则和地址排除 |
| 其他设备的流量 | 仅设置本机不会自动覆盖其他设备 | 仅开启本机 TUN 也不会自动成为局域网网关 |
UDP 支持要看完整链路
HTTP 代理端口不是通用 UDP 隧道。SOCKS5 协议虽然定义了 UDP 转发,但应用是否实现、客户端是否接收、出口节点是否支持,是不同条件。TUN 可以把更多 UDP 流量送到内核,却不能把不支持 UDP 的节点变成支持 UDP 的节点。
例如 HTTP/3 常使用 UDP 443;某个网页通过 TCP 可以打开,不代表 QUIC 路径也正常。游戏能登录但语音不可用时,应分别查看登录连接和语音连接的目标地址、协议与策略,不能只看一个延迟测试数字。
三、权限与配置:端口入口和虚拟网卡
系统代理:先确认本地监听地址
下面用 127.0.0.1:7890 作为明确的示例入口,不表示所有客户端都默认使用该端口。mihomo 的 mixed-port 可以在同一个端口接受 HTTP 与 SOCKS 请求。实际值应以客户端显示的混合端口或当前生效配置为准。
# mihomo 配置片段:本机混合代理入口
mixed-port: 7890
allow-lan: false
mode: rule
Windows 11 可在「设置」→「网络和 Internet」→「代理」→「手动设置代理」核对地址和端口;客户端也可能通过自动配置脚本设置系统代理,不能只看手动代理一栏。macOS 可在「系统设置」→「网络」→当前网络服务→「详细信息」→「代理」检查。这里显示的入口必须与客户端监听端口一致。
本机使用时优先保持回环地址,不要为解决浏览器打不开而直接把监听地址改为所有网卡。向局域网开放代理是另一项配置任务,还需要访问控制与防火墙配合。
TUN:路由配置与后台服务权限
TUN 需要创建虚拟网络接口并调整路由,桌面客户端通常借助管理员权限或特权服务完成。Windows 客户端可能要求先安装服务模式;macOS 客户端可能使用特权辅助程序或网络扩展,授权方式取决于实现。并非所有 macOS Clash 客户端都会请求相同的网络扩展权限。
# mihomo TUN 配置片段,不是完整订阅
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
- tcp://any:53
stack: mixed在当前 mihomo 实现中使用系统 TCP 栈与 gVisor UDP 栈组合;可用值和兼容性需要对应所用内核版本核对。auto-route: true自动设置相应路由。创建网卡成功,不代表路由一定安装成功。auto-detect-interface: true用于自动识别出口接口。Wi-Fi、有线网络和其他 VPN 并存时,仍需检查实际出口。dns-hijack是tun下的字段,示例分别匹配 UDP 与 TCP 的 53 端口请求,并将其交给内置 DNS 模块处理。
四、DNS 与 IPv6:TUN 已开启仍有遗漏的原因
流量接管与域名解析必须一起检查。应用先查询域名,再建立连接;如果 DNS 请求走了另一条路径,可能出现域名解析失败、规则缺少域名信息或连接目标与预期不一致。只看到虚拟网卡名称,不能证明 DNS 链路已经正确。
53 端口劫持不包含全部 DNS
上面的 dns-hijack 示例针对传统 DNS。浏览器的 DNS over HTTPS 使用 HTTPS 连接,DNS over TLS 通常使用 TCP 853;它们不会因为配置了 53 端口劫持就自动变成内核 DNS 查询。排查时可暂时关闭浏览器的安全 DNS,进行一次同条件对照,再决定长期策略。
这段 TUN 示例还需要与已启用的 mihomo DNS 模块配合,例如 dns.enable: true,并保留可用的解析上游。fake-ip 与 redir-host 是解析处理模式,不是 TUN 的替代品;使用 Fake-IP 时仍需根据实际应用兼容性设置过滤列表。
IPv6 需要单独验证
如果网络同时提供 IPv4 与 IPv6,而当前客户端只正确接管了其中一类,应用可能优先使用另一类地址。排查时分别测试两种地址族,核对内核 IPv6 设置、DNS 的 AAAA 返回行为和系统路由。不要仅凭一次 IPv4 测试就判断全部连接都经过 TUN。
五、验证方法:一次只改变一个入口
建议按“显式代理→系统代理→TUN”的顺序检查。测试时固定同一策略组和同一个节点,关闭其他代理或 VPN;切换入口后重新建立连接,避免浏览器连接复用干扰结果。以下命令使用公共示例站点,只用于展示方法,响应耗时不是本文给出的实测成绩。
- 确认端口能用。关闭 TUN,用命令显式指定本地代理。如果这一步失败,先处理内核、端口或节点,不急着调整虚拟网卡。
- 确认系统代理。启用系统代理,用遵守系统设置的浏览器访问同一目标,并在客户端连接列表中核对目标域名、匹配规则与策略链。
- 确认 TUN。关闭系统代理,只保留 TUN。让命令行不使用应用级代理访问目标,核对连接记录,必要时同时检查系统路由。
- 确认真实业务。再测试游戏、语音、局域网访问等目标。网页成功不能替代 UDP 或本地资源验证。
# Windows PowerShell:使用 curl.exe,避免旧版 PowerShell 的 curl 别名
curl.exe -I --connect-timeout 10 --proxy http://127.0.0.1:7890 https://example.com/
# TUN 对照测试:不使用 curl 的代理配置
curl.exe -I --connect-timeout 10 --noproxy "*" https://example.com/
# 分别测试 IPv4 与 IPv6
curl.exe -4 -I --connect-timeout 10 --noproxy "*" https://example.com/
curl.exe -6 -I --connect-timeout 10 --noproxy "*" https://example.com/
macOS 与 Linux 可将命令中的 curl.exe 换为 curl。--noproxy "*" 只让 curl 不使用应用级代理,不会绕过 TUN。收到 HTTP 响应也只证明该请求收到响应;是否经过代理节点,必须结合内核连接记录或出口验证确认。
Windows 可用 route print 查看路由;macOS 可用 route -n get 1.1.1.1 检查指定 IPv4 目标的路由;Linux 可用 ip route get 1.1.1.1 查看选路。不同系统可能使用接口路由或策略路由,不能把“必须出现某条默认路由”当成统一判据。
六、兼容性与取舍:按最小接管范围选择
优先使用系统代理的情况
- 主要使用浏览器,其他应用希望保持原有网络路径。
- 工作设备已连接企业 VPN,不适合再自动调整全机路由。
- 只需让少数开发工具使用代理,可以在工具里配置 HTTP 或 SOCKS5 入口。
考虑使用 TUN 的情况
- 目标应用不读取系统代理,也没有独立代理设置。
- 需要覆盖受支持的 UDP 业务,并且已确认节点具备相应能力。
- 希望多个应用统一进入内核,再按域名、IP 或进程等规则分流。
TUN 与其他 VPN 并存时,容易遇到默认路由、DNS、网段重叠和回程路径冲突。比如企业网络也使用私有地址,简单添加“全部私网直连”可能绕开企业 VPN 的必要路由。应先记录企业网络的目标网段,再依据客户端支持的路由排除与规则能力配置,不要把一个通用私网规则当作完整方案。
两种入口可以同时启用,但不建议在故障排查阶段这样做。应用显式连接本地代理时可能直接走回环入口,其他应用才走 TUN;这会让“关闭一个开关后仍然能访问”的结果难以解释。保持一个主要入口,更容易判断权限、DNS、端口还是规则出了问题。
后续配置可从系统教程核对平台差异,或按使用文档完成订阅导入与规则模式设置。最终判断标准应是目标应用的真实连接记录,而不是客户端界面上的单个“已开启”状态。