ZeroTier 深度实战:Moon 节点与自建控制器
ZeroTier 是最早普及的 P2P 异地组网工具。虽然 Tailscale 后来居上,但 ZeroTier 依然有很多死忠粉,特别是在完全自建控制器(Controller)和自定义路由规则(Flow Rules)方面,它更加灵活。
本指南将教你如何自建 Moon 节点(加速中转),以及如何搭建 Planet(根服务器)级别的完全私有网络。
1. 为什么选择 ZeroTier?
- P2P 穿透:通过 UDP 打洞,直接连接两台设备,不经过中转服务器(如果打洞成功)。
- Moon 节点:类似于 Tailscale 的 DERP,你可以自建中转服务器,加速连接。
- Flow Rules:强大的流量控制规则,可以精确到“只允许 IP A 访问 IP B 的 80 端口”。
- 多路径 (Multipath):新版本支持绑定多条线路(如宽带 + 4G),自动负载均衡。
2. 部署 Moon 节点 (加速中转)
如果你发现 ZeroTier 连接经常断线(Relay 状态),说明官方根服务器(Planet)在海外,延迟太高。你需要一台国内 VPS(或有公网 IP 的 NAS)作为 Moon。
准备工作
- VPS:有公网 IP。
- ZeroTier:已安装并在运行。
生成 Moon 配置文件
在 VPS 上执行:
修改 moon.json
编辑 moon.json,找到 "roots": [] 部分,填入 VPS 的公网 IP 和端口(默认 9993)。
生成签名文件
会生成一个000000xxxxxxxx.moon 文件。 启用 Moon
- 在 VPS 上创建目录
moons.d: - 客户端连接 Moon: 在 NAS 或其他客户端上执行:
<Moon_ID>就是 VPS 的 10 位 Node ID(在zerotier-cli info查看)。- 验证:
zerotier-cli listpeers,如果看到 VPS 的 IP 后面显示MOON,说明加速成功。
3. 自建控制器 (ztncui / ZTNet)
ZeroTier 官方允许你在官网管理网络(免费 25 个设备)。如果你想突破限制,可以自建 Controller。
部署 ztncui (Docker)
ztncui 是一个开源的 Web UI,用于管理自建的 ZeroTier Controller。
services:
ztncui:
image: keynetworks/ztncui
container_name: ztncui
ports:
- 3000:3000
environment:
- MYADDR=1.2.3.4 # VPS 公网 IP
- HTTP_PORT=3000
- HTTP_ALL_INTERFACES=yes
- ZTNCUI_PASSWD=password
volumes:
- ./zt-data:/var/lib/zerotier-one
- ./ztncui-data:/opt/key-networks/ztncui/etc
restart: always
使用
- 访问
http://1.2.3.4:3000。 - 默认账号
admin,密码password。 - 创建一个 Network,获得 Network ID。
- 在客户端执行
zerotier-cli join <Network_ID>。 - 在 Web UI 中批准设备加入。
4. Flow Rules (流量控制)
ZeroTier 的 Flow Rules 类似于企业级防火墙。你可以在官网(或 ztncui)的 Flow Rules 编辑框中输入规则。
示例:只允许访问 Web 服务
# 允许 ARP, IPv4, IPv6
accept ethertype arp;
accept ethertype ipv4;
accept ethertype ipv6;
# 允许 TCP 80, 443
accept
ipprotocol tcp
and dport 80 or dport 443;
# 拒绝其他所有流量
drop;
示例:隔离两个部门
# 定义标签
tag department
id 1
enum 0 red
enum 1 blue;
# 拒绝跨部门访问
drop
not tag department = zt.tag.department;
5. 常见问题
Q1: Moon 节点没效果?
- 检查 VPS 防火墙(UDP 9993)。
- 检查客户端是否成功 orbit(
listpeers确认)。 - Moon 只是“中转”,如果两端网络极差,UDP 丢包严重,Moon 也救不了(TCP 模式效率极低)。
Q2: 找不到设备?
- ZeroTier 依赖广播(Broadcast)发现设备。
- 在群晖 NAS 上,有时防火墙会拦截 UDP 9993。
- 尝试在 NAS 的防火墙规则中,放行 ZeroTier 的虚拟网卡(如
zt0或tun接口)。