简介

ZeroTier可以使用官方的服务器来组建虚拟内网,但是由于官方的服务过慢,所以我们一般会自己来创建节点。有如下的两种节点:

  • Moon节点
    • 官方提供的自建节点方式,连接稳定
    • 有点类似于在VPS上做了一个中转节点(所以也叫Moon中转服务器)
    • 还是需要注册官方账号,虚拟网络的管理也在官方网站页面上
    • IOS无法使用
  • Planet节点
    • 核心还是ZeroTier One官方软件
    • 使用大神github.com/key-networks/ztncui制作的一个网页管理界面
    • 可以不再需要在官方网站注册,虚拟网络的管理也在自己的VPS上
    • 没有官方网络数量与设备连接数的限制
  • Moon节点与Planet节点的共同点
    • 都是需要先安装ZeroTier官方客户端到VPS
    • Planet节点可以不去手动安装,而直接用docker(本文没有介绍docker方式,可以自行网上搜索)

本文介绍了这两种节点的安装方式,实际使用中我选择的是Planet节点方式,如果没有很强迫症的要求建议使用moon节点方式

Linux上安装ZeroTier客户端

  • 客户端的安装与启动
# 安装ZeroTier客户端
# 安装完成后会自动启动客户端并加入开机启动
curl -s https://install.zerotier.com/ | sudo bash

# 查看ZeroTier客户端运行状态
# 返回active就是正常
systemctl status zerotier-one

# 如果没有自动启动可以使用如下命令启动、加入开机启动
systemctl start zerotier-one
systemctl enable zerotier-one

Moon节点服务器

VPS上的安装

# 下列的"xxxxxxxx"是上述第二步获得的Network ID
zerotier-cli join xxxxxxxx
  • 生成配置文件
# 进入配置文件夹生成配置文件
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public >> moon.json
  • 编辑/var/lib/zerotier-one/moon.json配置文件的如下行加入公网IP与端口
"stableEndpoints": ["Server/9993"]
  • 生成签名文件
    • 执行这步会生成一个000000xxxx.moon的文件
zerotier-idtool genmoon moon.json
  • 将moon节点加入网络
# 创建moons.d文件夹
mkdir /var/lib/zerotier-one/moons.d
mv /var/lib/zerotier-one/000000xxxx.moon /var/lib/zerotier-one/moons.d/000000xxxx.moon

# 重启中转服务器
systemctl restart zerotier-one
  • 开启9993防火墙UDP端口

Windows客户端设置

  • 官网下载客户端并安装
  • 运行后加入虚拟网络
  • 使用自建的moon节点
# 下列命令中的xxxxxxxx即VPS上的ZeroTier节点ID
# 可以在VPS上运行zerotier-cli info查看
# 也可以在官网的Network管理页面查看
'C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat' orbit XXXXXXXX XXXXXXXX

# 使用如下命令查看是否添加成功
'C:\Program Files (x86)\ZeroTier\One\zerotier-cli.bat' listpeers

Linux客户端设置

# 使用moon节点
zerotier-cli orbit XXXXXXXX XXXXXXXX

# 查看moon节点是否添加成功
zerotier-cli listpeers

Planet节点服务器

VPS上的安装

  • 按照Linux上安装ZeroTier客户端的步骤先安装好客户端

  • 编译planet文件【可选】

    • 编译环境的安装
    apt install wget gcc g++ git nlohmann-json3-dev -y
    
    • 记录VPS上/var/lib/zerotier-one/identity.public/var/lib/zerotier-one/authtoken.secret下的两个字串(每台机器都不一样,根据自己的实际来)
    • 下载并编译配置文件
      • 编译可以在任意的linux机器上编译,没必要一定在vps上编译
      • 可以添加两个自己的服务器
    # 克隆仓库
    git clone https://github.com/zerotier/ZeroTierOne.git
    
    # 进入目录
    cd ZeroTierOne/attic/world/
    
    # 修改mkworld.cpp的代码(大概在85行左右)
    # 删除公共服务器,并修改为自己的服务器
    roots.push_back(World::Root());
    roots.back().identity = Identity("填写identity.public里的字符串");
    roots.back().stableEndpoints.push_back(InetAddress("服务器IPv4地址/9993"));
    roots.back().stableEndpoints.push_back(InetAddress("服务器IPv6地址/9993"));
    
    # 编译并生成planet文件
    source ./build.sh
    ./mkworld
    mv ./world.bin ./planet
    
    # 替换VPS上/var/lib/zerotier-one/planet文件
    cp planet /var/lib/zerotier-one/planet
    
    # 重启客户端
    systemctl restart zerotier-one.service
    
    • 注意:这个编译好的planet文件是要替换每个加入到此网络的planet文件的,所以一定要保存好
  • ztncui的安装

# 下载安装包
curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.13_amd64.deb

# 安装deb包
apt install ./ztncui_0.8.13_amd64.deb

# 添加环境变量设置网页访问端口
sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env"
sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"
chmod 400 /opt/key-networks/ztncui/.env
chown ztncui.ztncui /opt/key-networks/ztncui/.env

# 启动ztncui
systemctl restart ztncui
  • 防火墙打开3443端口

虚拟网络的设置

  • 访问https://ServerIP:3443管理网络
    • 默认用户名为admin,密码为password
    • 第一次登陆后应修改密码
  • 创建虚拟网络(Add network)
  • 点击Easy setup设置虚拟网络IP地址

Windows客户端设置

  • 停用服务ZeroTierOneService
  • 用之前编译的planet替换客户端中的文件
  • 启用服务ZeroTierOneService
  • 安装客户端
  • 加入虚拟网络

Linux客户端设置

  • 按照Linux上安装ZeroTier客户端的步骤先安装好客户端
  • 用之前编译的planet替换客户端中的文件
  • 重启客户端
  • 运行后加入虚拟网络即可

zerotier-cli常用命令

# 查看本机信息
zerotier-cli info

# 显示所有的连接节点
zerotier-cli listpeers

# 显示所有连接的网络
zerotier-cli listnetworks

# 加入虚拟网络
zerotier-cli join <network ID>

# 离开虚拟网络
zerotier-cli leave <network ID>

# 加入一个moon节点(一般<world ID>和<seed>是相同的)
zerotier-cli orbit <world ID> <seed>

# 离开一个moon节点
zerotier-cli deorbit <world ID>

# 显示所有连接的moon节点
zerotier-cli listmoons

zerotier controller常用命令示例(curl)

# 设置authtoken令牌变量
TOKEN=$(sudo cat /var/lib/zerotier-one/authtoken.secret)

# 设置节点ID变量
NODEID=$(zerotier-cli info | cut -d " " -f 3)

# 创建网络并设置网络名称为"TestNetwork"
curl -X POST "http://localhost:9993/controller/network/${NODEID}______" -H "X-ZT1-AUTH: ${TOKEN}" -d {"name": "TestNetwork"}

# 列出所有网络
curl "http://localhost:9993/controller/network" -H "X-ZT1-AUTH: ${TOKEN}" 

# 设置NetworkID变量
NWID=your-network-id

# 获取网络的信息
curl "http://localhost:9993/controller/network/${NWID}" -H "X-ZT1-AUTH: ${TOKEN}" 

# 设置网络参数(比如此处设置了ip分配范围、路由等)
curl -X POST "http://localhost:9993/controller/network/${NWID}" -H "X-ZT1-AUTH: ${TOKEN}" \
-d '{"ipAssignmentPools": [{"ipRangeStart": "10.1.1.1", "ipRangeEnd": "10.1.1.254"}], "routes": [{"target": "10.1.1.0/24", "via": null}], "v4AssignMode": "zt", "private": true }'

# 列出某个网络的所有用户
curl "http://localhost:9993/controller/network/${NWID}/member" -H "X-ZT1-AUTH: ${TOKEN}" 

# 设置用户ID变量
MEMID=a-member-node-id

# 获取用户信息
curl "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}" 

# 授权一个用户并设置用户的IP
curl -X POST "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}" -d '{"authorized": true, "ipAssignments":["10.1.1.97"]}'

# 取消一个用户的授权
curl -X POST "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}" -d '{"authorized": false}'

# 删除一个用户
curl -X DELETE "http://localhost:9993/controller/network/${NWID}/member/${MEMID}" -H "X-ZT1-AUTH: ${TOKEN}"

FAQ

apt显示密匙错误

这个错误一般是由于系统没有安装gnupg,安装上这个软件包即可通过源的密匙验证。

planet文件位置

  • windows的在C:\ProgramData\ZeroTier\One文件夹下
  • Linux的在/var/lib/zerotier-one文件夹下

Almalinux9.0缺失libssl.so.10

/etc/yum.repos.d/zerotier.repo中的baseurl=http://download.zerotier.com/redhat/el/7改为:baseurl=http://download.zerotier.com/redhat/el/9,然后用命令sudo dnf install zerotier-one安装即可