ZeroTier 创建私有服务器节点(Moon节点)

没有公网 IP 的 NAS 无异于被阉割的太监。现在各运营商对公网 IP 管理政策来看怕是不会再有了,所以还是另寻它路。

目前常见的有 FRP、NPS、 ZeroTier 等方案。

FRP 是自己搭建一个公网服务器,所有流量经过公网服务器中转。ZeroTier 默认使用官方的一组根服务器进行节点查找。

ZeroTier 也允许自己在服务器上搭建自己的节点,这种节点称之为 moon 节点。 (官方根节点称之为行星节点,自建节点叫月球节点,很合情合理是吧 )

定义自己的 moon 世界

首先使用官方脚本安装 ZeroTier:

curl -s https://install.zerotier.com/ | sudo bash

安装完成后会自动创建服务,并且显示节点 ID:


Created symlink /etc/systemd/system/multi-user.target.wants/zerotier-one.service → /lib/systemd/system/zerotier-one.service.

*** Enabling and starting ZeroTier service...
Synchronizing state of zerotier-one.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable zerotier-one

*** Waiting for identity generation...

*** Success! You are ZeroTier address [ abcxxxxx123 ].

ZeroTier 将被安装在 /var/lib/zerotier-one/ 位置,该目录下包含自己的身份信息文件 identity.publicidentity.secret (相当于公钥和私钥)。

使用 zerotier-idtool 工具从 identity.public 生成 moon 配置文件 moon.json

zerotier-idtool initmoon /var/lib/zerotier-one/identity.public >> moon.json

生成的 moon.json 文件结构如下:

{
 "id": "3f80270f25",
 "objtype": "world",
 "roots": [
  {
   "identity": "xxxx",
   "stableEndpoints": []
  }
 ],
 "signingKey": "xxxx",
 "signingKey_SECRET": "xxxx",
 "updatesMustBeSignedBy": "xxxx",
 "worldType": "moon"
}

编辑上一步生成的 moon.json 文件中的 roots 部份,向 roots.stableEndpoints 部份添加稳定节点信息:

{
  "stableEndpoints": [ "服务器IP:9993" ]
}

使用 zerotier-idtool genmoon moon.json 命令得到一个签名后的文件(使用 moon.json 中定义的密钥签名),文件名类似于: 000000<nodeID>.moon

加入自己的 moon

在各节点,安装完 ZeroTier 后, 在程序安装目录(Linux:/var/lib/zerotier-one、 Mac: /Library/Application Support/ZeroTier/One )内创建名为 moons.d 的目录,将上一步在服务器节点生成的类似于 000000<nodeID>.moon 的文件复制到 moons.d 目录内。

在其它节点,可以通过2种方式加入到 moon 节点: - 将上面创建的世界定义文件 000000<nodeID>.moon 复制到节点自己的 moons.d 目录,并重启服务; - 使用命令 sudo zerotier-cli orbit 000000<nodeID> 000000<nodeID> 加入 moon, orbit 命令的第1个参数是 Moon 节点ID(moon.json 文件的 id 字段), 第2个参数是 moon.json 文件中 roots 字段定义的任意节点,可以与第1个参数相同。

验证

然后在常规节点使用 sudo zerotier-cli listpeers 查看节点时,就能看到 moon 节点的类型已经从 LEAF 变成了 MOON