Zerotier自建节点
文章目录
简介
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上的安装
-
按照Linux上安装ZeroTier客户端的步骤先安装好客户端
-
到zerotier.com上注册并创建一个Network,获得创建的Network ID
-
将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客户端设置
- 按照Linux上安装ZeroTier客户端的步骤先安装好客户端
- 运行后加入虚拟网络
- 使用自建的moon节点
# 使用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文件的,所以一定要保存好
# 下载安装包
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
- 手动安装
# 安装基础依赖
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
- 用脚本安装**(推荐)**
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
- 启动docker
systemctl enable docker
systemctl start docker
- 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
启动容器
- 建立目录
mkdir -p /data/docker/ztncui-01
cd /data/docker/ztncui-01
- 建立
denv
文件如下:
NODE_ENV=production
HTTPS_PORT=3443
ZTNCUI_PASSWD=password
AUTOGEN_PLANET=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
- 运行第二个容器
# 端口、容器名字、卷的位置按自己的修改
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
- 打开防火墙的端口(如上为
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
安装即可
文章作者 Evan Yu
上次更新 2022-08-22