自建根服务器

对于 zerotier 根服务器在国外,高延迟且连接不稳定的问题,此前尝试过自己部署 moon 节点,不过虚拟局域网内的设备想要通过 moon 节点直连还是需要先通过根服务器与 moon 节点取得联系(仅仅是取得联系即可,对带宽延迟都没有太大要求,所以之前处在勉强可用的状态)然而最近 zerotier 的官方根服务器似乎彻底被墙死,moon 节点也几乎不可用。为了继续正常使用 zerotier,开始考虑自建 zerotier 根服务器的方案。

最终找到了基于 ztncui 优化而来的 zerotier-planet 项目,简单而言就是用 docker 部署一个独立的 zerotier 虚拟网络。
部署这个项目的全部准备只有在你的公网服务器上安装好 docker 和 docker-compose

jonnyan404 已经写好了 zerotier-planet 的 docker 配置脚本,我们只需要从 gitee 上 clone 下来即可

git clone https://gitee.com/Jonnyan404/zerotier-planet

然后进入相应文件夹

cd zerotier-planet

修改配置文件

vi docker-compose.yml

填写你的服务器的公网 ip 地址

然后就可以通过 docker-compose 启动 docker

docker-compose up -d

此时可以通过 http://ip:4000 访问后台页面(记得开放服务器 4000 端口)
后面的操作就和 zerotier 部署一样了

替换 planet 文件

此时你自建的根服务器已经可以正常运行了,但是如果你使用 zerotier-cli peers 查看虚拟局域网中的设备,你会发现你自己的根服务器是以leaf的身份运行的,而官方的根服务器依旧在设备列表中占据了 planet 的位置。虽然完全不影响使用,但是看着终归有些不爽。

这时候你需要重新编译并替换局域网中所有设备的 planet 文件

查看认证信息

进入 docker 挂载的 zerotier-one 目录
查看 identity.public 和 authtoken.secret 中记录的认证信息,记录下来

编译 planet 文件

  • 下面的步骤可以在任意一台机子上完成,只需要最后编译好的 planet 文件
  • 如果不想在云服务器上编译,完全可以在自己的 linux 虚拟机中进行

先下载 zerotier 源码

git clone https://github.com/zerotier/ZeroTierOne

进入源码目录

[root@cloud zerotier-one]# ls
authtoken.secret  controller.d  identity.public  identity.secret  networks.d  planet  zerotier-cli  zerotier-idtool  zerotier-one  ZeroTierOne  zerotier-one.pid  zerotier-one.port  zerotier-one.te

进入目录ZeroTierOne

[root@cloud zerotier-one]# cd ./ZeroTierOne
[root@cloud ZeroTierOne]# ls
artwork         controller            Dockerfile.ci          java           make-mac.mk                one.cpp           RELEASE-NOTES.md  tcp-proxy              zeroidc
attic ...

进入attic/world

[root@cloud ZeroTierOne]# cd attic/world/
[root@cloud world]# ls
build.sh  current.c25519  mkworld  mkworld.cpp  planet  previous.c25519  README.md  world.c

修改 mkworld.cpp

[root@cloud ZeroTierOne]# vim mkworld.cpp

找到其中的 roots.push_back,这里的四个就是默认的根服务器
image.png
将他们都注释掉,添加你自己的:
将之前记下的 identity.public 中的字符串写入 Identity 中
InetAddress写服务器公网ip,端口为9993

 roots.push_back(World::Root());
        roots.back().identity = Identity("identity.public中的字符串");
        roots.back().stableEndpoints.push_back(InetAddress("公网IP/9993"));

回到 world 目录下,执行:

source ./build.sh
./mkworld
mv ./world.bin ./planet

你就会得到新的 planet 文件

将虚拟局域网内设备 zerotier 根目录下的 planet 文件用这份新的 planet 文件替换后重启服务

  • Windows下planet位置:C:\ProgramData\ZeroTier\One
  • Linux下planet位置:/var/lib/zerotier-one
    再使用 zerotier-cli peers 命令,就会发现 planet 变为你自己的服务器了
    image.png|400