个人异地虚拟局域网搭建------ZeroTier

ZeroTier介绍

ZeroTier is a smart Ethernet switch for planet Earth. 按照个人理解,通俗的说使用P2P + SDN技术搭建VPN的技术工具。
我们可以创建一个VPN Network,然后把我们的终端设备添加近来,实现设备之间的P2P访问(Direct或者Relay)。

ZeroTier拓扑简单描述

拓扑组成:

  • ZeroTier根服务节点(Planet)
  • 私有根服务节点(Moon)
  • 用户设备节点(Leaf)

设备节点之间的P2P通过Planet节点来完成“握手”,如果P2P之后的设备节点之间“交互”需要Relay的话,通过Planet节点来进行Relay。

通常Planet节点有多个,应该是出于负载均衡的考虑。譬如某些Planet节点负责握手,某些Planet节点负责Relay。

Moon节点是用户自己搭建的私有根服务,目的是在Planet节点的表现较差的时候取代Planet节点的角色,帮助Leaf节点完成“握手”和“基于Relay的数据交互”

搭建VPN

创建VPN Network

登陆Zerotier官网注册账号,按照Getting Started with ZeroTier的说明创建一个VPN Network。
创建一个Network,使用默认配置即可。或者你可以稍微做些改变,譬如:

  • 重命名Network
  • 修改IP地址范围
  • 授予其他人对该Network的访问权限(譬如read)

部署私有根服务Moon

参考Private Root Servers

为什么需要私有根服务

整个P2P可以分为两个阶段,P2P两端设备打洞阶段(或者称之为握手阶段)和双端正常数据交互阶段。

在设备P2P握手和交互数据(通过服务器中继)的时候需要用到根服务。P2P实际是一个NAT穿透的过程,简单的说就是两端的设备在建立连接的过程中,各自连接公网的服务器,这样公网的服务器就会记录每个设备会话映射的公网出口,以及每个设备在什么类型的NAT设备后面等信息(NAT或者说NAPT分为四种类型,Symmetric NAPT进行P2P的时候需要服务器进行中继,这里不展开讲了。目前个人常用的大多数的设备的NAPT类型是Port restricted NAPT)。

最好的情况是服务器发现,双端设备的NAPT类型满足Direct连接的条件,那么就会通知双方该如何去连接对方(通过设备会话映射的公网出口:IP+Port),进而双方可以Direct直接通信。

不好的情况是,服务器通过分析发现,双方不满足Direct通信条件,那么就会告知双方,大家通过中继服务器进行转发(当然这个中继服务器可以是本服务器,或者其他(负载均衡的考虑))。

好了,简单讲了这么多,我们需要私有根服务的原因是,默认的根服务(称之为Planet)是ZeroTier提供的,大家公用的,且在国外。这导致的问题是“握手阶段”很慢(甚至失败);如果P2P为Direct的话,双方交互不受影响,但是如果P2P为Relay的话,交互也会非常慢。

所以我们需要一个处于国内,公网的,网络环境较好的,有公网IP的服务器(可以是各种:弹性云服务,弹性容器。。。)(当然你如果不想访问Internet,也可以在局域网内部署一个私有根服务,供局域网使用P2P的情形)。用这台服务器进行“握手”和“中继”。

如何部署私有根服务

我们需要一台处于国内,公网的,网络环境较好的,有公网IP的服务器。(可以是各种:弹性云服务,弹性容器。。。)
当让最好是容器,这样迁移起来方便。我这里暂时没用容器。在一台华为的弹性云服务器ECS上部署的Moon。具体操作步骤按照官方说明,分为以下几步:

安装

curl -s https://install.zerotier.com | sudo bash

生成及修改moon.json

cd /var/lib/zerotier-one
sudo su
umask 0
zerotier-idtool initmoon identity.public >> moon.json
# 修改json的stableEndpoints,为公网ip和port9993,例如:["111.2.3.4/9993"]

生成签名文件

zerotier-idtool genmoon moon.json
# 生成一个签名文件<id>.moon
签名文件的id去除掉前面的0就是World ID,为设备节点添加moon服务的时候需要用到;另外还有个seed,是moon world下的root的id,我们只在moon上创建了一个root,这个root的id跟world id一样

移动签名文件

# 在/var/lib/zerotier-one 创建moons.d路径
# 将签名文件移至该路径下

重启zerotier服务

systemctl restart zerotier-one
# 将umask复位为默认值
umask 0022

将moon节点添加到Network

sudo zerotier-cli join <network id>

将设备节点添加到VPN Network

每个账号最多支持添加25个设备节点
Zerotier支持多个平台,Windows和Mac上都有zerotier的GUI工具,Linux只有命令行。但是所有平台都支持命令行。可以到官网下载安装Zerotier Download

设备端安装Zerotier客户端

这里以Linux平台为例,可以直接安装或者采用docker cotainer。

# 1. 直接安装
curl -s https://install.zerotier.com | sudo bash

# 2. 采用docker container
# 下载镜像
docker pull zerotier/zerotier:1.10.2
# 运行
docker run -d --cap-add NET_ADMIN --cap-add=SYS_ADMIN --device /dev/net/tun --net=host --restart=always --name zerotier-one zerotier/zerotier:1.10.2

使用Docker container里的zerotier-cli跟采用系统的zerotier-cli方式相同,只是调用的方式要符合docker规范

docker exec zerotier-one zerotier-cli [options]

将设备添加到Network

执行以下命令,

sudo zerotier-cli join <network id>

为设备添加Moon根服务

sudo zerotier-cli orbits <world ID> <seed>

管理设备

登陆你的ZeroTier账号,管理Network,为新加入的设备授权(可以修改默认非配的IP地址)

VPN使用

现在可以使用P2P了,根据Network分配的IP访问对端设备。

Debug

查看设备之间的P2P方式
查看设备之间是Direct直接访问还是Relay通过中继访问

sudo zerotier-cli peers

测试延迟
ping对端设备,这里在两端之间一直有流量的时候,ping的延迟会比较低。单独ping的话延迟高一些,暂时还没有研究这个现象。

Direct访问时,ping延迟20ms左右(有流量情况下)

带宽测试
采用iperf测试TCP UDP带宽(Direct访问)
TCP 90Mbps
UDP 80Mbps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值