使用zerotier实现免费上网

原理

本文提到的操作需要使用一台机器进行中转,这个机器可以是服务器,也可以是自己工位上的 Windows 机器。同时,这个机器上还必须打开了 Clash、V2Ray、SSR 之类的代理,并拥有一个端口号。

基本原理:假设我们在宿舍有一台笔记本,称为 Alice,简称为 A;在工位上有一台电脑,称为 Bob,简称为 B。A 只能访问校园网的网站,例如 csu.edu.cn;B 能够访问互联网,例如 baidu.com。那么,如果我们能够实现 A 的 https 请求通过 B 进行转发,然后再由 B 转发回 A,也就实现了让 A 上网。如图,

image0.png

从密码学角度来想,Bob 就是 Alice 和 Internet 的中间人,它可以获取二者通信的所有内容,所以我们要保证 Bob 一定是可信的。如果 Bob 不可信,我们还可以通过 https 进行通信,https 的所有信息都是被加密过的,如果 Bob 没有解密私钥,他就无法窃取机密信息。如何进行私钥分发,保证私钥的隐私性和不篡改性?一般是通过第三方的公证机构,所以 https 的认证证书是收费的。

要实现以上的连接,我们需要两个工具:

  • 实现 A 和 B 之间通信的工具,zerotier,这个是为了获取 IP。
  • B 为 A 做代理的软件,一般的代理软件都可以,例如 Clash、V2Ray、SSR,这个是为了获取代理端口。

实际上,还是绕回了上一文中的,代理的两个关键变量:IP 和端口。

Zerotier

Zerotier 原理

为什么我们需要 zerotier?我们可以简单地把 zerotier 理解为打洞软件。因为 IPv4 的 IP 池不够用,所以产生了 NAT 技术,这样可以让一个 IP 被很多人一起使用,从而保证了基于 IPv4 的互联网的可用性。但是,这也有缺点,很多人都使用同一个 IP,那么 P2P 通信很难实现,并且也很难追踪数据的来源(所以知乎显示的 IP 都是省级的)。

在 NAT 环境下,为了实现 P2P 通信,可以使用的一个技术叫做打洞。具体实现原理我不是非常清楚,但是可以简要地说明一下。假设 A(192.168.1.*) 和 B(172.16.6.*) 之间有一个路由器 C,但是路由器两边的 IP 不同。B 可以向 A 发送数据包,但是 A 不能向 B 发送数据包,存在一个通信的 gap。NAT 技术的原理是二者进行通信的时候,对于公用的 IP,路由器会记录源IP、源端口、目标 IP、目标端口,本来 NAT 是一个 IP 层的技术,但是为了解决通信的问题,它使用了 TCP 层的技术。如果我们能够确保 C 上的一个端口永远是被 B 所占用的,那么 A 可以向 C 的这个端口发送数据包,这个数据包就可以保证被 B 所接收,这样就实现了二者的 P2P 通信。
在校园网环境下,实际的路由情况比较复杂,我的测试结果是从宿舍到实验室,中间应该经过了 5 层路由。

Tracert 测试

为了保证宿舍和实验室之间是存在路由关系,并且保证是在学校内网中的。我们需要先测试一下,使用的工具是 Windows 自带的 tracert 工具,在 Linux 上是 traceroute。

首先,在宿舍,连接 CSU-Student,一定要使用 WiFi 连接,因为我发现 WiFi 连接之后,打洞的延迟很低,在 4~10ms 左右波动,而网线连接的延迟很高,基本在 300ms 以上。

image1.png

连接 WiFi 之后,打开浏览器进行认证,随便访问一个网站就会自动跳转到认证网页了。注意:此时浏览器代理或者全局代理软件都不能打开,否则流量会被劫持,从而被转发到代理网站上,而代理网站不能连接,也就既不能认证又不能上网。认证网页,记得选择校园网,校园网可以免费登录:

image2.png

认证成功:

image3.png

认证成功之后,可以访问各种学校网站,例如官网 csu.edu.cn、计算机学院官网 cse.csu.edu.cn。所以,我们要使用 tracert 测试宿舍机器到 csu.edu.cn 的连通性。如图,

image4.png

image5.png

第一张图是在宿舍环境下的 tracert 测试,第二张图是在实验室环境下的 tracert 测试。可以发现,两台机器都访问了同一个 IP,172.30.200.2,说明这两台机器之间是存在路由连接的,因此我们通过打洞实现二者之间的 P2P 通信是可行的。

Zerotier 安装

到 zerotier 官网下载,直接安装即可。安装之后的界面:

image6.png

可以看到,右下角多了一个正在运行的软件。a84ac5c10a851cf8 是我自己创建的虚拟局域网。如果需要加入一个虚拟局域网,我们首先需要自己创建一个 zerotier 账号,并且创建一个虚拟局域网。当创建好虚拟局域网之后,在每台设备上加入组建的虚拟局域网。两台机器都加入之后,还需要到 zerotier 控制台中进行额外的配置。如图所示,

image7.png

因为默认创建的虚拟局域网是私有的,所以必须点上 Auth 的按钮。同时,还可以给它分配一个 IP 和名称。做好以上步骤之后,就可以 zerotier 帮我们实现自动打洞了。

注意,Windows 会默认打开防火墙,所以 ping 是会失败的。最简单的是在被连接的电脑 B 上关闭防火墙,虽然比较危险,但是在实验室内也只发现了一次挖矿病毒,所以不需要特别在意。如果担心防火墙打开的风险,也可以在测试完之后关闭。

测试连通性

由于 Windows 关闭了 ICMP 端口的连接,所以是无法直接 ping 通的。最简单的方法是关闭防火墙,也可以通过 控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 高级设置 -> 入站规则 进行配置入站规则,将四个核心网络诊断 - ICMP回显请求打开(右键,启用规则)。如图,

image8.png

本来是不可以 ping 通的,但是在打开之后,就可以 ping 通了。

image9.png

测试的方式:打开控制台,输入 ping ${IP_of_A} ,如上图所示。如果在已经打开了 ICMP 的情况下,并且延迟正常显示,那么就说明两台机器之间可以正常通信了。

代理

代理就比较简单了,只需要提供一个端口即可。我使用的是 Clash,像上文提到的那样,找到 Clash 的代理端口,那么这个就是我们需要连接的代理端口了。

[图片]

如果是 V2ray 和 SSR,在设置里面也有。

在拥有了 IP 和端口号之后,我们就可以把 B 视为我们的代理服务器,让 B 代替我们进行互联网访问,并且,由于这个端口号上监听的程序本来就是一个代理软件,我们的流量就可以自动地走代理程序,可以直接访问谷歌。
注意:代理的端口号也是被 Windows 防火墙关闭了的,所以,必须在入站规则中打开对应的代理端口,否则也是无法连接的。

Clash 配置

下载我的 clash 配置文件,并手动修改对应的 IP 和端口号。修改完成之后,在 profiles 界面导入配置文件。并且,点击右图中的测速按钮,可以得到延迟的大小。如果这个延迟是绿色的,那么就说明网络连接成功,可以使用。打开 General 界面的 System Proxy 按钮,这时整个系统的代理都会被 Clash 劫持。打开浏览器,就可以正常上网了。

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
proxies:
- name: http
type: http
server: 10.147.20.2 # set your virtual remote IP provided by zerotier
port: 7890
- name: backup
type: http
server: 10.147.20.3
port: 7890

proxy-groups:
- name: Proxy
type: select
proxies:
- http
- backup
- name: Game
type: select
proxies:
- http
- backup


rules:
- DOMAIN-SUFFIX,steampowered,Game
- MATCH, Proxy # all connections fallback to remote

System Proxy 配置

如果不想使用 Clash 做代理软件,也可以直接用 Windows 自带的代理设置,实际上,各种代理软件都是修改这个设置来劫持系统流量的。在 设置 -> 网络和Internet -> 代理 中,选择 手动设置代理 ,并填入对应的 B 机器的虚拟局域网的 IP 和端口,就可以正常代理,并上网了。

测速

image12.png

基本上可以跑满实验室的带宽。

缺点

  1. 只有 PC 可用,而且只能用在 WiFi 上
  2. Zerotier 打洞不稳定,截至 2022.09.29,我用了十几天,有一天存在断流,网速只有 20Mbps

参考
https://kenvix.com/post/use-school-network-without-paying-guide/


使用zerotier实现免费上网
http://hebangwen.github.io/2024/03/14/zerotier-free-web/
作者
何榜文
发布于
2024年3月14日
许可协议