
ZeroTiger是一个国外的服务商所提供的基于P2P的组网方案,它可以通过软件的形式实现将我们需要组网的设备加入到一个虚拟的局域网中,从而实现数据的交换。
组网逻辑:
1.组网设备接入Zerotier,并通过ID加入指定的虚拟网络。
2.当设备之间发生数据交换时,网络调度设备间尝试P2P直连。
3.失败时,从网络中寻找moon服务器作为中转。
我们使用自己的云服务自建Moon服务器加入Zerotier网络,当P2P失败时,数据始终通过我们自建的私有根服务器作为中转。私有网络需要认证才可以加入,具有一定的安全性。
1.搭建Zerotier根服务器
依然使用我们的老伙计docker来实现,创建很简单,一条命令创建即可。
docker run --restart=on-failure:3 -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=admin@123 -p 4000:4000 keynetworks/ztncui

2.搭建Moon服务器
前面也介绍过了,使用Zerotier在一定程度上是可以P2P打洞成功的,不成功的时候就可以使用我们的Moon服务器来进行中转,保证完成组网。此服务需要占用tcp及udp的9993端口
# 创建一个持久化存放文件的目录
mkdir -p /opt/docker/moon
# 获得云服务器的公网ip
public_ip=`curl ip.sb`
# 建立moon服务器
docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /opt/docker/moon:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 $public_ip

到此我们的服务端就搭建好了。查看一下日志,记录一下moon id,后面加入会用到。
docker logs -f zerotier-moon

3.创建网络
使用我们云服务器http://ip:4000访问,ip为云服务器的公网ip,打开配置页。

点击右上角的login登录。

使用默认用户名和密码登录: admin/admin@123,登录完成后根据提示修改密码。

设置完成后,切换到Add network选项卡,任意为网络起一个名字。

点击Create Network

这样我们的网络就设置好了,请记录创建好的网络id。

回到上一级页面,最后在network上,设置网段,可以点击自动生成,然后提交。


4.搭建客户端
为了方便演示不同平台,我这里以一台Linux和一台Windows为例子演示组网过程。
- Windows:
首先到官方网站上下载Windows客户端:
https://www.zerotier.com/download/
安装很简单,下一步即可。完成后,在开始菜单中可以找到安装的ZeroTier软件,右下角会多出图标,打开面板。把之前记下的网络填入下方,点击Join Network。

回到网页上授权,并定义一个友好的名字,方便辨认。

客户端上,状态显示成功时,表示搭建成功。

最后在配置一下加入moon服务器,打开cmd。
cd C:\ProgramData\ZeroTier\One
zerotier-cli orbit [moon_id] [moon_id]
将之前记录的moon id填进去后执行。

查看是否加入monn节点:
zerotier-cli listpeers
可以看到其中包含我们自建moon服务器的公网ip地址。

- Linux:
拉取镜像:
docker pull bltavares/zerotier
配置镜像:
docker run -d --device=/dev/net/tun \
--name zerotier-one \
--net=host \
--restart=always \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN \
-v /var/lib/zerotier-one:/var/lib/zerotier-one \
bltavares/zerotier:latest

加入zerotier网络
docker exec zerotier-one zerotier-cli join [网络ID]

显示 200 join ok 即添加成功。同样的需要在网页上去授权此节点。可以看到已经有虚拟ip生成,可以测试下两台主机之间的联通性。

发现已经可以使用p2p建立虚拟网络了,一台四川的服务器和一台北京的阿里云服务器,延迟大概40ms左右,效果还是很不错的。

最后再加入moon服务器,同样的需要把moon_ID的值修改为自建moon服务器的id。
#加入moon服务器
docker exec zerotier-one zerotier-cli orbit [moon_ID] [moon_ID]
#确认是否加入
docker exec zerotier-one zerotier-cli listpeers

至此~