概述
为什么选择Zerotier
在正式开始讲解 Zerotier 服务器的搭建之前,我想先对 Zerotier 做一个简单的概述。否则,你使用 Zerotier 时就会非常的困惑。
经过几次的深思熟虑,我想我还是应该先将Zerotier的使用场景列举出来:
-
你拥有多台主机(包含但不限于笔记本、PC、云服务器、NAS等),你希望能够不通过远程客户端(例如Todesk、向日葵等)就能够,直接使用你的主机访问家庭里面的网络设备,并确保安全、稳定、快速
-
你可能了解过混合云的概念,你想搭建一条(安全、快速、稳定)的网络通道,用以连接本地云和远程云
-
你仅仅想尝试VPN,但你尝试过其他的VPN协议,发现家庭网络不满足条件
-
你没有了解过我上面提到的协议,想法等,你只有一个单纯的思想,安全的连接云服务器,安全的连接家庭中的NAS,但是你又没有公网IP或者认为直接暴露端口太危险,说简单一点,就是你想拥有一个可以在家庭外部和内部的一个安全的私有的网络。
相较于市面上的其它SDN(Software Defined Network)产品,ZeroTier的优势如下:
- 使用简单,可以通过
zerotier-cli
命令行工具,快捷的join
、leave
以及inspect
网络,基于zerotier-cli
你可以很方便的编写自动化脚本。 - 像OpenWRT、群晖、Windows、Mac等平台,ZeroTier都有所支持(etc. ZeroTier是一个开源的软件,可以通过编译的方式以在不同的平台上运行)。
- ZeroTier是可以兼容商业和家用的一个产品,并且全链开源。
- 稳定,ZeroTier的版本更新可谓是最稳定的,它相当的可靠,你可以放任它的
Controller
端在服务器上,而不必为版本更新而苦恼。
该教程将介绍两种搭建Zerotier服务端的方式:
- Moon
- 自建Planet
Moon可以搭建属于自己的中转站,默认情况下ZeroTier会尝试使用两个节点的9993
默认端口建立P2P通信或通过Planet节点进行中继通信。国内大多数地区不提供独立的公网IP或全锥形NAT(一对一端口NAT),所以使用ZeroTier都是通过Planet进行通信,但ZeroTier的Planet节点在国外。然后我们说说优缺点。
- Moon服务方式的优点:Zerotier官方的中介服务器全在国外,当你加入网络时,往往会失败,而Moon就是可以让你自己创建自己的中介服务器,并使用ztncui来进行管理你的网络,这样就无需在官方处进行管理将网络私有化。ZeroTier是卖服务,不卖产品。
- Moon服务方式的缺点:Mac用户无法使用Moon,所以Mac无法和除了Moon以外的节点通信(Linux、NAS、Windows等),这个缺点是很致命的(对于Win和Drawin 双系统用户来说是这样的,这样就意味着,你为Mac所准备的私有云存储无法使用),基于这个缺点的话,我又去倒腾了一下,找到了第二种方式。
自建Planet:
该方式通过更换planet
文件的方式来将客户端所连接的planet指定为私有的,我们的公网服务器。Planet和Moon的区别讲起来有些抽象。
Planet**是行星,Moon是翻译过来为"月亮;卫星",这里我们理解为卫星。当行星单独存在时,所有的LEAF(也就是叶子节点)都由Planet带着;当有Moon时,节点优先跟着指定的Moon节点。当无法确定Moon节点时,Planet可以来建立Moon和节点之间的连接。也就是Moon节点也是归Planet管理的,你可以通过Planet来找到Moon节点所管理的网络。但是一般情况下,国内对Planet连接是不稳定的,所以不能够借助官方的Planet来制备Moon,这就导致了,需要我们在每个客户端中都上传Moon节点的配置文件。
接下来继续说到自建Planet,它和Moon相比,就是你自己做官方,并且Mac用户也可以和其它平台的客户端通信,替换了planet
文件后,只要是属于你自己控制器创建的网络(Moon方式和Planet方式),直接使用zerotier-cli join
加入即可。缺点嘛,就是需要替换planet这个文件(你可以在你的Zerotier软件根目录下看到)。
这篇教程,原本编写了Moon搭建部分,但是没有必要了,已经有自建planet的方案了,并且还将Moon给集成了进去。
什么是 Zerotier
如果,你已经对 Zerotier 有一定的了解,知道它是做什么的,知道一些它的基本概念,并能够在无法连接时通过它的概念进行排错,那么你可以在页面上寻找目录。
Zerotier 它是一个在国外非常流行的,开源虚拟局域网软件,或者我们可以通俗一点,称之为VPN(Virtual Private Network),这样对大多数人来说或许更加的亲切,但是请切记,它是通过软件的方式,即基础网络设施无关化。若你对VPN有一定的了解,那么我想你应该听说过,PPTP,L2TP和IPsec等VPN协议(这里不会阐述什么是VPN,VPN的原理是什么,因为那样做这篇文章的中心就改变了)。上述所提到的VPN协议,它们都是经过许多人的认同并且广泛应用于各大企业中,它们的安全性,稳定性肯定是得到了大家的认可。但是为什么我们不使用以上的协议来搭建VPN呢?
使用上述协议搭建VPN需要具备一些条件,其中最重要的就是你必须要拥有公网IP。公网IP是什么,你可以自行搜索一下。如果使用文字来阐述这些概念,我想这篇文章的主题或许就变成它了。简单点来说的话,就是你无法满足使用标准VPN协议的条件,所以你需要使用其他的方式来完成内网穿透。
而Zerotier正好满足这个条件,但是Zerotier有一个关键,就是它是通过P2P协议来进行内网穿透的,所以需要一个帮助两端主机进行握手的中介服务器,Zerotier官方是提供了免费的握手服务器,但是很不辛的是,国内访问 planet 特别的缓慢,并且时常丢包,导致无法访问。但是没有关系,Zerotier还提供了自建握手服务器的功能,我们称为Moon节点,它能够帮助我们的主机与主机之间握手,如果无法使用 P2P 握手成功,Moon节点还可以作为中转服务器,来中转设备之间的流量。
官网所说的能够通过 Zerotier 来进行远程游戏也确实是如此的,因为P2P成功建立后相当于你的远程游戏主机和你远程客户端直连,不用多走一个中间设备,你可以看下面这张图,你就能够明白了。两台主机在同一个城市内的话,基本延迟能够控制在10ms以内。

这里面还有一个比较重要的功能就是Network Control,网络控制器,它的功能就是负责维护虚拟局域网和管理设备。如果是使用官方的Planet节点的话,官方网站会提供一个控制器(需要注册和登录,然后才能去管理),如果是使用Moon节点的话,我们需要自己搭建网络控制器,方法也很简单,跟着做就行了。
注意,你必须有一台拥有静态公网IP的云服务器,且能够使用
9993/udp
及一个或多个以上端口。如果没有的话,你是无法搭建Moon节点和Planet服务器的。Zerotier 不支持域名解析,所以DDNS的方式也是不可以的。
Planet 服务器
相较于Moon而言,自建Planet方式要简单一些,因为我已经将部署步骤封装好了,所以搭建起来就会很容易。
本教材只演示Docker+主机Zerotier的方案,你想独立的话,你自行研究吧。
准备工作
首先第一步肯定是在主机上安装 Docker
并且安装 docker compose v2
插件,具体怎么安装:`Docker 官方文档
我的机器是Debian的,习惯其它Linux系统的,没必要跟着我用。你可以用你熟悉的系统,
还有就是一台拥有静态公网IP的服务器,并且服务器至少能够放行2个或3个自定义端口(现在有些平台可以不租用独立的IP,只租用端口,然后作转发)
提一句,如果是使用的1Panel面板的话,可以直接在应用商城安装部署,你就可以不用看我安装的步骤。2024年11月21日,1panel已下架 ZeroTier 一键部署。
部署
官方教程:https://www.mrdoc.fun/doc/443/
该方式的部署教程,看镜像制作者本人是最好的,这里对博客教程一些迷惑的地方做一些讲解并补充一些内容:
当然是在你想了解为什么这样做的前提下。你大可以直接cv使用即可,就我看来,大多数人皆是如此,不知然,不知其所以然
Docker 相关疑问
我们先来解释第一条指令:
git clone https://github.com/Jonnyan404/zerotier-planet
OR
git clone https://gitee.com/Jonnyan404/zerotier-planet
git clone
指令,用以将提供的远程仓库克隆到本地,这里制作者提供了2个地址Github和Gitee的,在国内的话,你就用gitee就行了。
cd zerotier-planet
指令如果提出来说的话,确实有点让人情以难堪
docker-compose up -d
命令会在当前所在目录查找docker-compose.yml
文件,-d
,就是后台运行的意思,详细的你可以使用docker compose up --help
命令看一下它的详细解释。
后面的几条命令docker cp
和 docker exec
,顾名思义,就是向容器拷贝文件和在容器内执行命令,这个没有什么说的,它的命令执行规律你基本上可以看出来。
然后说一说,docker-compose.yml
文件,这个文件中的一些内容是可以修改的,不要每次使用都直接cv,看一看对你没有坏处。
这里我就直接放图片了
这样给你们说吧,除了 image
的参数和容器内的参数以外,其他的你都可以改。其实制作者已经特别尽责了,能让你改的参数都给你表示出来了,注释都给你打那的。其中HTTP_PORT
、HTTP_ALL_INTERFACES=yes
和ZTNCUI_PASSWD=mrdoc.fun
都是 ztncui 的配置选项。
MYADDR
是你服务器的静态公网IP,这个必填,如果你什么都不改,那么生成的planet文件就无效。
ports
选项下::
左边的随便你改
配置文件描述就到这里吧,那些选项参数,你光猜也能猜出来
客户端和Controller共存
Controller和Zerotier客户端共存,无法共存的主要原因如下:
- 因为Controller已经使用了 9993 端口,Zerotier 无法再使用
- 在启动Zerotier-one 服务后,使用 zerotier-cli 或相关命令提示"Error port and zerotier-one.port not found"
其实这两个问题都是一个原因,9993端口无法使用,这个在可以直接P2P的情况下才会出现,在无法P2P的场景中不会出现,这里不讨论为什么。
以上的问题都可以通过在/var/lib/zerotier-one/local.conf
文件中添加以下内容解决:
{
"settings": {
"primaryPort": 9994
}
}
9994
可以随便改,只要没被使用就行,原文的话是这里StackOverflow
配置 Network
现在通过 http://IP:3443(这里的IP是你的服务器的IP地址)
你应该能够进入管理页面了,如果你是云服务器记得先开启云防火墙的 3443/tcp
和 9993/udp
。其中 3443
端口我们只是临时开启,后面我们会通过虚拟内网连接到控制面板。所以面向公网的端口开放,仅仅在我们的客户机还没有连接上Controller的时候使用
修改密码
点击右上角的登陆按钮,
<<< 看我这,看我这 >>> 默认管理员账户为:admin
默认密码为:password
首次登陆后,它会弹出让你设置密码,这个时候不要点击cancel
去取消它,马上更改。如果你的网站被扫描到,,会被梭哈,攻击脚本的速度非常快。
不要勾选在下次登陆时生效(Change password on next login),两次密码输入完成后,点击 set password
。
提示如图即修改成功
添加网络
然后我们点击导航栏中的 Networks
,它会在右侧弹出,Add network
的选项,点击
网络名称你随意
填完后就是这样的,然后我们点击 Easy Setup
也就是配置向导
配置网络
这里有两个方式去配置:
- 直接点击箭头提示处,它会自动生成掩码、网络号、IP池
- 手动配置(写在这里就是提个醒,告诉你支持手动配置,不要和任何你已知并且在使用的局域网网络同段)
如果你不懂网络的话,你就直接点 Generate network address
就行了,然后点 submit
进行提交
添加节点
各平台 Zerotier 根目录路径。
- Linux:
/var/lib/zerotier-one/
- Windows:
C:\ProgramData\ZeroTier\One\
- MacOS:
/Library/Application Support/ZeroTier/One/zerotier-one/
将数据目录dist
目录下的planet
文件拷贝至各平台ZeroTier根目录下。
控制器
现在我们需要将客户端join
网络即可,首先是将控制器接入,拷贝被我打码且被()
包含的字符串,称为网络ID(Network ID),也就是网络名称旁边的那串。
进入 Zerotier 的服务器终端(注意不是Docker里面),输入:
zerotier-cli join e49da6c9187f4b28 # join 后面的就是你刚才拷贝的那个字符串,我这里填的是打乱后的 Network ID
输出结果为 200 join OK
时,检查是否连接到控制器节点:
zerotier-cli peers | egrep 'PLANET|LEAF'
打开你的 Web UI,点击刷新,你就会看到被我框起来的内容,Peer Status
栏下提示的是 CONTROLLER
,就是控制器的意思,我们现在 Member name
栏下填写该节点的备注,随便你咋写,这个没要求。
之后点击 IP assignment
给它分配一个 IP
然后点击 Authorized
栏下的选框,给这个主机授权就行了,接下来就是将客户端设备(客户端设备我们称为节点Node)加入这个 Moon
在WebUI中进行节点授权和分配IP后,使用以下命令检查是否已经获取到分配的IP,成功获取后即可访问同网络下其他设备
zerotier-cli listnetworks
添加控制器节点的方式,就是Linux加入ZeroTier网络的方式,所以下面将不再演示
Windows
顺着安装即可。
一、将 0000xxxx.moon
文件放入指定的 moons.d
目录下
二、启动 zerotier-one UI 程序,在你状态栏中你会看到如下图标 右键它
在弹出的输入框中,输入网络ID,点击 join
,它会自动配置,请等待一会,当你右键它时,不再提示你 Wait
字样的提示后,你讲看到如上图所示的内容,这时你已经加入了远程网络。可以正常访问同网络下的其他设备。
OpenWRT
OpenWRT 的连接需要先在软件包管理处安装 ZeroTier 软件,然后再通过命令行安装,因为OpenWrt的加载机制,除了重要目录外,其余目录都为内存映射。所以在Linux下的 /var
会被重置为映射的目标目录,所以你替换了planet
文件后依然无法加入网络的原因就是这个,有两种解决方式:
- 修改映射的目标目录
- 修改ZeroTier的
config_path
配置
这里演示修改配置文件:
mkdir -p /opt/zerotier
uci set zerotier.global.enabled='1'
uci set zerotier.global.config_path='/opt/zerotier'
uci delete zerotier.earth
uci commit
#通过
uci show zerotier #来检查配置
在较新版本的OpenWRT中已经无法再通过UI的方式去管理了,主要还是因为OpenWRT在新版本中,不再采用传统的MVC架构导致的。现在转而通过JS来渲染前端了,OpenWRT的ZeroTierUI版本还停留在老的OpenWRT重
苹果
Mac中使用ZeroTier也很简单,只需要替换planet
文件即可。
补充Planet
下面是我自行打包封装的ZeroTier Controller