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.public 和 identity.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