1. ZeroTier基础架构与核心组件解析
ZeroTier作为一款成熟的SD-WAN解决方案,其核心架构由三部分组成:PLANET(根服务器)、MOON(私有中继节点)和普通节点。在标准使用场景中,用户设备默认连接ZeroTier官方的PLANET服务器,但对于需要完全自主可控的企业环境,自建PLANET服务器成为刚需。
PLANET服务器本质上是一个特殊的MOON节点,承担着全网的身份认证和路由协调功能。与官方PLANET相比,自建版本的主要差异在于:
- 网络拓扑完全私有化,所有节点间的通信不经过第三方服务器
- 可自定义网络规则和访问策略
- 支持二次开发控制面板实现定制化管理
Controller则是ZeroTier Central的开源替代方案,提供Web管理界面和API接口。原生的ztncui控制面板虽然功能完整,但在企业级场景下往往需要深度定制,这就引出了二次开发的需求。
关键提示:自建PLANET需要至少一台具有公网IP的服务器,且建议部署在网络条件良好的数据中心。实测表明,位于骨干网节点的服务器可使跨区域延迟降低40%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容器化部署环境准备
2.1 基础环境配置
推荐使用Ubuntu 22.04 LTS作为宿主系统,其内核版本(5.15+)对容器和虚拟化支持最为完善。以下是必须的准备工作:
bash复制# 更新系统并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose git make gcc
# 配置docker用户组(避免每次sudo)
sudo usermod -aG docker $USER
newgrp docker
# 验证安装
docker --version && docker-compose --version
对于可能遇到的"virtualization support not detected"错误,需要分情况处理:
-
BIOS未开启虚拟化:
- 重启进入BIOS
- 找到Intel VT-x/AMD-V选项并启用
- 保存后重新启动
-
Hyper-V冲突(Windows主机):
powershell复制dism.exe /Online /Disable-Feature:Microsoft-Hyper-V重启后再次尝试
2.2 网络拓扑规划
典型的生产环境部署建议采用三节点架构:
- PLANET节点:1台(必需公网IP)
- Controller节点:1台(可与PLANET同机)
- MOON节点:至少2台(可选,用于区域加速)
网络端口要求:
| 服务类型 | 端口号 | 协议 | 用途 |
|---|---|---|---|
| ZeroTier | 9993 | UDP | 节点通信 |
| ztncui | 3000 | TCP | 控制面板Web访问 |
| PostgreSQL | 5432 | TCP | 数据库(如使用) |
3. PLANET服务器容器化部署
3.1 构建自定义镜像
官方并未提供PLANET的Docker镜像,我们需要基于源码自行构建:
dockerfile复制# Dockerfile.planet
FROM alpine:3.16
RUN apk add --no-cache build-base linux-headers \
&& wget https://github.com/zerotier/ZeroTierOne/archive/refs/tags/1.8.6.tar.gz \
&& tar xvf 1.8.6.tar.gz \
&& cd ZeroTierOne-1.8.6 \
&& make -j$(nproc) \
&& mkdir -p /var/lib/zerotier-one \
&& cp zerotier-one /usr/bin/ \
&& apk del build-base linux-headers
VOLUME ["/var/lib/zerotier-one"]
EXPOSE 9993/udp
ENTRYPOINT ["zerotier-one"]
构建命令:
bash复制docker build -t zerotier-planet:1.8.6 -f Dockerfile.planet .
3.2 运行与配置
创建持久化数据卷并运行容器:
bash复制docker volume create zt1-data
docker run -d \
--name zt-planet \
--restart always \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_ADMIN \
-v zt1-data:/var/lib/zerotier-one \
zerotier-planet:1.8.6
生成PLANET配置:
bash复制docker exec zt-planet zerotier-idtool generate identity.secret identity.public
docker exec zt-planet zerotier-idtool initmoon identity.public > moon.json
编辑moon.json,关键参数示例:
json复制{
"id": "0123456789abcdef",
"objtype": "world",
"roots": [
{
"identity": "0123456789abcdef:0:9993",
"stableEndpoints": ["1.2.3.4/9993"]
}
],
"signingKey": "...",
"signingKey_SECRET": "...",
"updatesMustBeSignedBy": "...",
"worldType": "planet"
}
应用配置并重启:
bash复制docker exec zt-planet mv moon.json /var/lib/zerotier-one/moons.d/000000ffffffffff.json
docker restart zt-planet
4. Controller与ztncui集成部署
4.1 数据库准备
推荐使用PostgreSQL作为后端存储:
bash复制docker run -d \
--name zt-db \
-e POSTGRES_PASSWORD=securepassword \
-e POSTGRES_USER=zerotier \
-e POSTGRES_DB=zerotier \
-v pg-data:/var/lib/postgresql/data \
postgres:14
4.2 原生ztncui部署
使用官方镜像快速部署:
yaml复制# docker-compose.yml
version: '3'
services:
ztncui:
image: keynetworks/ztncui
depends_on:
- db
environment:
- ZTNCUI_PASSWD=admin_password
- NODE_ENV=production
- MYADDR=0.0.0.0
- HTTP_PORT=3000
- HTTP_ALL_INTERFACES=true
- ZT_ADDR=127.0.0.1:9993
ports:
- "3000:3000"
volumes:
- ztncui-data:/opt/key-networks/ztncui/etc
restart: always
db:
image: postgres:14
environment:
POSTGRES_PASSWORD: dbpassword
POSTGRES_USER: ztncui
POSTGRES_DB: ztncui
volumes:
- pg-data:/var/lib/postgresql/data
restart: always
volumes:
ztncui-data:
pg-data:
启动服务:
bash复制docker-compose up -d
4.3 二次开发实践
ztncui的源码结构主要包含:
code复制/src
/controllers - API路由
/models - 数据模型
/public - 静态资源
/views - 前端模板
典型定制开发流程:
-
克隆源码:
bash复制git clone https://github.com/key-networks/ztncui-aio -
修改API示例(添加自定义字段):
javascript复制// src/controllers/network.js router.post('/:nwid/member/:id', async (req, res) => { // 添加自定义标签 if (req.body.customTags) { await Member.update( { customTags: req.body.customTags }, { where: { id: req.params.id } } ); } }); -
构建新镜像:
bash复制
docker build -t custom-ztncui:latest . -
替换compose文件中的镜像名称并重启
5. 客户端配置与网络调优
5.1 客户端接入PLANET
Windows客户端配置(管理员PowerShell):
powershell复制# 添加注册表项
New-Item -Path "HKLM:\SOFTWARE\ZeroTier\One" -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\ZeroTier\One" -Name "RootServers" -Value '{"1.2.3.4/9993":"0123456789abcdef"}'
# 重启服务
Restart-Service ZeroTierOne
Linux客户端配置:
bash复制sudo mkdir -p /var/lib/zerotier-one/moons.d
echo '{"roots":[{"identity":"0123456789abcdef:0:9993","stableEndpoints":["1.2.3.4/9993"]}],"signingKey":"...","worldType":"planet"}' | sudo tee /var/lib/zerotier-one/moons.d/000000ffffffffff.json
sudo systemctl restart zerotier-one
5.2 网络性能调优
通过iptables优化NAT穿透:
bash复制# 启用IP转发
sysctl -w net.ipv4.ip_forward=1
# 配置MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i zt+ -j ACCEPT
MTU优化建议(适用于高延迟网络):
bash复制# 各节点执行
zerotier-cli set <networkId> mtu=1400
6. 运维监控与故障排查
6.1 监控方案
推荐Prometheus+Granfana监控体系:
yaml复制# docker-compose.monitor.yml
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3001:3000"
volumes:
- grafana-data:/var/lib/grafana
示例监控指标采集配置:
yaml复制# prometheus.yml
scrape_configs:
- job_name: 'zerotier'
static_configs:
- targets: ['zt-planet:9993']
metrics_path: '/metrics'
6.2 常见问题处理
-
节点无法连接PLANET:
- 检查9993端口UDP通信
- 验证PLANET配置文件的stableEndpoints
- 使用
zerotier-cli peers查看连接状态
-
ztncui面板无法访问:
bash复制# 查看容器日志 docker logs ztncui-container # 检查数据库连接 docker exec -it ztncui-container psql -U ztncui -h db -
网络延迟过高:
bash复制# 各节点执行 zerotier-cli listpeers # 确认已建立P2P连接(DIRECT标志)
7. 安全加固实践
7.1 基础安全配置
-
修改默认端口(需同步修改所有客户端):
bash复制# PLANET节点 docker run -p 19993:9993/udp ... # ztncui environment: HTTP_PORT: 13000 -
启用HTTPS:
bash复制# 使用Let's Encrypt docker run --rm -it \ -v "/etc/letsencrypt:/etc/letsencrypt" \ -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ certbot/certbot certonly \ --standalone \ -d yourdomain.com
7.2 访问控制策略
-
网络规则示例(只允许HTTP访问):
json复制{ "rules": [ {"etherType": 2048, "not": true, "or": [ {"ipDest": "10.144.0.0/16"}, {"ipDest": "10.244.0.0/16"} ]}, {"type": "ACTION_DROP"} ] } -
API访问限制:
nginx复制location /api { limit_req zone=api burst=5 nodelay; proxy_pass http://ztncui:3000; }
