一、引言

在阅读这个教程前,读者最好对 ZeroTier 有一定了解,比如至少使用过官方服务器。如果自建过 Moon 中转服务器,理解起来更快。因为自建 Planet 其实就是拿 Moon 作为唯一中转,排除官方服务器节点。

二、正文

(一)部署 ztncui(带前端的 Moon)

环境变量的含意可以参考下官方文档 ztncui-aio

# 填入自定义 token;将 MYADDR 改为你的公网 IP;设置默认密码,第一次登录后需要修改
docker run -d \
  --name='ztncui' \
  --net='host' \
  -e TZ="Asia/Shanghai" \
  -e 'HTTP_ALL_INTERFACES'='yes' \
  -e 'NODE_ENV'='production' \
  -e 'ZT_TOKEN'='########################' \
  -e 'MYADDR'='1.1.1.1' \
  -e 'ZTNCUI_PASSWD'='password' \
  -v '/opt/ztncui':'/opt/key-networks/ztncui/etc/':'rw' \
  -v '/opt/zt1':'/var/lib/zerotier-one/':'rw' \
  'keynetworks/ztncui'

(二)拉取脚本并执行

# 拉取仓库
git clone https://github.com/Jonnyan404/zerotier-planet
# 执行
cd zerotier-planet
docker cp mkmoonworld-x86_64 ztncui:/tmp
docker cp patch.sh ztncui:/tmp
docker exec -it ztncui bash /tmp/patch.sh

打开patch.sh能看见前面设置的环境变量MYADDR在这里用于组成moonip,端口写死成9993了。但是很多nat服务器只开放了10000以上的端口,所以有需要可以手动修改一下端口。这个moonip和后续生成的用来替换的planet有关联,planet中应该包含了用来指定上游中转服务的配置。

吐槽下MYADDR不能是域名,只能填IP,具体原因可以看[这个](https://github.com/kaaass/ZerotierFix/issues/58)。社区提了很多次,但是开发者表示他们[特意不依赖 DNS](https://github.com/zerotier/ZeroTierOne/issues/1158)。不过某个[相关issue](https://github.com/zerotier/ZeroTierOne/issues/918)里开发者收获的11个倒彩应该很能说明社区态度。Zerotier对于配置Server使用IP还是域名的态度跟Netmaker是两个极端,ZeroTier只支持IP,Netmaker新版本只支持域名,讲道理不能兼容一下吗?

```bash
#!/bin/sh
### date:2022年08月14日
### author: www.mrdoc.fun | jonnyan404
### 转载请保留来源
set -x
chmod 777 /tmp/mkmoonworld-x86_64
zerotier-idtool initmoon /var/lib/zerotier-one/identity.public > moon.json
chmod 777 moon.json
moonip="[\"${MYADDR}/9993\"]"
sed -i "s#127.0.0.1#${MYADDR}#g" moon.json
sed -i "s#\[\]#${moonip}#g" moon.json
cat moon.json
zerotier-idtool genmoon moon.json
/tmp/mkmoonworld-x86_64 moon.json

mkdir /var/lib/zerotier-one/moons.d
cp *.moon /var/lib/zerotier-one/moons.d
mv world.bin planet
cp -f planet /var/lib/zerotier-one/planet

cp *.moon planet  /opt/key-networks/ztncui/etc/myfs
moon_id=$(cat /var/lib/zerotier-one/identity.public | cut -d ':' -f1)
echo -e "Your ZeroTier moon id is \033[0;31m$moon_id\033[0m, you could orbit moon using \033[0;31m\"zerotier-cli orbit $moon_id $moon_id\"\033[0m"
```

(三)初始化设置

  • 浏览器访问 http://ip:3000
  • 默认用户是admin,密码环境变量设置的password。如果未指定密码,可执行 docker exec -it ztncui cat /var/log/docker-ztncui.log|grep Password 获取密码.第一次登录会让改密码。
  • Add networks创建一个新网络,并获取网络id,和官方控制台操作一样。

    添加网络

(四)获取 planet 文件

  • 浏览器访问 http://ip:3180
  • 打开planet和moon文件下载页面(亦可在项目根目录的./ztncui/etc/myfs/里获取)

(五)替换 planet 文件

  • Windows:C:\ProgramData\ZeroTier\One\planet
  • OpenWrt:/etc/config/zero/planet
  • Android:需要下载第三方客户端ZerotierFix,支持本地上传和url导入

(六)重启服务/重启服务器

(七)加入网络

  • Windows:

    # 进入命令行工具所在文件夹
    cd 'C:\Program Files (x86)\ZeroTier\One\'
    
    # 加入网络
    zerotier-cli.bat join 网络id(第三步获取的)
        
    # 查看planet服务器在不在,link是否是DIRECT(直连)
        zerotier-cli.bat peers
    <ztaddr>   <ver>  <role> <lat> <link>   <lastTX> <lastRX> <path>
    xxxxxxxxxx 1.12.2 LEAF       1 DIRECT   3494     4036     xx.xx.xx.xx/57527
    xxxxxxxxxx 1.12.1 PLANET   112 DIRECT   1942     2940     xx.xx.xx.xx/29993
  • OpenWrt:我用的版本有WebUI,所以是直接在UI上输入网络id
  • Android:进入ZerotierFix后,单击右下角的加号输入网络id

(八)授权

勾选`Authorized`和`Active bridge`

![授权](https://img.lhn675699635.com/blog/2026/09/12/6aa55164b6af7.jpg)

三、总结

自建Planet服务器除了突破官方25台设备连接数限制,提升网络的稳定性外,还可以自己划分子网,更方便局域网的规划。

我的野望是几个好哥们商量好网段,通过多个自建ZeroTier Planet服务器组Mesh,可以互相访问对方内网中的服务和资源,可惜除了我以外都动力不足啊。

四、文献引用

最后修改:2026 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏