Clash 项目被封,让网络上一众用户哀嚎一片。虽然很不喜欢 Clash 各种装 B 的态度,但是不得不承认其 TUN 模式让科学上网的适用性有了极大的提升。

随着更多工具的出现,为我们科学上网提供了新姿势。其中最为出色的就是 v2rayN 与 sing-box 组合开启 Tun 模式,给 windows 用户带来最接近 VPN 的使用感受。

1] 系统代理和 VPN 的区别

翻了这么多年的墙,我还是不能把系统代理和 VPN 完全解释清楚。直到了解到 TUN 模式,才对代理和 VPN 的区别大致有所理解。之前一直以为代理工具启动了系统代理功能,也就是 VPN 了。

事实上并非如些,系统代理可以理解为工作在 TCP/IP 协议的 TCP 层,设置好系统代理,也只是相当于启用了一个 TCP 应用,侦听特定的端口等待应用程序连接使用。应用程序需要通过系统代理访问网络,会首先连接至代理客户端,然后由代理客户端转发网络请求,达到科学上网的目的。

而 VPN 则完全工作在 TCP/IP 协议的 IP 层,开启了 VPN 客户端,就相当于给系统添加了全新的网络路由,VPN 接收全部网络数据包,并送至对应的网络地址。虽然都可以科学上网,但实现机理却有着很多区别。

最简单理解系统代理和 VPN 区别的方式就是 ping 外网服务器,由于 ping 命令是发送的 ICMP 报文,工作在网络层,不会连接系统代理,所以代理客户端即使工作在系统代理模式,我们仍然 ping 不通外网服务器。面对于 VPN 用户,则可以轻松 ping 通外网服务器,并且时延是真实时延。

但是手机使用时,打开代理客户端的全局模式后,也可以 ping 通外网服务器呀。这是个好问题,就可以引入 Tun 模式了。

因为手机操作系统 Android 和 iOS 是都支持 Tun 模式的,代理客户端利用 Tun 模式接收所有应用的网络请求,从而达到类似于 VPN 的使用效果。所以,从某种意义上说,手机端的系统代理和 VPN 区别不大。

2] V2rayN 使用 Tun 模式

事实上 v2rayN 客户端只是各种代理工具的 GUI 工具,本身并不实现核心代理功能。v2rayN 支持的 Tun 模式代理客户端是 sing-box。由于 sing-box 目前没有 windows 版的 GUI 工具,并且其配置文件比较复杂晦涩,很难一次性配置正确,所以 v2rayN 是更好的选择。

首先下载最新版的 V2rayN 客户端,注意软件分为单独版和包含核心版(With-Core),包含核心版包含了所有 v2rayN支持的代理客户端工具,比较方便,不需要再分别下载了。缺点就是代理核心可能不是最新版,并且有一些代理核心也用不到。

下载单独版就只有 v2rayN 客户端,需要自行下载代理核心工具。下载完成后,将所有文件放置在 v2rayN 文件夹”\v2rayN\bin”目录下对应核心的目录即可。例如 sing-box 的 windows 可执行文件”sing-box.exe”需要放置在”\v2rayN\bin\sing_box”目录。

由于 sing-box 内核不包含地址数据文件,而在工作时需要使用”geoip.dat”和”geosite.dat”来选路,所以最好再下载个 Xray 内核,它包含了这两个文件,将它们复制到”\v2rayN\bin\sing_box”目录供 sing-box 使用。

下载完成后,执行 v2rayN 程序,然后添加一个代理服务器。示例使用 VLESS 协议,添加相应在配置项完成服务器添加:

图.1 v2rayN 添加代理服务器

注意,由于我们需要使用 sing-box 内核,所以在内核项选择 sing-box,其它内容根据实际配置填写即可。所有内容确认无误后,点击”确定”按钮保存配置。

同时,需要将 v2rayN “设置”->”参数设置”->”Core类型设置”中的VLESS选项设置为”sing-box”。

服务器节点添加完成后,就可以测试服务器延迟情况并且使用浏览器访问外网进行科学上网测试了:

图.2 v2rayN 测试代理服务器

在保证代理节点可用后,就可以使用 Tun 模式了。

由于以非管理员身份运行的程序,是不能开启 Tun 模式的,需要关闭 v2rayN,然后右键点选以管理员身份运行程序,就会见到开启 Tun 模式控制开关:

图.3 v2rayN 开启 Tun 模式

Tun 模式启用成功,会自动在系统添加一个网络设备(singbox_tun),用以处理网络层流量:

图.4 Tun 网络设备

此时,就可 ping 外网服务器,来验证 Tun 模式是否成功了:

图.5 Tun 模式下 ping 命令测试

可以看到,我们是可以 ping 通 google 服务器,但是时延只有 0ms,显然与实际情况不符。这也是 Tun 模式与 VPN 的主要差别了。

至此,我们已经成功配置了 v2rayN 的 Tun 模式,各项功能正常。

3] Tun 原理浅析

根据 >>维基百科<< 的解释:在计算机网络中,TUN 与 TAP 是操作系统内核中的虚拟网络设备。不同于普通靠硬件网络适配器实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。

TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN 模拟了网络层设备,操作第三层数据包比如 IP 数据包。

操作系统通过 TUN/TAP 设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过 TUN/TAP 设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。

Tun 模式实际上是给操作系统虚拟出一个网络设备,用于绑定用户空间的程序数据收发,从而达到代理的目的。

查看系统路由表,也可以进一步验证:

图.6 Tun 模式下系统路由表

可以看到,系统会添加一条优先级最高的缺省路由”172.19.0.1″,也就是新增 Tun 网络设备的接口 IP 地址。这样,就可顺利接收用户空间应用程序的网络数据包了。

再次使用 windows cmd 终端 ping 命令 ping google 服务器,分别抓取实际网卡和 Tun 虚拟网卡的数据包。

首先 Tun 网卡数据包:

图.7 Tun 虚拟网卡数据包

可以看到,虚拟网络首先向上端接口发送DNS请求,查询 goole 服务器的地址,在查询到 IP 地址后就向该 IP 地址发送 ICMP 请求,并接收对端的响应,从而完成全部 ping 命令的执行内容。由于该请求是终端程序发出的,而 Tun 设备只是代为转发。由于虚拟网卡实际上也是软件应用,所以将 google 的 ICMP 响应转发给 cmd 终端时,相当于本机响应了 cmd 请求,从而造成 ping 命令在 Tun 模式下 ping google 服务器 0ms 时延的结果。

再查看实际网卡的数据包,处理过程则复杂的多:

图.8 主机实际网卡数据包

可以看到,主机实际网卡与代理服务器通过 TCP 建立连接(也就是代理客户端完成的工作),并通过该连接传输加密数据,最终将接收到数据通过操作系统内核空间转发给虚拟网卡。

通过虚拟网卡和实际网卡以及代理客户端的配合工作,最终达到了类似 VPN 的使用效果。

One thought on “v2rayN Tun模式详解”

  1. 博主的文章写得非常棒! 解决了困扰我一天的问题 🙂

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注