tech/network · 集群 B · 隧道与排障原理 · 3/6
TUN 虚拟网卡原理:系统流量如何被接管到代理内核
TUN 是操作系统提供的一种虚拟网卡,程序可以从它读取和写入完整的 IP 包。代理客户端创建 TUN 网卡并修改路由表,让系统流量先进入虚拟网卡,再由代理内核处理,因此能接管不走系统代理的应用和 UDP 流量。它的代价是需要较高权限,并且要正确处理路由环路、DNS 与本地网段,否则可能导致断网或冲突。
TUN 是什么
TUN 是操作系统内核提供的一种虚拟网络接口,它看起来和真实网卡一样有地址、能出现在路由表里,但它的“另一端”不是网线,而是一个用户态程序。系统把发往这张网卡的 IP 包交给程序读取,程序也可以把 IP 包写回网卡,让系统以为这些包是从网络上收到的。
真实网卡 TUN 虚拟网卡
[系统协议栈] ⇄ [网卡驱动] ⇄ 网线 [系统协议栈] ⇄ [TUN] ⇄ [用户态程序]
(代理内核)
这个机制最初用于实现各类 VPN 和网络隧道。代理客户端借用它,就能在网络层拿到系统发出的所有 IP 包,而不必依赖应用是否支持代理设置。与 TUN 相关的还有 TAP,它工作在以太网帧层,代理场景中较少使用。
系统代理为什么“管不全”
要理解 TUN 的价值,先要知道系统代理的局限:系统代理只是一条“建议”,应用可以选择听或不听。
系统代理是操作系统里的一项设置,告诉应用“如果你要上网,可以先去找这个地址”。浏览器通常会读取这项设置,但很多程序不会:
- 部分命令行工具默认不读系统代理,需要单独设置环境变量;
- 部分游戏、通讯软件自己管理网络连接,直接从网卡发包;
- 系统代理通常不处理 UDP,语音、游戏流量会直接绕过;
- 部分应用内置了自己的 DNS 解析,不受代理内核控制。
| 对比项 | 系统代理 | TUN 模式 |
|---|---|---|
| 工作层级 | 应用层 | 网络层 |
| 接管依据 | 应用是否读取代理设置 | 系统路由表 |
| UDP 支持 | 通常不支持 | 支持 |
| 覆盖范围 | 支持代理设置的应用 | 系统中绝大部分流量 |
| 权限需求 | 普通 | 较高(管理员 / 系统服务) |
| 对系统的改动 | 修改代理设置 | 创建网卡、修改路由与 DNS |
UDP 与 TCP 在代理中的差异见 TCP 与 UDP 在代理场景中的差异。
TUN 模式的完整工作流程
TUN 模式的工作流程可以分为四步:创建网卡、改写路由、接管 DNS、内核处理。
① 客户端创建 TUN 网卡,并分配一个地址
│
▼
② 修改路由表:把默认路由(或大部分网段)指向 TUN
│
▼
③ 接管 DNS:把系统的 DNS 查询引导到内核
│
▼
④ 应用发出 IP 包 → 系统按路由送进 TUN → 内核读取
│
├─ 按规则判断:代理 / 直连 / 拒绝
│
├─ 代理:封装后经物理网卡发往节点
└─ 直连:经物理网卡直接发往目标
第②步决定了“哪些流量会进 TUN”,第③步决定了“DNS 是否被统一接管”。第③步很关键:如果 DNS 没有被接管,应用自己解析出的 IP 可能来自被污染的本地服务器,后续按 IP 判断的规则就会出错。DNS 机制见 DNS 污染是什么。
内核把 IP 包还原成连接的过程,通常由一个用户态的网络协议栈完成,它负责把零散的 IP 包重新组装为 TCP 流或 UDP 会话,再交给规则引擎处理。不同客户端可选用不同的协议栈实现,菜单名称和选项可能随版本变化。
路由环路:TUN 最典型的坑
路由环路是 TUN 模式最典型的问题:代理内核发往节点的流量,如果也被路由表送回 TUN,就会被内核再次接收、再次发出,无限循环。
错误情况:
内核 → 发往节点 → 路由表 → TUN → 内核 → 发往节点 → TUN → ...(环路)
正确情况:
内核 → 发往节点 → 绑定物理网卡 → 直接出去
客户端通常通过以下方式避免环路:
- 绑定出口网卡:内核发出的连接明确从物理网卡发出,不经过路由表默认路由;
- 排除节点地址:在路由表中为节点地址添加走物理网卡的特殊路由;
- 自动检测接口:自动识别当前上网使用的物理网卡。
当你切换 Wi-Fi 与有线、或网络环境变化时,物理网卡可能改变,若客户端未能及时识别,就可能出现“开 TUN 后断网”的情况。
私有网段与局域网访问
TUN 接管了默认路由后,访问局域网设备(打印机、NAS、路由器管理页面)的流量也可能进入 TUN。如果规则没有把私有网段设为直连,这些流量会被送往远端节点,自然无法到达。
常见的处理方式是在路由层面排除私有网段,或在规则最前面加入私有地址直连规则。规则的匹配顺序原理见 分流原理。
IPv6 与 TUN
在双栈网络中,如果 TUN 只接管了 IPv4,而系统优先使用 IPv6,部分流量就会绕过 TUN 直接从物理网卡发出。这会表现为“明明开了 TUN,某些网站还是直连”。是否接管 IPv6,以及如何处理双栈优先级,见 IPv6 对代理的影响。
权限与安全考虑
TUN 需要创建网卡、修改路由表和 DNS 设置,这些都是系统级操作,因此需要较高权限。不同系统的实现方式不同:有的需要以管理员身份运行客户端,有的需要安装一个常驻的后台服务,有的需要在系统设置中批准网络扩展。
正因为权限较高,客户端来源的可靠性尤其重要。一个被篡改过的客户端如果拿到了这些权限,理论上能看到并修改你的全部网络流量。请只从项目官方发布页获取客户端,警惕破解版和捆绑版,相关风险可参考 安全与隐私 专题。桌面端开启 TUN 的具体步骤见 桌面端 TUN 模式开启指南。
小结
TUN 的本质是“在网络层截住系统流量”,它解决了系统代理管不全、不处理 UDP 的问题,代价是更高的权限需求和更复杂的路由、DNS 处理。理解路由环路、私有网段与 IPv6 这三个常见坑,就能看懂大多数 TUN 相关故障。
如果你想了解各服务商资料中对客户端的支持情况,可以访问 机场品牌库 或使用 对比工具。品牌资料本站未实测,请以实际使用为准。
常见问题
TUN 和系统代理最大的区别是什么?
系统代理工作在应用层,只有主动读取系统代理设置的程序才会使用;TUN 工作在网络层,通过路由表接管系统发出的 IP 包,覆盖面更广,包括 UDP 和不支持代理设置的程序。
为什么开启 TUN 需要管理员权限?
创建虚拟网卡和修改系统路由表属于系统级操作,操作系统要求更高权限。部分客户端通过安装一个后台服务来获得这些权限,安装前应确认客户端来源可靠。
什么是路由环路?
如果代理内核发往节点的流量也被路由到 TUN 网卡,它会再次被内核接收、再次发出,形成循环。客户端需要让发往节点的流量绕过 TUN,从物理网卡直接出去。
TUN 模式会影响局域网访问吗?
可能会。如果私有网段也被路由进 TUN 且规则未将其直连,访问局域网打印机、NAS 等设备可能失败。通常客户端会默认排除私有网段,必要时可检查相关设置。
信息来源与更新时间
- 信息来源
- 品牌清单资料(品牌公开信息整理)
- 测试范围
- 本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
- 发布时间
- 待核实
- 核实日期
- 待核实
- 最近更新
- 待核实