本文博客园地址:https://www.cnblogs.com/Zhou-Tx/p/17713078.html,非VIP用户可前往免费阅读。
零、引言
众所周知,Zerotier-One是一个非常好的组建虚拟局域网的工具,可以以p2p的方式穿透NAT网络进行连接。但是在使用中也仍然存在着一些瑕疵,主要就是以下两点:
- 因为Zerotier官方提供的中心节点(planet节点)全部都在国外,所以更新路由表的时候,通常会消耗较长的时间,甚至可能失败;
- 官方免费版本最多只支持1个管理员和25个节点。
我这篇博客主要就是针对以上两个问题的解决做了一些记录。
一、加速节点(moon节点)
在原本的使用中,我们每次更新路由表,都是需要连接官方的planet节点,因此我们希望使用一种类似镜像的方式,将路由表缓存到一个能够快速查询的地方,也就是下面所说的moon节点。
moon节点可以理解为多级缓存,当需要更新路由表时,leaf节点会首先请求moon节点查询,如果失败再去planet节点查询;而moon节点会将最新的路由表信息返回,如果没有最新缓存则会再去请求上级节点(moon或者planet)并返回。
创建moon节点的方式很简单,只需要在一台拥有公网ip的服务器上使用命令生成即可,步骤如下:
1、安装zerotier
# 使用官方提供的脚本一键安装
curl -s https://install.zerotier.com | sudo bash
2、生成moon配置文件
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
3、在配置文件中添加公网IP地址
在moon.json
文件中,roots
下有一项stableEndpoints
,在里面加入自己的公网ip和zerotier端口(9993),例如:
{
"stableEndpoints": ["47.102.205.100/9993"]
}
注意点1:填的一定是公网IP,IPv4和IPv6均可,端口默认为9993不需要更换。
注意点2:服务器防火墙需要开放9993端口(注意是UDP)。
4、使用moon配置文件生成moon签名文件
cd /var/lib/zerotier-one
zerotier-idtool genmoon moon.json
这一步会生成一个*.moon
格式的文件,例如0000000ac535316c.moon
。
5、将moon文件移动到moons目录下,并重启zerotier-one服务
mkdir /var/lib/zerotier-one/moons.d
mv /var/lib/zerotier-one/*.moon /var/lib/zerotier-one/moons.d/
systemctl restart zerotier-one.service
至此,moon节点就算搭建好了
6、在leaf节点中导入moon
将上述生成的*.moon
文件下载至本地,放到对应目录下,并重启zerotier-one服务。
Windows 系统 放在
C:\ProgramData\ZeroTier\One\moons.d\
Linux 系统 放在/var/lib/zerotier-one/moons.d/
在管理员模式下使用命令行查看
sudo zerotier-cli peers # 此命令 Windows 和 Linux 相同
就可以看到自己新创建的moon节点了(role为MOON, path为自己的公网IP)
二、搭建私有服务器
官方免费版本最多只支持1个管理员和25个节点,前者倒不是很重要,但后者对于我们这些经常自己搭私服玩游戏的人来说就有点不太够用了,因此只能自建私有服务器来解决。
1、Restful API / Sockets API
Zerotier本身提供了Restful API 和主流程序语言的sdk,有兴趣的可以自行查阅文档https://docs.zerotier.com
2、使用ztncui图形化用户界面控制
ztncui
(ZeroTier Network Controller User Interface)是由key-networks
开源的zerotier图形化用户界面。仓库地址:https://github.com/key-networks/ztncui,有兴趣的可以自行编译部署。
3、使用容器部署ztncui
与大多数编译安装的应用类似,编译部署ztncui也需要先安装其必备的环境、配置各项参数,并不方便。因此,我选择了云原生方式,使用Docker
容器部署ztncui。仓库地址:https://github.com/key-networks/ztncui-containerized
3.1、拉取镜像
docker pull keynetworks/ztncui:latest
这里我们使用latest
版本号,因为与zerotier-one
一样,zerotier
也仍在不断迭代新版本。
3.2、启动容器
因为我们只需要使用ztncui这一个进程,所以我们将entrypoint
修改为/start_ztncui.sh
。
docker run -itd \