zerotier
准备工作
注册帐号
我直接用 github 帐号登录。
创建网络
登录后提示创建一个新的网络,选择 private,可以修改网络名字如我改为 skynet 。
ipv4 自动分配地址,选择一个网段。

记录下这个网络的 ZeroTier Network ID。
安装客户端
openwrt
打开 openwrt 的 “vpn” -< “zerotier”:
http://192.168.0.1/cgi-bin/luci/admin/vpn/zerotier
填写 ZeroTier Network ID,勾选 启动 和 自动允许客户端 NAT, 点 “保存&应用”
连接成功后会显示 “Zerotier 运行中”, “接口信息” 中也可以看到相关的信息。
在 zerotier 的管理页面上,这时可以看到有一个提示 “One device has joined this network.” 在设置列表中找到这个设备,勾选前面的框让认证通过。
为了方便起见,给每个设备指定固定的ip地址,方便后续直接连接。比如路由器我设置为 192.168.192.100。

mac
下载安装 zerotier 的 app,启动后点击"Jion New Network" ,输入前面的 ZeroTier Network ID。然后同样需要在管理页面认证通过。
windows
类似的安装应用,设置和 mac 类似。
貌似在路由器安装好 zerotier 之后,内网其他机器没有必要再安装 zerotier 了。
配置网络
配置路由器
在 openwrt 的设置中,我们选择了 “自动允许客户端 NAT”,但这还不够,还需要在 zerotier 的管理页面中对网络进行路由设置。
默认情况会有一个 managed route , “192.168.192.0/24(LAN)"。
我的路由器的内网中有两个子网,分别是 “192.168.0.0/24” 和 “192.168.100.0/24”,为了在其他设备上直接访问这些网段,需要添加两个人 route,如下图所示:

备注:这里的 192.168.192.100 是前面设置的路由器在 zerotier 网络中的固定IP。
可以通过 mac 上的 zerotier app 看到这些路由信息:

由于这些路由信息的存在,因此我们可以直接使用这些内网 IP 地址进行访问,好处就是可以在外网得到和在内网一样的体验。
网速延迟
以广州南沙的 openwrt 软路由机器为基础进行测试,使用的是电信网络。
ping 天河的节点,同是电信宽带,延迟为 5-6 毫秒。同城电信网络之间的 ping 值非常好,甚至比家里用无线网络的延迟都低,如果不是受限于上行带宽,体现和普通局域网基本一致:
$ ping 192.168.192.20
PING 192.168.192.20 (192.168.192.20): 56 data bytes
64 bytes from 192.168.192.20: seq=0 ttl=64 time=4.922 ms
64 bytes from 192.168.192.20: seq=1 ttl=64 time=6.178 ms
64 bytes from 192.168.192.20: seq=2 ttl=64 time=4.929 ms
64 bytes from 192.168.192.20: seq=3 ttl=64 time=5.432 ms
64 bytes from 192.168.192.20: seq=4 ttl=64 time=5.480 ms
64 bytes from 192.168.192.20: seq=5 ttl=64 time=5.759 ms
ping 两台放在苏州的节点,也是电信宽带,延迟为 30 毫秒,考虑广州到苏州的距离,这个 ping 值还算可以的,一般用感觉不到明显延迟:
$ ping 192.168.192.30
PING 192.168.192.30 (192.168.192.30): 56 data bytes
64 bytes from 192.168.192.30: seq=0 ttl=64 time=29.429 ms
64 bytes from 192.168.192.30: seq=1 ttl=64 time=29.653 ms
64 bytes from 192.168.192.30: seq=2 ttl=64 time=29.981 ms
$ ping 192.168.192.40
PING 192.168.192.40 (192.168.192.40): 56 data bytes
64 bytes from 192.168.192.40: seq=0 ttl=64 time=31.140 ms
64 bytes from 192.168.192.40: seq=1 ttl=64 time=31.054 ms
64 bytes from 192.168.192.40: seq=2 ttl=64 time=30.939 ms
64 bytes from 192.168.192.40: seq=3 ttl=64 time=30.856 ms
64 bytes from 192.168.192.40: seq=4 ttl=64 time=31.451 ms
ping 用手机 USB 共享网络的放在上海青浦办公室的网络设备,延迟低时有 40 毫秒,但非常不稳定,估计是手机网络的问题:
$ ping 192.168.192.50
PING 192.168.192.50 (192.168.192.50): 56 data bytes
64 bytes from 192.168.192.50: seq=0 ttl=64 time=41.940 ms
64 bytes from 192.168.192.50: seq=1 ttl=64 time=41.611 ms
64 bytes from 192.168.192.50: seq=2 ttl=64 time=816.259 ms
64 bytes from 192.168.192.50: seq=3 ttl=64 time=224.184 ms
64 bytes from 192.168.192.50: seq=4 ttl=64 time=99.026 ms
64 bytes from 192.168.192.50: seq=5 ttl=64 time=58.053 ms
64 bytes from 192.168.192.50: seq=6 ttl=64 time=43.430 ms
64 bytes from 192.168.192.50: seq=7 ttl=64 time=47.531 ms
64 bytes from 192.168.192.50: seq=8 ttl=64 time=141.978 ms
64 bytes from 192.168.192.50: seq=9 ttl=64 time=40.104 ms
克隆后的问题
在 pve 内,通过将 openwrt 虚拟机进行备份,然后复制到其他机器,再通过恢复功能重建 openwrt 虚拟机之后,由于 zerotier 还是沿用的之前的认证信息,因此会导致冒认身份。
重置身份
此时正确的方式,应该是删除原有的身份信息,然后重新生成新的身份信息,再在 zerotier 管理页面对新的身份进行认证。
# 1. 停止服务
/etc/init.d/zerotier stop
# 2. 彻底清空配置目录 (破釜沉舟)
# ls /var/lib/ 把和 zerotier 相关的目录清理掉
rm -rf /var/lib/zerotier-luci
rm -rf /var/lib/zerotier-one
rm -rf /etc/config/zero/*
# 3. 启动服务 (生成全新的身份)
/etc/init.d/zerotier start
# 4. 获取最新的 Node ID
sleep 3
zerotier-cli info
但我当时错误的选择了删除 zerotier,然后通过 istore 重新安装 zerotier,结果导致了一系列问题,处理起来非常的麻烦。本来最简单的办法应该是重置 zerotier,然后导入配置或者重新是手工再次配置一遍,但我的机器在远程,我只能远程操作(通过ddns+端口映射),一旦网络断开整个机器就会失去控制。
libminiupnpc 依赖问题
先查看 zerotier 的 info 信息:
$ zerotier-cli info
Error loading shared library libminiupnpc.so.18: No such file or directory (needed by /usr/bin/zerotier-cli)
安装缺失的依赖 libminiupnpc:
opkg update
opkg install libminiupnpc
也可能是安装了其他版本:
ls /usr/lib/libminiupnpc.so*
/usr/lib/libminiupnpc.so.2.2.3 /usr/lib/libminiupnpc.so.2.2.8
这种情况下做一个 soft link 就好了:
ln -s /usr/lib/libminiupnpc.so.2.2.8 /usr/lib/libminiupnpc.so.18
路径不一致问题
在 openwrt 页面上,通过 istore 安装 zerotier 之后,在 zerotier 页面开启 zerotier, 并设置好参数,加入ZeroTier 网络 ID,然后保存并应用。
但,会发现 zerotier 并没有成功连接, 而且 zerotier-cli info 报错:
$ zerotier-cli info
zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one
这个问题卸载 zerotier,然后清理所有 zerotier 文件后,再次安装,依然有同样问题。后来 ps 时发现,开机启动的 zerotier-one 进行,使用的是 /var/lib/zerotier-luci 这个工作目录,而不是默认的 /var/lib/zerotier-one。
ps | grep zerotier
5748 root 1188 S grep zerotier
31281 root 1196 S {zerotier-nat} /bin/sh /usr/libexec/zerotier-nat
31282 root 1256 S {zerotier-dns} /bin/sh /usr/libexec/zerotier-dns
31283 root 34220 S /usr/bin/zerotier-one /var/lib/zerotier-luci
这应该是从 istore 上安装的 zerotier 的问题,要解决这个问题最彻底的方式是修改 zerotier 的启动脚本:
vi /etc/init.d/zerotier
需要做两个改动:
-
start 命令
强制指定正确路径,并且在不存在时创建。
start_service() { config_get ... config_get ... config_get ... # 强制指定正确路径 config_path="/etc/config/zero" mkdir -p "${config_path}" -
stop 命令
这里不要删除目录
stop_service() { # rm -rf "${CONFIG_PATH}" return 0
配置方式可以用 zerotier 页面进行配置。
防火墙配置,可以用最简单的方案:
-
添加接口
- 进入 网络 (Network) -> 接口 (Interfaces)。
- 点击左下角的 “添加新接口” (Add new interface)。
- 名称:输入 VPN (或者 ZeroTier)。
- 协议:选择 “不配置协议” (Unmanaged)。
- 设备 (Device):在下拉列表中,寻找 ztw4lflcku (或者你刚才查到的名字)。
- 注意:如果没有直接显示,可以手动输入 ztw4lflcku,或者选择“自定义接口”后输入。
- 点击 创建 (Create)。
-
设置防火墙
在刚才创建的 ZeroTier 接口的修改页面,点击 防火墙设置 (Firewall Settings) ,然后分配防火墙区域为 lan
附录:常用命令
在 OpenWrt 上,管理 ZeroTier 主要分为两个部分:通用命令行工具 (zerotier-cli) 和 OpenWrt 系统服务管理。
zeroTier 核心命令 (zerotier-cli)
这些命令直接与 ZeroTier 进程交互,用于查看状态、加入网络等。
-
查看当前状态和 Node ID (节点 ID)
zerotier-cli info输出示例:
200 info 8a6b22xxxx 1.10.2 ONLINE这里的8a6b22xxxx就是你的 Node ID,你需要在 ZeroTier 管理后台批准这个 ID。 -
加入网络
zerotier-cli join <Network_ID>示例:
zerotier-cli join a0cbf4b62a12xxxx -
离开网络
zerotier-cli leave <Network_ID> -
查看已加入的网络 (及 IP 地址)
zerotier-cli listnetworks重点: 这个命令会显示
<dev>列(如zt7u3....),这是 ZeroTier 生成的虚拟网卡名称,你在 OpenWrt 的“网络 -> 接口”设置中需要用到它。 -
查看对等节点 (Peers)
zerotier-cli peers用于排查故障,查看是否与控制器(Planet)或其他节点(Leaf)建立了直接连接(Direct)还是中继连接(Relay)。
-
绑定特定物理 IP (高级)
如果有多条宽带,强制绑定某一个 IP:
zerotier-cli bond <Network_ID> <IP_Address>
OpenWrt 服务管理命令
在 OpenWrt 上,建议通过系统服务来控制 ZeroTier 的启动和停止,确保持久化运行。
-
启动服务
/etc/init.d/zerotier start -
停止服务
/etc/init.d/zerotier stop -
重启服务
(修改配置后通常需要执行此命令)
/etc/init.d/zerotier restart -
设置开机自启
/etc/init.d/zerotier enable
OpenWrt UCI 配置命令 (推荐方式)
虽然 zerotier-cli join 可以加入网络,但在 OpenWrt 中,最佳实践是将网络 ID 写入配置文件 /etc/config/zerotier,这样重启路由器后配置不会丢失。
-
查看当前 UCI 配置
cat /etc/config/zerotier -
通过命令添加网络 ID (永久保存)
假设你的 Network ID 是
a0cbf4b62a12xxxx:uci add_list zerotier.sample_config.join='a0cbf4b62a12xxxx' uci commit zerotier /etc/init.d/zerotier restart(注意:
sample_config是默认的配置段名称,如果你的配置文件里改了名字,请相应替换)
常见后续操作 (至关重要)
仅仅在命令行加入网络是不够的,在 OpenWrt 上你通常还需要进行以下两步操作,才能让局域网设备互通:
-
创建接口:
你需要去 LuCI (网页后台) -> 网络 -> 接口 -> 添加新接口。
- 协议:不配置协议 (Unmanaged) 或 静态地址 (Static address)。
- 设备:选择
zerotier-cli listnetworks里看到的那个设备名 (如ztwdk...)。
-
配置防火墙:
去 网络 -> 防火墙。
- 将刚才新建的接口加入到一个区域(通常是新建一个 VPN 区域,或者为了方便直接加入 LAN 区域,并允许
Masquerading动态伪装)。
- 将刚才新建的接口加入到一个区域(通常是新建一个 VPN 区域,或者为了方便直接加入 LAN 区域,并允许
总结流程
zerotier-cli info获取 ID。- 在 ZeroTier 官网后台授权该 ID。
uci add_list ...添加网络 ID 并重启服务。zerotier-cli listnetworks确认状态为 OK 且有虚拟网卡名。- 在 OpenWrt 网页后台配置接口和防火墙。