目录
系统代理、全局模式与 TUN 模式:三种接管网络的方式
为什么设置了代理,命令行和游戏却不走?系统代理靠程序自觉,TUN 模式用虚拟网卡在网络层接管全部流量,全局与分流决定接管之后哪些走加密通道。配时序图逐步对比。
网络原理系列:① 打开一个网页时发生了什么 → ② 网络分层模型 → ③ 常见网络协议 → ④ 代理是什么 → ⑤ 加密隧道是什么 → ⑥ 加密隧道与代理的区别 → ⑦ HTTPS 加密了什么 → ⑧ 系统代理与 TUN 模式 → ⑨ 分流是什么 → ⑩ DNS 污染与泄漏 → ⑪ 晚高峰为什么变慢 → ⑫ 延迟、丢包与带宽
让设备上的流量走加密通道,有两种「接管」方式:系统代理是在系统设置里登记一个代理地址,由各个程序自己决定是否遵守,浏览器通常会、命令行和游戏常常不会;TUN 模式是创建一块虚拟网卡,在网络层把所有程序的流量都接过来,不依赖程序配合。接管之后,再由全局或分流规则决定哪些流量走加密通道、哪些直连。
- ① 系统代理在系统里登记一个代理地址
- ② 遵守设置的程序浏览器等按指示走代理
- ③ 不读设置的程序游戏、命令行从侧门直接出去
- ④ TUN 模式只剩一个大门,所有流量都要经过
- ⑤ 海外服务按规则送进加密通道
- ⑥ 本地网站按规则直连,不绕路
系统代理:只有遵守设置的程序才走
各操作系统都有「代理设置」:Windows 在「设置 → 网络和 Internet → 代理」,macOS 在「系统设置 → 网络 → 详细信息 → 代理」。客户端开启系统代理时,会在本机启动一个代理服务,并把它的端口登记到这里。
问题在于,这只是一份「通知」,是否遵守由程序自己决定:
| 程序 | 是否遵守系统代理 |
|---|---|
| Chrome、Edge、Safari 等浏览器 | 通常遵守 |
| 大部分图形界面 App | 部分遵守,取决于开发者 |
| 命令行工具(git、curl、npm、pip 等) | 通常不遵守,需要单独设置环境变量 |
| 游戏、部分聊天和视频软件 | 常常不遵守,直接联网 |
所以经常会遇到「浏览器能打开,但终端里 git clone 还是超时」「游戏还是连不上」的情况。
TUN 模式:在网络层接管全部流量
TUN 是操作系统提供的一种虚拟网卡,工作在网络层,收发的是 IP 数据包。客户端创建它之后,把系统的默认路由指向它,于是:
- 任何程序发出的数据包,无论它读不读代理设置,都会先被系统交给这块虚拟网卡;
- 客户端从虚拟网卡里读出数据包,按规则决定走加密通道还是直连;
- 程序本身完全不需要知道这件事。
除了接管 TCP,TUN 模式还能接管 UDP 和 DNS 查询。为了避免域名查询绕过加密通道(即「DNS 泄漏」),客户端通常会把发往 53 端口的 DNS 查询也截下来,在通道内完成解析。
全局与分流:接管之后「哪些走加密通道」
不管用哪种方式接管,接下来都要决定流量的去向:
| 模式 | 做法 | 适合 |
|---|---|---|
| 全局 | 所有流量都走加密通道 | 临时排查问题;需要整机都从海外出口访问 |
| 分流 | 按规则逐条判断:本地网站直连、海外服务走加密通道、广告可拒绝 | 日常使用:本地网站快,海外服务稳定 |
| 直连 | 全部不走加密通道 | 临时关闭,不想断开连接时 |
分流规则可以按域名、IP 段、国家等匹配,规则类型、生效顺序和写法见 分流规则详解。
时序图:两种接管方式逐步对比
| 步骤 | 发生了什么 |
|---|---|
| ①–② | 系统代理模式下,程序先读取系统的代理设置,得到本地代理(客户端)的端口 |
| ③ | 程序把请求交给客户端 |
| ④–⑤ | 客户端加密转发到服务器,由服务器访问网站 |
| ⑥ | 不读代理设置的程序(命令行、游戏)直接连接网站,完全绕过代理,这就是系统代理的「漏网之鱼」 |
| ⑦ | TUN 模式下,程序照常发出数据包,不需要任何设置 |
| ⑧ | 系统查路由表,发现默认路由指向虚拟网卡,于是把数据包交给它,客户端从这里读出数据包 |
| ⑨ | 客户端按分流规则判断这个数据包该去哪里 |
| ⑩ | 海外服务:加密后发往服务器 |
| ⑪ | 本地网站:从真实网卡直接发出,不绕路 |
为什么第一次使用要授权网络配置
虚拟网卡会改变整台设备的网络走向,所以各操作系统都要求用户亲自同意,也对它的权限做了严格限制:
| 平台 | 系统提供的机制 | 第一次连接时你会看到 |
|---|---|---|
| iPhone / iPad | Network Extension(隧道扩展) | 「想添加网络配置」弹窗,需要输入锁屏密码或面容确认 |
| Mac | 系统扩展 + Network Extension | 先允许系统扩展,再允许添加网络配置 |
| Android | VpnService | 「网络连接请求」弹窗 |
| Windows | TUN 虚拟网卡驱动 | 用户账户控制(管理员权限)提示 |
穿山甲在这四个平台上都使用 TUN 方式接管流量,并默认开启「智能分流」,所以命令行、游戏等各种程序都不需要单独设置。各平台的授权步骤见对应的安装教程,例如 iPhone / iPad 安装、Mac 安装。
相关阅读
常见问题
为什么终端里的 git、curl 不走代理?
系统代理只对主动读取这个设置的程序有效,很多命令行工具默认不读,需要单独设置环境变量(如 HTTPS_PROXY)。改用 TUN 模式后不需要任何设置,命令行流量也会被虚拟网卡接管。
TUN 模式会影响局域网设备,比如打印机和 NAS 吗?
正常不会。分流规则里一般都有「局域网直连」,访问家里的路由器、打印机、NAS 时不经过加密通道。穿山甲把这条规则设为强制,不可关闭。
开了 TUN 模式,为什么系统设置里多了一个网络连接或网络配置?
那就是虚拟网卡本身。操作系统把它当作一个网络连接来管理,所以第一次使用时需要你授权添加,之后在系统设置里也能看到它的连接状态。