在VyOS上运行ZeroTier实现站点间组网
前言
VyOS 是一个开源的路由器操作系统,ZeroTier 则是一个易于使用的 SD-WAN 方案。将两者结合,可以用 VyOS 作为各站点的网关设备,通过 ZeroTier 组建虚拟网络,实现站点间的安全通信。
相比传统的 IPsec VPN 或 BGP over WireGuard 方案,ZeroTier 的优势在于:无需公网 IP、无需手动配置隧道对端、通过 Central 控制台统一管理路由。适合中小规模的多站点部署。
本文基于 VyOS 1.4(Rolling Release)和 ZeroTier 官方 Docker 镜像,演示从容器部署到路由配置的完整流程。
网络拓扑
假设有 3 个站点,每个站点一台 VyOS 路由器,通过 ZeroTier 组网:
- Site 1:RTR1,本地子网 10.1.0.0/24
- Site 2:RTR2,本地子网 10.2.0.0/24
- Site 3:RTR3,本地子网 10.3.0.0/24
ZeroTier 虚拟网络分配 10.13.0.0/16,每个节点通过 ZeroTier 自动分配一个 IP。
基础网络配置
确保每台 VyOS 有互联网连接和 DNS 解析:
configure
set interfaces ethernet eth0 address dhcp
set system name-server 223.5.5.5
commit
save
验证连通性:
ping 223.5.5.5 count 2
部署 ZeroTier 容器
VyOS 1.4 原生支持容器管理,我们使用 ZeroTier 官方 Docker 镜像。
1. 拉取镜像
add container image zerotier/zerotier:latest
VyOS 1.4 下载镜像时没有进度条,静默等待即可。用以下命令确认:
show container image
2. 创建持久化目录
将 ZeroTier 数据目录映射到 /config/ 下,确保重启后配置不丢失:
sudo mkdir -p /config/containers/zt1
3. 配置容器
configure
set container name zt1 allow-host-networks
set container name zt1 cap-add net-admin
set container name zt1 device tun destination /dev/net/tun
set container name zt1 device tun source /dev/net/tun
set container name zt1 image zerotier/zerotier:latest
set container name zt1 volume ZT_Path destination /var/lib/zerotier-one
set container name zt1 volume ZT_Path source /config/containers/zt1
commit
save
关键参数说明:
- allow-host-networks:容器共享宿主网络栈,ZeroTier 创建的接口直接出现在 VyOS 上
- cap-add net-admin:授予容器网络管理权限,允许创建虚拟网卡
- device tun:将宿主的 TUN 设备映射进容器
- volume ZT_Path:持久化 ZeroTier 的身份文件和配置
验证容器状态:
show container
映射 ZeroTier 接口
通过 devicemap 文件将 ZeroTier 网络映射为指定的以太网接口(如 zt0),便于后续配置防火墙策略:
sudo su
cd /config/containers/zt1
cat > devicemap << EOF
<NetworkID>=zt0
EOF
exit
将 <NetworkID> 替换为你在 ZeroTier Central 创建的网络 ID。然后重启容器使映射生效:
restart container zt1
加入 ZeroTier 网络
进入容器,执行 join 命令:
connect container zt1
zerotier-cli join <NetworkID>
exit
返回 200 join OK 表示加入成功。记录下 zerotier-cli info 输出的 Node ID。
在 Central 中授权节点
登录 ZeroTier Central,在对应网络中:
- 找到新加入的节点,将 Node ID 与各路由器对上
- 勾选 Auth 列的复选框授权
- 可选:为每个节点设置名称便于识别
授权后,在 VyOS 上确认接口已获取 IP:
show interfaces ethernet zt0
应能看到 ZeroTier 分配的 IP(如 10.13.x.x/16)。
配置路由
方法一:通过 ZeroTier Central 推送路由(推荐)
在 ZeroTier Central 的 Managed Routes 中添加各站点路由:
| 目标网段 | Via(节点 IP) |
|---|---|
| 10.1.0.0/24 | 10.13.x.1(RTR1) |
| 10.2.0.0/24 | 10.13.x.2(RTR2) |
| 10.3.0.0/24 | 10.13.x.3(RTR3) |
路由会自动下发到所有节点。ZeroTier 将路由 metric 设为 5000,不会覆盖本地更优先的路由。
方法二:在 VyOS 上配置静态路由
如果不想依赖 Central 推送,也可以手动在 VyOS 上配置:
configure
# RTR1 上
set protocols static route 10.2.0.0/24 next-hop 10.13.x.2
set protocols static route 10.3.0.0/24 next-hop 10.13.x.3
commit
save
验证连通性
查看路由表确认路由已下发:
show ip route
从 RTR1 ping 其他站点:
ping 10.2.0.1 source-address 10.1.0.1 count 2
ping 10.3.0.1 source-address 10.1.0.1 count 2
注意事项
- Managed Routes 上限:ZeroTier Central 限制每个网络最多 128 条托管路由
- 路由优先级:ZeroTier 推送的路由 metric 为 5000,本地静态路由默认 metric 20,后者优先
- MTU:ZeroTier 虚拟接口 MTU 通常为 2800(内部会自动分片),一般无需调整
- 持久化:/config/ 下的文件在 save 和重启后会保留,容器数据和 devicemap 都在其中
- 容器自动启动:配置 set container name zt1 后,VyOS 重启会自动启动容器
扩展:大规模部署
如果站点数量超过 127 个(128 条路由减去默认路由),或者需要多租户隔离,可以考虑:
- 使用 BGP over ZeroTier 替代托管路由,实现更灵活的路由策略
- 结合 MPLS 实现多租户场景
- 自建 ZeroTier Planet/Moon 控制器,脱离 Central 的托管路由限制
总结
在 VyOS 上通过容器运行 ZeroTier 是一种轻量且易维护的组网方式。核心步骤只有:拉镜像、配容器、join 网络、授权、配路由。对于没有公网 IP 的站点,ZeroTier 可以通过 NAT 穿透建立 P2P 连接,无需额外的 VPN 网关或 DDNS 配置。