各种代理问题

tim-qtp...大约 12 分钟代理TUN/TAPVPN虚拟网卡

这篇主要讲一下各种代理问题,包括 系统代理TUN/TAP代理真VPN代理,以及 Clash/V2Ray/Singbox 虚拟网卡如何接管系统全局流量,以及什么是真正的 VPN

你可能有以下问题:

  • 为什么节点无法使用?
  • 为什么游戏无法使用?
  • 为什么有的软件能用而有的却不能用?
  • 为什么电脑能用而手机不能用?
  • 为什么能上谷歌而上不了 YouTube?
  • 为什么添加了直连规则却还是走代理?

先来创建一个最常见的家庭网络环境。你在运营商拉了一条宽带,他会给你分配一个光猫。一般来讲,你会单独再购买一个路由器连接光猫。路由器通过 PPPoE 拨号获取运营商分配的公网 IP,假设为 2.2.2.2。同时,路由器作为局域网的网关会有自己的内网 IP,假设为 192.168.0.1。家里的所有网络设备都会连接到这台路由器,路由器通过 DHCP 为每一台网络设备分配一个内网 IP 以及默认网关、DNS 等信息。一般情况下,默认网关和 DNS 服务器都是路由器。这是最常见的家庭网络拓扑。


没有代理的正常情况

TCP/IP 的四层模型为例,假设浏览器发送了访问百度的请求,数据包会经由操作系统的网络协议栈一层层地进行封装。首先,应用层会将其封装成 HTTP 的数据包,再由传输层以 TCP 的方式封装数据,其中包含了源端口和目标端口。源端口是浏览器开启了一个随机端口,这里就不画了,目标端口是百度服务器的 80 端口。接着,网络层会加上源 IP 和目标 IP,源 IP 是本机电脑的内网 IP,目标 IP 是百度服务器的 IP 地址,假设是 3.3.3.3。本期我们先不关注百度的 IP 是如何获取的。再往下的接口层会封装 MAC 地址,并将数据从物理网口通过网线发送到了默认网关,也就是路由器。路由器会对数据包进行 NAT 处理,将数据包的内网 IP 替换为运营商分配的公网 IP,再将数据包发送到互联网。

经过互联网路由器的路由,最终百度的服务器会从网口收到我们发给他的数据包。发数据的过程是封装,而收数据的过程就是解封装。它会一层层地将我们的数据包解开,最终得到我们的意图是访问百度。于是乎,他会将百度首页的内容通过协议栈一层层地封装,从网口发出,并通过互联网的路由。最终,我们的路由器会收到百度返回的数据包,路由器会进行 NAT 处理,将公网 IP 恢复成内网 IP,并将数据发送给我们的电脑。电脑将数据包一层层解封装后返回给浏览器,百度首页的内容也就呈现在我们的面前。至此,一个简单的网络通信过程就完成了。这是在没有使用代理的正常情况下,收发数据是这么一个流程。


代理模式

接下来我们引入代理。首先,第一种最常见的是通过 SOCKS 或者 HTTP 代理的方式。我们平时使用基于 ClashV2RayXray 等内核的代理客户端都支持这种方式,也是必须要能支持的。

当我们这样设置代理之后,由于 Clash 接管了系统代理,浏览器访问谷歌的请求会交给 ClashClash 收到数据后,会根据分流规则判断是否需要走代理,Clash 会将数据进行加密封装。具体怎么加密取决于 Clash 当前使用的节点是什么协议。这里假设 Clash 当前选中的节点是服务器 IP5.5.5.5SS 节点,所以会使用 SS 协议进行加密封装

加密封装后的数据会通过操作系统的网络协议栈一层层地进行封装。传输层会加上节点服务器的端口,网络层会加上节点服务器的 IP 地址,最后交给路由器。路由器进行 NAT 转换后,将数据发送到了节点服务器。节点服务器收到数据后,解封装、解密,然后帮我们访问谷歌,最后将谷歌的数据进行加密封装,再返回给我们。收到节点服务器的数据后,通过网络协议栈一层层地解封装,加密数据会交给 ClashClash 对数据进行解密后再转交给浏览器。这样,我们就成功地访问了谷歌。这就是系统代理的执行流程。

但是存在比较棘手的问题。并不是所有软件都遵循系统代理。除去浏览器,绝大部分软件都不会走系统代理,甚至连设置代理的地方都没有,行为完全取决于软件开发者。

并且,系统代理一般都是 HTTP 代理而非 SOCKS5HTTP 代理不支持 UDP,游戏也是没法玩的。并且游戏一般都不会添加代理功能,所以使用系统代理模式一般都是看看网页、聊聊天。如果说系统代理能满足你的需求,那就是最方便省事的模式了。如果无法满足,比如设置好系统代理后,软件还是无法使用,可能是软件并没有走代理。这个时候就可以使用 TUN 或者 TAP 模式。


TUN/TAP 模式

这种模式的原理是创建一张虚拟网卡,从网络层接管系统所有流量。因为所有发往互联网的流量都必须经过网络层的封装,在这层进行拦截就能够获取所有应用产生的网络数据。这是目前主流的模式,我们的手机默认就是这种模式,所以才能实现所有 APP 翻墙。软路由接管全家的科学上网也是同样的原理。正因为有了 TUN,才能让科学上网达到近乎完美的状态。

还是以 Clash 为例,假设浏览器无视 Clash 接管的系统代理,数据不会交给 Clash 处理。但是 Clash 开启了 TUN 模式,开启之后会创建一张虚拟网卡。此时,浏览器访问谷歌,数据会直接来到网络协议栈。应用层会封装 HTTP 头部,HTTP 请求会使用 TCP 进行封装,接着来到 网络层。首先,目标 IP 是谷歌的 IP,假设我们已经知道了是 8.8.8.8。那源 IP 是什么?

由于 ClashTUN 模式开启了一张虚拟网卡,也就是说,数据会有两个出口,要么发给 Clash 的虚拟网卡,要么发给 物理网卡

具体发给哪张网卡是通过电脑的 路由表 来决定的。Windows 可以通过 route print 这条命令来查看 路由表。默认路由是这条,通过本机 IP 192.168.31.91 发给网关,也就是路由器的 192.168.31.1。只有当下面所有路由条目都不匹配的时候,才会走默认路由。

这时你会发现我的第一条网关是2.1,不是31.1,这是为什么呢!

因为我几天前配置过软路由,电脑数据会通过路由器转发到软路由上,即网关是软路由的网关,所以会不一样,但是会记录到电脑的路由表中。这里忽略掉它即可!

Clash 在开启 TUN 模式的时候,会自动帮我们添加路由。可以看到新增一条路由条目,通过 网络号子网掩码 我们可以看出,Clash 添加的这两条路由涵盖了所有 IPv4 的地址。

也就是说,访问任何 IP 的时候,都会从 172.29.0.1 这个接口,将数据交给 172.29.0.2 这个网关。再说明白一点就是,数据会发给 Clash 开启的虚拟网卡。

所以源 IP172.29.0.1。如果你使用 TAP 模式,则还会向下封装 MAC 地址,但对我们来说,MAC 并没什么作用,没必要向下封装,所以更推荐使用 TUN 模式。

此时,数据已经来到了 Clash 的虚拟网卡,Clash 可以监控并直接读取该网卡接口中的数据,并对其进行解析。

根据分流规则,决定数据是否需要走代理。如果需要走代理,就使用当前选中的节点对数据进行加密,发给相应的节点服务器。封装过程都是一样的。为避免流量环回Clash 会帮我们设置好出口为 物理网卡,从 物理网口 将数据发送出去。

当收到节点服务器返回的数据时,通过 网络协议栈 一层层地解封装,数据会来到 ClashClash 对数据进行解密,然后通过虚拟网卡将数据封装成 网络层 的数据包,再发回给浏览器。这样,我们就成功地访问了谷歌。这就是在网络层进行代理的 TUN 模式。

而且我使用的内核是Mihomo,所以网络适配器面板会出现其网卡信息


TUN 模式的优点与局限性

非常严格的程序或者游戏可能会检测电脑开启了虚拟网卡代理。为了让代理过程对电脑完全透明,可以将 Clash 的虚拟网卡转移到路由器里。这样,局域网内的设备无需运行任何代理工具,所有设备上网流量必将经过网关路由器。路由器的 物理网卡 接收到数据后会转交给 Clash,接下来的流程就和电脑上是一样的了,加密封装,然后转发到互联网即可。电脑没开代理,程序和游戏当然也就检测不出来。这种称之为 透明代理,前提是你家的路由器能够安装 Clash。这也是软路由的由来。也可以试试用虚拟机或者闲置的安卓手机充当软路由,也是一样的原理。

支持 TUN 模式的常用软件有 ClashSSTapNetchSingbox 等。

很遗憾的是,V2RayXray 并不支持。不过,从 V2RayN 6.0 以上的版本开始支持了 TUN 模式了,其实就是调用 Singbox 的内核。如果觉得V2Ray黑框很碍事,可以在 TUN 设置中将显示控制台关闭,保存后再来尝试开启,就不会再有那个黑框了。


真VPN

这种虚拟网卡模式和真正的 VPN 已经非常接近了,但是也只能说非常接近,还不是真正的 VPN

因为我们用的 SSVMessTrojan 等主流的翻墙协议都无法封装网络层的数据包。最直观的感受就是 ping 命令这个网络层的工具。

当我们使用 ClashTUN 模式 ping 谷歌的话,会返回一个假的延迟。这个一毫秒的延迟是直接从虚拟网卡返回的。

并且,如果使用 fakeIP 模式的话,还会直接返回一个假的 IP。因为 SSVMess 等协议无法代理网络层的 ICMP 协议,而 ping 就是 ICMP 协议的工具。

真正的 VPN 可以代理网络层,所以 WireGuard 是可以 ping 通谷歌的,而且延迟是真实的。

要了解什么是真正的 VPN,就需要先来了解一下 VPN 的全称:Virtual Private Network,译为虚拟专用网络或者虚拟私有网络。

  • 什么网络是私有网络?你家里的局域网就是你的私有网络。我们无法直接和你没有公网 IP 的电脑进行通信,除非到你家里连上你家的路由器,那我们就能在同一个私有网络里。

  • 那什么是虚拟?顾名思义,虚拟的意思就是虚拟,就是物理不存在。比如你的老婆初音未来。虚拟私有网络的意思就是我不需要物理地跑到你家里去,物理地连接上你家的路由器,就可以实现与你没有公网 IP 的电脑进行通信。而要实现这个功能的话,就必须要能够封装网络层的数据包。只有能够封装网络层的数据包,才能实现异地组网,才能实现内网穿透,才能实现虚拟地和你在同一内网里,才能称之为 VPN

VPN 是一种技术,而不是某个具体的协议。VPN 有很多技术实现,PPTP VPNIPSec VPNOpenVPNWireGuard 等等。

具体实现细节都不太一样,但有一个是必须要支持的,就是封装网络层。

如果 SS 协议也能够封装网络层,实现异地组网,那也能称之为 VPN

当然,我这里并不是说 VPN 就更高级。相反的,对于科学上网来讲,它可是一点都不高级。

因为 VPN 并不是为翻墙而生的,只是因为它能对数据进行加密,顺便实现了翻墙功能。

相较于 SS 这种专门为翻墙而生,将流量特征隐藏的协议,VPN 的流量清晰明了的写着它就是 VPN 的流量。而且 VPN 分流很不方便,所以用来科学上网并不合适。

目前来讲,TUN 模式是比较完美的客户端代理方式,既能实现在网络层接管系统所有流量,又能在此基础上实现分流。美中不足的地方就是使用 ping 命令来测试网络延迟的时候就不太方便了。如果你平时只是用来浏览网页的话,第一种系统代理的方式也是一个不错的选择。至于真 VPN 的话,并不推荐用来科学上网,更适合有内网穿透需求的用户。