Zerotier 是一个开源的软件平台,旨在简化虚拟专用网络 (VPN) 和软件定义网络 (SDN) 的部署。它允许用户通过互联网创建和管理其自己的私有网络,就像局域网 (LAN) 一样。

Zerotier 提供了一种点对点的网络连接方式,支持端到端加密,确保数据传输的安全性。用户可以在不同设备和操作系统之间快速建立安全的连接,适用于远程办公、物联网设备管理以及分布式团队合作等多种场景。通过其用户友好的界面和广泛的应用支持,Zerotier 是许多个人用户和企业的网络解决方案的首选。

# Planet 服务端搭建

官方的 Planet 根服务器在境外,加速不稳定。理论上可以搭建 MOON 服务器解决这一问题,但 MOON 的解析仍然依赖于 Planet ,经常出现内网解析不到 MOON 的情况,使设备的连接不稳定。

搭建 Zerotier 的 Planet 服务器可以提高网络稳定性,减少对官方服务器的依赖,降低数据传输的延迟,增强网络性能和安全性。私有化根服务器允许用户更好地控制和管理网络流量,并根据特定需求自定义配置。这使得 Zerotier 网络在高性能和高安全性需求的场景中更加稳定、高效。

本文将使用 key-networks/ztncui 组件搭建私有 Planet 服务端并配置客户端。

所需的相关素材如下:

  • 云服务器一台(使用的配置如下,如采用了不同的配置,请自行根据情况调整参数)
    • 拥有固定公网 IP
    • 操作系统 Ubuntu 24.04
    • CPU 2 vCore
    • 内存 1 GB
    • 带宽 200 Mbps

# 服务端配置

# 安装 Zerotier-one (方案 2 选 1)

Debian 和基于 RPM 的发行版(包括 Debian、Ubuntu、CentOS、RHEL、Fedora 等 Linux 发行版)可以通过 Zerotier 提供的官方途径进行安装,官网共提供了两种方案,可以自选其一。

方案一会更简单一些:

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

也可以采用方案二,使用 GPG 进行更加安全的安装:

h
curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import && \  
if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi

# 安装 Ztncui 组件

Ztncui 组件安装可以结合自身 Planet 服务器情况参考 Ztncui 官方网站

h
curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
sudo apt install ./ztncui_0.8.14_amd64.deb

# Ztncui 组件配置

Ztncui 可以配置的属性如下,可根据自身需求选择。

是否需要 参数名 描述 缺省值
Y ZT_TOKEN Zerotier-one 的 Token 配置
N ZT_ADDR Zerotier-one API 端口 localhost:9993
Y NODE_ENV https://pugjs.org/api/express.html production
N HTTP_ALL_INTERFACES HTTP 是否监听所有来源的请求 无缺省值
N HTTP_PORT HTTP_PORT 3000
N HTTPS_HOST HTTPS_HOST 无缺省值
N HTTPS_PORT HTTPS_PORT 无缺省值
Y MYADDR Planet 服务器 IP 地址

样例中的 ServerIP 需要替换为搭建 Planet 服务器的实际 IP 地址。

h
sudo sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
sudo sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo HTTP_ALL_INTERFACES=yes >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo HTTP_PORT=3000 >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env"
sudo sh -c "echo MYADDR=ServerIP >> /opt/key-networks/ztncui/.env"

# Ztncui 运行

进行配置后将 .env 文件进行权限配置,并将所有权转移给 ztncui 用户保证其可以访问。通过重启 Ztncui 服务应用配置。

h
sudo chmod 400 /opt/key-networks/ztncui/.env
sudo chown ztncui.ztncui /opt/key-networks/ztncui/.env
sudo systemctl restart ztncui

# Ztncui WebUI 界面配置

进入 http://ServerIP:HTTP_PORT,显示如下界面说明已经完成了很大一部分啦!

默认账户密码如下,首次登录后会强制要求修改密码。

  • 账号:admin
  • 密码:password

Ztncui WebUI界面

点击顶部 Add Network 建立网络。命名后会自动跳转到该虚拟网络的管理页面。之后的操作会在该虚拟网络的管理界面进行。

Ztncui Add Network界面

使用管理界面中的 Easy Setup 配置 IP 地址段。配置正确的第 1 个参数后点击第 2 或 3 个参数的框会自动填充。

配置的地址段需要是内网地址并且不与已有地址冲突,可用配置的内容如下,可以取他们的子集,不正确配置会造成后续虚拟网络 ip 下发错误。

可用配置的网段
  • 10.0.0.0/8
    • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0/12
    • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0/16
    • 192.168.0.0 - 192.168.255.255

以上三个网段分别属于 A、B、C 三类 IP 地址。

而如地址 172.17.0.0/16(172.17.0.0 - 172.17.255.255)作为 172.16.0.0/12 地址的子集也是可用的。

# Ztncui 私有化 Planet 配置文件生成

使用搭建的 Zerotier-One 客户端加入在 WebUI 中建立的虚拟网络,其中 VirtualNetworkID 为管理页面上自定义的虚拟网络命名右侧的 16 进制 ID 值。

h
sudo zerotier-cli join VirtualNetworkID

查看并保存验证密钥对的公钥 IdentPubkey,保留用于后续制作 Planet 解析文件。

h
sudo cat /var/lib/zerotier-one/identity.public

下载 Zerotier 工具包,用于后续使用官方文件用于编译 Planet 解析文件。

h
git clone https://github.com/zerotier/ZeroTierOne.git
cd ./ZeroTierOne/attic/world

随后通过 Vim 编辑 mkworld.cpp,注释掉一组官方服务器并在相应位置填入正在建立的私有 Planet 服务器的信息。下述代码中的 IdentPubkey 以及 ServerIP 请自行替换。

p mkworld.cpp源文件
roots.push_back(World::Root());
roots.back().identity = Identity("IdentPubkey");
roots.back().stableEndpoints.push_back(InetAddress("ServerIP/9993"));
roots.back().stableEndpoints.push_back(InetAddress("ServerIPv6/9993")); // 如果没有公网 IPv6 地址,请不要添加这一行

mkworld.cpp.webp

编译全新的私有 Plannet 配置文件!

注意,指令 source ./build.sh 将消耗巨量 CPU 资源,请确保服务器 CPU 性能足够,否则推荐在本地或其他服务器进行编译。

h
source ./build.sh
./mkworld
mv ./world.bin ./planet

# 私有化 Planet 配置文件移动到 Zerotier-One 配置文件夹

将私有化 Planet 配置文件移到 Zerotier-One 配置文件夹,并重启 Zerotier-One 服务。

推荐使用 sftp 下载该文件保留备用,用于配置 Zerotier-one 客户端。

h
cp -r ./planet /var/lib/zerotier-one
sudo systemctl restart zerotier-one

# 客户端配置

  • 由于 iOS 设备(不包含 MacOS)极低的自由度, 不支持 自建的 Planet ;
  • Android 设备需要使用 kaaass/ZerotierFix 作为客户端。

# 私有化 Planet 配置

将私有化 Planet 配置文件置入各自的 Zerotier-One 配置文件夹中,备份并替换原有 planet 文件。各个系统 planet 文件默认文件夹如下:

C:\ProgramData\ZeroTier\One

/var/lib/zerotier-one

/Library/Application\ Support/ZeroTier/One/

/etc/config/zero/planet

# 重启 Zerotier-cli 服务

重启 Zerotier-cli 服务应用配置文件。

l
net stop ZeroTierOneService
net start ZeroTierOneService
h
sudo systemctl restart zerotier-one

# 加入服务器

使用管理员权限加入虚拟网络。请替换为自己的 VirtualNetworkID

h
zerotier-cli join VirtualNetworkID

# Moon 服务端搭建

建立 ZeroTier 的 Moon 服务器可以有效降低内网穿透时的延迟,降低区域跨越导致的高延迟问题,从而提供更好的网络体验。

通过自建服务器,可以将服务器放置在更靠近设备的位置,从而提高网络性能。此外,服务器还能为对应区域的设备提供更高的稳定性和带宽,减少网络中断的风险,并增强对服务器配置和管理的灵活性与控制权。

# 服务端配置

相对于 Planet 服务器,Moon 服务器的搭建会简单很多,官方的工具已经提供了成熟的指令。所需的相关素材如下:

  • 云服务器一台(使用的配置如下,如采用了不同的配置,请自行根据情况调整参数)
    • 拥有固定公网 IP
    • 操作系统 Debian 12 x86_64
    • RAM 1GB

# 安装 Zerotier-one

安装方式可以参考 1.1.1 安装 Zerotier-one (方案 2 选 1) 中的方法。

# Zerotier-cli 加入虚拟网络

安装后即可对 Zerotier 开始进行配置了,先作为客户端加入网络中,下面命令中的 VirtualNetworkID 请替换为要加入的虚拟网络的 ID。申请加入后记得在管理 Web 页面通过请求。

h
sudo zerotier-cli join VirtualNetworkID
200 join OK

# Moon 配置模板生成

通过官方工具生成 moon.json 模板。

h
cd /var/lib/zerotier-one
sudo su
zerotier-idtool initmoon identity.public >> ./moon.json
exit

# Moon 配置模板编辑

使用 Vim 文本编辑器在 moon.json 模板文件中的 "stableEndpoints": [] 中填入服务器的固定 IP 地址及端口(默认为 9993):"stableEndpoints": ["IP/9993"]

h
sudo vim moon.json

# Moon 配置文件生成及应用

使用官方工具生成 Moon 配置文件,此时会返回生成的 Moon 配置文件文件名及其对应生成时间戳。

h
sudo zerotier-idtool genmoon moon.json
wrote 000000xxxxxxxxxx.moon (signed world with timestamp yyyyyyyyyyyyy)

将生成的文件移入文件夹 moon.d 中,并重启 Zerotier-one 服务。

h
sudo mkdir moons.d
sudo mv ./000000xxxxxxxxxx.moon ./moons.d
sudo systemctl restart zerotier-one

# 客户端配置

客户端配置就更简单啦~只需要标记 Moon 服务器所在的节点是轨道服务器就可以啦。
Linux、Windows 或 MacOS 客户端均可以进入命令行使用以下指令进行配置(均需要 root / 管理员权限),其中 moonididid 需要替换为 Moon 服务器加入虚拟网络时的节点 ID。

h
# Linux:
sudo zerotier-cli orbit moonididid moonididid
# Windows:
zerotier-cli orbit moonididid moonididid

# 核验 Moon 服务器配置

使用 listpeers 查看对应服务器 ip 的节点是否被标记为 MOON,也可以直接使用 listmoons 指令。

h
zerotier-cli listpeers
zerotier-cli listmoons

# Zerotier 常用操作指令

# 服务端

h
# 启动 Zerotier 服务
sudo systemctl start zerotier-one
# 停止 Zerotier 服务
sudo systemctl stop zerotier-one
# 重启 Zerotier 服务
sudo systemctl restart zerotier-one
# Zerotier 服务状态查询
sudo systemctl status zerotier-one
---
# 列为开机启动服务
sudo systemctl enable zerotier-one
# 取消开机启动
sudo systemctl disable zerotier-one

# 客户端

h
# Zerotier 状态查看
zerotier-cli status
# Zerotier 加入、离开虚拟网络
zerotier-cli join xxxxxxxxxxxxxxxx
zerotier-cli leave xxxxxxxxxxxxxxxx
# Zerotier 加入的虚拟网络列表
zerotier-cli listnetworks

# 参考文献

Ztncui | ZeroTier network controller user interface
ZeroTier | Global Networking Solution for loT, SD-WAN, and VPN
浅谈如何搭建一个完全私有化的 ZeroTier - 哔哩哔哩