简介

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}"

ztncui-aio

ztncui-aio是用docker的方式部署私有的zerotier服务器和ztncui网页控制客户端,可以在一台vps上运行多个ztncui,而相互之间是隔离的:

安装docker

  1. 手动安装
# 安装基础依赖
apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

# 用国内docker源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装docker
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
  1. 用脚本安装**(推荐)**
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
  1. 启动docker
systemctl enable docker
systemctl start docker
  1. docker镜像加速(可选但推荐)

编辑/etc/docker/daemon.json文件:

{
  "registry-mirrors": [
    "https://docker.nju.edu.cn",
    "https://docker.m.daocloud.io"
  ]
}

重启docker服务

systemctl daemon-reload
systemctl restart docker

获取ztncui-aio镜像

docker pull ghcr.io/kmahyyg/ztncui-aio

启动容器

  1. 建立目录
mkdir -p /data/docker/ztncui-01
cd /data/docker/ztncui-01
  1. 建立denv文件如下:
NODE_ENV=production
HTTPS_PORT=3443
ZTNCUI_PASSWD=password
AUTOGEN_PLANET=1
  1. 运行第一个容器
# 端口、容器名字、卷的位置按自己的修改
docker run -d -p13443:3443 -p13180:3180 -p19993:9993/udp \
    -v /data/docker/ztncui-01/ztncui:/opt/key-networks/ztncui/etc \
    -v /data/docker/ztncui-01/zt1:/var/lib/zerotier-one \
    -v /data/docker/ztncui-01/zt-mkworld-conf:/etc/zt-mkworld \
    --env-file ./denv \
    --restart always \
    --cap-add=NET_ADMIN --device /dev/net/tun:/dev/net/tun \
    --name ztncui-01 \
    ghcr.io/kmahyyg/ztncui-aio
  1. 运行第二个容器
# 端口、容器名字、卷的位置按自己的修改
docker run -d -p23443:3443 -p23180:3180 -p29993:9993/udp \
    -v /data/docker/ztncui-02/ztncui:/opt/key-networks/ztncui/etc \
    -v /data/docker/ztncui-02/zt1:/var/lib/zerotier-one \
    -v /data/docker/ztncui-02/zt-mkworld-conf:/etc/zt-mkworld \
    --env-file ./denv \
    --restart always \
    --cap-add=NET_ADMIN --device /dev/net/tun:/dev/net/tun \
    --name ztncui-02 \
    ghcr.io/kmahyyg/ztncui-aio
  1. 打开防火墙的端口(如上为TCP: 13443, 23443, 13180; UDP: 19993, 29993),并访问https://vps_ip:13443即可访问到网页管理页面,进入页面后应先修改密码(默认用户名为admin,默认密码为password)。

编译planet

编译的步骤在这里。其中的identity.public/data/docker/ztncui-01/zt1目录下,编译时特别注意修改9993的端口

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安装即可