ZeroTier 01: 搭建自己的Planet服务器

在上一章介绍了ZT的一些特性,现在我们来开始搭建自己的网络。

在本章,我们将从头开始搭建自己的Planet/Root服务器,使用ztncui搭建控制器,并介绍Linux和OpenWRT下的配置。本章我们将把网络整个打通。

注:“自己的”指的是完全独立于zerotier.com的网络,我们将不使用官方提供的控制器,所以也无需在官网注册帐号。

1 搭建自己的ZT网络

1.0 目标和环境准备

由于我们要搭建完全独立于官方节点的网络,所以我们要搭建自己的Root服务器,或者说是Planet。然后我们要在客户端配置使用自己的Planet服务器。要实现图形化的网络管理,我们还需要在Planet上搭建控制器ui。

因此,我们需要以下设备:

  • 具有公网的云服务器一台,用来搭建Planet和控制器
  • 客户端一台,我们这里使用Linux和OpenWRT为例
  • 有需要的话,可以多准备几台云服务器来组Moon
  • 如果你不想在云服务器上安装gcc编译环境(用于生成planet配置文件),你还需要另外准备一台PC

1.1 安装ZeroTierOne

正如上一章对ZT白皮书的解析,所有的节点运行的其实是同一套软件,因此我们需要把所有涉及到组网的节点都安装上官方提供的ZeroTierOne。

安装方法可参考官方教程 https://www.zerotier.com/download/

  • Windows:直接运行安装程序即可
  • Linux常见发行版:运行官方提供的脚本即可,此脚本会自动给系统添加软件源,并自动安装。
  • OpenWRT:直接从软件源安装zerotier即可

安装完成后,可能会显示一下你的节点ID,这个可以不用记录,后续有非常多的方式获取。

1.2 安装ztncui

现在我们需要安装控制器UI。为了省事将ztncui安装到未来作为Root的节点上。对于高级用户也可以不安装,但只能使用ZeroTierOne提供的JSON接口来操作各种动作。

晚上的控制器UI五花八门,但其实大家都只做了一件事:提供一个web界面,读取ZeroTierOne的secrets配置文件,向ZeroTierOne发送请求。这里只是以ztncui为例,你也可以选择自己喜欢的控制器UI。

ztncui部署可参考 https://key-networks.com/ztncui/#installation,我们以DEB installation为例说明一下。

第一步,按照1.1安装好ZeroTierOne

第二步,下载并安装软件包

curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.13_amd64.deb
sudo apt install ./ztncui_0.8.13_amd64.deb

安装完成后,ztncui应该已经在运行了。默认以HTTP方式监听本机(localhost)的3000端口,此时已经可以访问了。如果不行,执行systemctl start ztncui即可。

第三步,登陆ztncui。

默认用户名admin 密码password,第一次登陆会要求修改密码,建议修改为复杂密码。

由于ztncui默认监听本机3000端口,你可以采用SSH端口映射的方式访问云服务器的localhost端口:

ssh username@1.2.3.4 -L 3000:localhost:3000

然后浏览器打开localhost:3000

如果页面显示没有权限访问本机的ZeroTierOne,可以临时修改下secret文件权限。

ztncui报错无法访问authtoken.secret
chmod 750 /var/lib/zerotier-one/authtoken.secret

刷新下页面,现在ztncui就准备就绪了。我们晚点再建立网络,因为现在ZeroTierOne默认连接上了官方提供的Planets,一旦此时创建,你的网络ID就会立即被上传。如果你不介意,也可以先创建网络。

如果你只是想“白嫖”zerotier.com的基础设施的话,到这一步就结束了。在ztncui创建个网络,这个网络会立即上传到官方planets,只要你在ztncui勾选允许,别人已经可以使用这个网络id,从世界各地连接到你创建的网络了。

而如果你想与zerotier.com的所有服务隔绝联系,我们接下来配置自己的planet/root服务器。

哦补充一点,为了安全,你也可以配置下ztncui的HTTPS。按照官方的后续步骤来就可以了。

1.3 配置Planet

1.3.1 生成planet配置文件

当你想在ZT官方寻找文档,如何绕过my.zerotier.com搭建自己的服务,是找不到的。文档里只说明了如何搭建围绕官方Planets的Moon服务器。(毕竟官方控制器免费用户有节点数额限制。赚钱嘛,不寒碜!)

但如果你查看ZeroTierOne的配置文件,发现里面有个planet文件。因此planet肯定是可以自己配置的,只不过官方把这个方法藏起来了。

经过网友的一番“指点”(真的很讨厌那些直接丢出个自建Docker镜像,“拿去用吧,都给你配好了,后续会不会随着官方更新,我就不保证了”这些作者),我们在官方源代码中可以找到这个文件夹:https://github.com/zerotier/ZeroTierOne/tree/dev/attic/world

官方提供的planet生成工具

这不就是我们需要的嘛。根据mkworld.cpp的指引,要生成自己的planet文件,应该这么做:

先把仓库下载下来

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

第一步,进入要成为Planet服务器的ZeroTierOne配置目录,把identity.public文件内容复制出来

cd /var/lib/zerotier-one
cat identity.public

第二步,编辑mkworld.cpp,删除已有的官方节点,替换成自己的identity和ip

填入Root节点的相关信息

如果有多个Root,就照着这个模板多添加几次。Root本身的配置也要修改,可参考1.3.2小节。

第三步,执行build.sh,此时会编译,生成mkworld文件

cd /path/to/ZeroTierOneGit/attic/world

第四步,执行mkworld文件,就会生成world.bin了

➜  ~ $ cd apps/ZeroTierOne/attic/world 
➜  world $ ./build.sh 
➜  world $ ./mkworld 
INFO: generating and signing id==149604618 ts==1567191349589
INFO: world.bin written with 276 bytes of binary world data.

#define ZT_DEFAULT_WORLD_LENGTH 276
static const unsigned char ZT_DEFAULT_WORLD[ZT_DEFAULT_WORLD_LENGTH] = xxxxxx

第五步,将world.bin复制到其他下游客户端文件夹,并替换planet即可。

scp ./world.bin root@client-node:/var/lib/zerotier-one/planet

1.3.2 不同节点的planet配置

上面的5步只是笼统的步骤。现在对第二步展开详细说说:不同节点所需要的配置是不同的。

对于客户端来说,需要知道所有的自建Planets,所以要把所有的Planets服务器信息都包括进去。

对于Planet本身来说,仅仅需要知道其他Planets信息,所以,每个Planet服务器的planet文件应当都不包含自身。(其实配置了自身也是可以的,但是考虑到云主机网卡配置的往往是内网IP,如果在planet文件中写入自己的公网IP的话,数据可能从本机发出,到云服务提供商的网关后,才能回来,从而可能产生额外的费用 )更新:不用在乎这些,Planet会判断是不是自己。

另外可能需要注意体系结构的问题。如果想在ARM设备上替换planet,可能需要交叉编译,毕竟这个planet配置是写在源代码里编译再以二进制方式输出到文件的,而且稍微看了一下好像涉及C++的序列化、反序列化过程,这样生成的文件应该是无法跨架构平台的。(当然这个只是猜想,手上暂时没有ARM服务器,无法验证😃)

1.4 不同平台客户端配置Planet

Windows略。

1.4.1 Linux客户端配置Planet

直接使用生成的world.bin覆盖/var/lib/zerotier-one/planet文件即可,不展开了。覆盖完记得设置权限。

1.4.2 OpenWRT配置Planet

由于OpenWRT将/var挂载在内存中,意味着每次重启,/var下所有文件将被还原;再加上OpenWRT对配置系统的魔改(UCI的存在),需要花些心思了解如何持久化地部署ZeroTier。

具体请查看下一节:ZeroTier 03:OpenWRT上部署ZeroTier客户端。

《ZeroTier 01: 搭建自己的Planet服务器》有2条评论

  1. 话说,云服务器部署的planet,两个node互相访问还需要经过planet转发么?
    也就是是node – node还是 node – planet – node。毕竟第二种会受限于planet的速度

    回复
    • 优先走的node-node,如果node2node连接不稳定,则会回退到node-planet-node模式,并不断探测node-node是否可以通,如果又通了,则再次走node-node

      回复

发表评论