需求背景

  • 异地多设备管理时,如果有公网IP就要做端口映射,进行一个一个映射(如下图)。如果没有公网IP就还得类似NPS、FRP之类的进行映射管理,统一管理起来很麻烦。

为什么选择zerotier

  • 跨平台性很好,基本常见的Linux、安卓、Mac、IOS都覆盖了

  • 可以选择自建节点(推荐)或者使用官方节点

  • 与NPS或FRP对比

从上图可以看出,请求均经过服务器NPS或FRP,所以整体结构的短板就是服务器的带宽性能上。

从上图可以看出如果zerotier尝试P2P打洞成功后,基本属于直连,所以整体架构的短板就是客户端的上行带宽上,但是一般家庭都是30Mbps,怎么都比服务器那小水管强。

为什么要自建

  • 官方的 Zerotier 服务提供的 planet 行星根服务器大多在海外,国内网络大多数连接不稳定,且容易出现断连情况。

安全性

  • 如果想要入侵,得同时拿到根planet文件以及控制台账号密码才可以

  • 配置完全部后,把服务器下载planet文件端口、控制台端口删除防火墙规则,使用Ngnix反代控制台端口,不用控制台的时候直接关闭站点

安装(以自建服务端为例)

操作系统为Linux Ubuntu

拉取项目代码

git clone https://github.com/xubiaolin/docker-zerotier-planet.git #官方地址
git clone https://ghproxy.markxu.online/https://github.com/xubiaolin/docker-zerotier-planet.git #加速地址

执行安装脚本

cd docker-zerotier-planet
./deploy.sh
#安装日志
欢迎使用zerotier-planet脚本,请选择需要执行的操作:
1. 安装
2. 卸载
3. 更新
4. 查看信息
5. 退出
请输入数字:1
开始安装,如果你已经安装了,将会删除旧的数据,10s后开始安装...
myztplanet
请输入zerotier-planet要使用的端口号,例如9994: 9993
请输入zerotier-planet的API端口号,例如3443: 3443
请输入zerotier-planet的FILE端口号,例如3000: 3000
是否自动获取公网IP地址?(y/n)y
获取到的IPv4地址为: 000.000.000.000
获取到的IPv6地址为:
是否使用上面获取到的IP地址?(y/n)y
---------------------------
使用的端口号为:9993
API端口号为:3443
FILE端口号为:3000
IPv4地址为:000.000.000.000
IPv6地址为:
---------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
安装完成
---------------------------
请访问 http://000.000.000.000:3443 进行配置
默认用户名:admin
默认密码:password
请及时修改密码
---------------------------
moon配置和planet配置在 /home/ubuntu/docker-zerotier-planet/data/zerotier/dist 目录下
moons 文件下载: http://000.000.000.000:3000/00000093caa675b0.moon?key=xxxxxxxxxxxxxxxx
planet文件下载: http://000.000.000.000:3000/planet?key=xxxxxxxxxxxxxxxx
---------------------------
请放行以下端口请:9993/tcp,9993/udp,3443/tcp,3000/tcp
---------------------------

防火墙放行端口

保存planet文件

通过安装时提示的地址将planet文件下载,为了安全起见,下载完就可以将防火墙的3000端口进行关闭了。

服务端配置虚拟网络

访问 http://00.00.00.00:3443 自己输入对应的 ip 和端口号,修改默认密码。

在控制台中

创建虚拟网络

创建完成

创建IP地址池

配置完成

客户端配置

由于我们是自建的,所以客户端下载后,要替换掉原来的planet文件才能加入到网络,客户端除了群晖,均从官网https://www.zerotier.com/download/,下载。

Windows系统

Planet 文件路径:C:\ProgramData\ZeroTier\One\Planet(可能是隐藏路径)

替换后重新启动 Zerotier One 服务

Linux系统

Planet 文件路径:/var/lib/zerotier-one/Planet
重启服务:sudo systemctl restart zerotier-one

DSM(群晖)

个人建议使用套件安装,docker安装版本相对较老,以套件为例,配置完旷神的套件源后,直接搜索下载,下载完直接停用

并按照使用教程https://imnks.com/3175.html ,进行配置。记得修复完启动,唯一不一样的就是启动后要去该目录/var/packages/zerotier/var 下替换planet文件,如果找不到该目录就启动一下套件就有了。

安卓

安装第三方客户端:ZerotierFix

MacOS系统

安装后,planet的路径在/Library/Application Support/ZeroTier/One ,替换后执行以下命令。

sudo launchctl -w unload /Library/LaunchDaemons/com.zerotier.one.plist # 关闭服务
sudo launchctl -w load /Library/LaunchDaemons/com.zerotier.one.plist  # 启动服务

OpenWrt设备

在控制台网页中找到相关软件包,并下载安装

连接SSH,上传planet文件到路由器,记住上传的路径,进入/etc/config ,编辑zerotier文件

如下图,进行配置

执行service zerotier restart 重启服务即可。

客户端加入自建 Planet 中的虚拟网络

xxxx为控制台创建的网络ID

zerotier-cli -q join xxxxxxxxxxxxxxxx

在控制台勾选授权

最终效果

客户端使用命令,查看所有客户端连接情况,发现都是直连,也就是P2P打洞成功

控制台查看所有主机

尝试访问其中一个客户端

测试损耗

基本吃满了家宽的30Mbps上行,很满意

总结

比起市面上常见内网穿透方案,zerotier更加简便,损耗更少,缺点就是配置会相对麻烦一些。