通过Zerotier实现校园网内服务器的虚拟局域网连接

https://www.do1e.cn/posts/citelab/connecting-campus-network-servers-via-zerotier

前言

前段时间服务器搬迁，搬出了校园网的环境，但是实验室的 GPU 服务器还在校园网环境内，导致无法直连，必须使用学校的 VPN 才能访问。
但众所周知，学校的官方 VPN 体验巨差，因此想着自己用开源工具实现一个组内自用的方案。

于是就想到使用 zerotier 组一个虚拟局域网（具体原理不在此赘述了，你只需要知道加入虚拟局域网后，设备之间即使不在同一个局域网下，也能通过虚拟局域网 IP 实现 P2P 连接，具有很好的体验）。
但是实验室中的服务器一般不会连接到互联网上，因此并不能直接把服务器接入到 zerotier 中，只能探索其他方案了。

以下是我的完整解决方案。

自建 zerotier planet

这一部分我是完成参考的下述 Github 仓库，在此也不做过多赘述。

按照其 README 搭建好 planet 服务器后，所有加入网络的机器之间就可以相互访问了，但是正如前言中所述，实验室的服务不能直接接入其中，需要使用另一台机器转发。

zerotier 的转发

正好我在校内有一台自用的服务器（下文中将其成为转发服务器），我的主页等等服务均运行在上面。我可以将它加入到虚拟局域网，并让它帮我转发与服务器连接的流量即可。

假设转发服务器有校内 IP 172.26.1.2 和虚拟局域网 IP 10.11.1.2，实验室服务器均为校内 IP 114.212.1.101 到 114.212.1.105。

首先进入上述配置好的 zerotier planet 后台，将转发服务器的 Active bridge 勾选上，才能允许其转发流量。

转发服务器的配置

首先需要开启转发功能，标记 /etc/sysctl.conf 文件，将 net.ipv4.ip_forward 修改为 1，没有的话加一行，接着运行下述命令

Copy
sudo sysctl -p # 转发配置立即生效
# 配置转发
PHY_IFACE=enp5s0 # 根据网卡自行修改
ZT_IFACE=ztlowm7c2d # 根据网卡自行修改

iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT

上述 iptables 重启后会失效，可以自行搜索永久配置方法。

客户端配置

虽然可以在 zerotier planet 后台配置 routes，填写Target=114.212.0.0/16, Gateway=10.11.1.2，让客户端自行下载相关路由表，将发送到实验室服务器的流量发送到转发服务器上。
但由于114.212.0.0/16是公网 IP 的范围，zerotier 并不会下发这个路由。（其他的内网 IP 端，比如172.26.0.0/16是可行的）。

因此还需要每个客户端自行添加相关的路由。这一步也是我卡了很久的地方，具体方法如下：

Windows

首先运行route print，找到 ZeroTier Virtual Port 对应的编号，如下述示例为 11。

Copy
> route print
Interface List
5...xx xx xx xx xx xx ......Microsoft Wi-Fi Direct Virtual Adapter
3...xx xx xx xx xx xx ......MediaTek Wi-Fi 6E MT7922 (RZ616) 160MHz Wireless LAN Card
11...xx xx xx xx xx xx ......ZeroTier Virtual Port

接着运行route add 114.212.0.0 mask 255.255.0.0 10.128.3.4 if {No} metric 1（请将 {No} 替换为前面得到的编号）

Linux

首先运行ifconfig，查看 ZeroTier 对应的接口，一般为 zt 开头

接着运行sudo ip route add 114.212.0.0/16 via 10.128.3.4 dev {Interface} metric 1（请将 {Interface} 替换为前面得到的接口名称）

MacOS

route add -net 114.212.0.0/16 10.128.3.4 -hopcount 1（AI 结果，未经验证）

注意：每次重启后都需要执行上述路由配，或者自行查找永久配置方法，但不建议笔记本永久配置。