外观
ZeroTier组网的简单应用
2024-07-01
需求
在不同地点的网络设备虚拟组网
虚拟网络中各设备可以访问
172.16.60.0/23
内网网段设备
创建 ZeroTier 虚拟网络
参考官方文档
配置 moon 节点
直接通过 ZeroTier 官方节点建立网络连接延迟太高,使用本地服务器建立 moon 节点进行加速。
- 基础配置
# 安装zerotier-one
curl -s https://install.zerotier.com | sudo bash
# 加入创建好的虚拟网络
sudo zerotier-cli join xxxxxxxx
在 ZeroTier Central 网络管理的 Members 中选择该设备进行授权,并勾选Allow Ethernet Bridging
。
- 生成并应用 moon 配置
# 生成moon配置文件
cd /var/lib/zerotier-one
sudo zerotier-idtool initmoon identity.public >> moon.json
# 编辑配置文件
# 将"stableEndpoints": [] 修改成 "stableEndpoints": ["ServerIP/9993"],ServerIP是服务器的公网IP
# 生成moon文件
sudo zerotier-idtool genmoon moon.json
# 查看生成的moon文件
ls /var/lib/zerotier-one
# 应用moon文件
sudo mkdir moons.d
sudo mv 000000xxxxxxxxxx.moon moons.d
sudo service zerotier-one restart
- 使用 moon 节点
sudo zerotier-cli orbit xxxxxxxxxx xxxxxxxxxx
# 这里xxxxxxxxxx是前面生成的moon文件除了那些0之外的部分,即节点ID
- 如何检查是否成功应用 moon 节点
sudo zerotier-cli listpeers
该命令会输出一行有关 moon 的信息,如果没有成功应用,应该类似于200 listpeers xxxxxxxxx - -1 - MOON
,通常情况下是防火墙的问题,需要打开9993/udp
,包括服务器防火墙、运营商安全组之类的。
也可以通过虚拟网络中设备相互 ping 看延迟检查,如果成功应用 moon 节点,相互 ping 的延迟最坏情况下是比各自 ping moon 节点延迟之和略高几 ms。以我的网络为例,A 设备与 moon 节点 ping 约 30ms,B 设备与 moon 节点 ping 约 20ms,无 moon 节点时 AB 互 ping 约 300+ms,moon 节点生效时互 ping 约 30+ms。
与物理网络组网
参考Route between ZeroTier and Physical Networks
- 网络说明
希望加入了 ZeroTier 虚拟网络的设备可以访问172.16.60.0/23
内网网段设备,该网段的默认网关及其它设备的配置无法修改,我有一台可以作为跳板机的内网服务器。
- 配置 ZeroTier 虚拟网络
配置 ZeroTier 自动分配 ipv4 地址池为172.16.58.0
到172.16.59.254
。在 ZeroTier Central 的网络管理中,添加 route:destination 为172.16.58.0/23
,空置 via,提交后显示172.16.58.0/23 (LAN)
。
- 配置内网服务器
在内网服务器上安装 zerotier-one 并加入虚拟网络,在 ZeroTier Central 网络管理的 Members 中选择该网络进行授权,并勾选Allow Ethernet Bridging
。
假定该服务器的地址为172.16.58.58
,它在内网中的地址为172.16.61.61
。此时应该可以从 moon 节点使用172.16.58.58
正常访问到该内网服务器。
在 ZeroTier Central 的网络管理中,添加 route:destination 为172.16.60.0/22
,via 为172.16.58.58
,提交后显示172.16.58.0/23 via 172.16.58.58
。
注意!!!这里的掩码必须要大于该网络本来的掩码!!! 官方解释如下:
Configure the destination route as slightly larger than the actual physical subnet, here /23 instead of /24 (a smaller number is a bigger subnet in this notation) This makes devices that are on both the physical and the ZeroTier network prefer the physical connection.
回到内网服务器配置 NAT:
# 查看网络接口
ip a
# 找到172.16.58.58对应的ztxxxx,以及172.16.61.61对应的enpxxxx
PHY_IFACE=enpxxxx
ZT_IFACE=ztxxxx
# 配置NAT
sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
持久化路由表,使重启有效:
# 持久化
sudo apt install iptables-persistent
# 备份iptables
sudo cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak
# 更新路由表
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
至此,所有加入 ZeroTier 的设备均可以直接访问172.16.60.0/23
网段的内网设备了。但是如果内网设备想访问172.16.58.0/23
网段设备,仍然需要加入 ZeroTier 虚拟网络。