前言

我之前想要异地组网的话,一般都采用内网穿透的方法,但是这个内网穿透有弊端就是都是要通过公网服务器转发流量,对于大流量的传输就比较不方便,我发现了Zerotier 这个工具非常的好用,是基于p2p的

这是一个类似于 ZooKeeper 的工具,一款异地组网工具。每台服务器上只需要安装对应的客户端,连接到同一个网络,就可以实现 IP 互相访问。在此之上,还有自定义 DNS 服务器的功能,将通过 IP 这个步骤转换为通过域名进行访问,相当实用。

概念

所有的设备都是客户端,连接方式是点对点。在路由器下面的话是用 uPnP 的方式进行转发实现客户端到客户端的直接连接。如果 uPnP 没有开启,会通过传统的服务器转发的方式进行连接。

Earth

根据其介绍,将地球上的所有设备连起来。那这里的 Earth 指的就是整体的一个服务。

Network

每一个 Network 包含的所有设备都在同一个网络里。每个网络有一个 Network ID。各客户端通过这个 ID 连接到此网络。当然,一个账号是可以创建多个网络的。

网络氛围 Public 和 Private。一般我们自己组网是要用 Private,需要在页面授权设备才可以进行访问。Public 权限好像不太有人会需要吧..

以下介绍的所有概念都是属于 Network 下的。

Planet

星球嘛。指的是官方提供的服务器节点。各客户端都是通过这些服务来互相寻址的。相当于 zookeeper 的不同节点。

Moon

自定义的 Planet。由于 Zerotier 没有国内节点,在两个设备刚开始互连的时候有可能需要通过国外的节点寻址(不过我没发现有什么慢的)导致创建连接的速度偏慢。在自己的网络里搭建 Moon 可以使连接提速。

Leaf

客户端。就是连接到网络上的每一个设备。其实经过测试,Moon 也是客户端的一种。这里特指没有额外功能,单纯用于连接的客户端。

网络拓扑

Zerotier 对于客户端支持的非常全面,几乎包括了大部分系统

客户端下载地址:Download

docker客户端(docker compose)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
services:
zerotier:
image: zerotier/zerotier
network_mode: host
container_name: zerotier
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
volumes:
- ./zerotier-one:/var/lib/zerotier-one
command:
- 网络id

我在linux中使用的时候喜欢用docker部署,因为非常的方便,我也推荐大家在linux环境下使用docker部署

注册并且登录 网站:ZeroTier Central 

我推荐使用微软账户登录

他提供的第三方登录有谷歌登录,Github和微软

谷歌不用说了肯定是访问不了的,Github不定时抽风,所以最好还是微软账户登录

虽然微软在国内的访问速度也是比较迷

进入之后点击Create A Network 创建一个网络,设置的话不用改默认就行了,记下网络id就行

将docker容器和windows客户端分别启动,并且加入网络,在网站下点击你创建的网络,最下面看下在线的设备

 如果发现没有的话,我们可以看看linux下的docker容器日志

1
docker compose logs -f zerotier

日志最后输出一行 zerotier  | 200 join OK 代表已经加入网络成功了

测试

在最上面设备的图中我们看到linux服务器的虚拟ip是172.27.14.177 ping一下试试

1
2
3
4
5
6
7
C:\Users\Administrator>ping 172.27.14.177

正在 Ping 172.27.14.177 具有 32 字节的数据:
来自 172.27.14.177 的回复: 字节=32 时间=19ms TTL=64
来自 172.27.14.177 的回复: 字节=32 时间=4ms TTL=64
来自 172.27.14.177 的回复: 字节=32 时间=6ms TTL=64
来自 172.27.14.177 的回复: 字节=32 时间=4ms TTL=64

在服务器端linux中ping下异地的windows客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ZeroTier]# ping 172.27.16.228
PING 172.27.16.228 (172.27.16.228) 56(84) bytes of data.
64 bytes from 172.27.16.228: icmp_seq=1 ttl=64 time=3.84 ms
64 bytes from 172.27.16.228: icmp_seq=2 ttl=64 time=3.78 ms
64 bytes from 172.27.16.228: icmp_seq=3 ttl=64 time=4.49 ms
64 bytes from 172.27.16.228: icmp_seq=4 ttl=64 time=5.82 ms
64 bytes from 172.27.16.228: icmp_seq=5 ttl=64 time=3.98 ms
64 bytes from 172.27.16.228: icmp_seq=6 ttl=64 time=5.93 ms
64 bytes from 172.27.16.228: icmp_seq=7 ttl=64 time=4.27 ms
64 bytes from 172.27.16.228: icmp_seq=8 ttl=64 time=4.62 ms
64 bytes from 172.27.16.228: icmp_seq=9 ttl=64 time=4.02 ms
64 bytes from 172.27.16.228: icmp_seq=10 ttl=64 time=20.2 ms
64 bytes from 172.27.16.228: icmp_seq=11 ttl=64 time=4.25 ms
64 bytes from 172.27.16.228: icmp_seq=12 ttl=64 time=3.85 ms
64 bytes from 172.27.16.228: icmp_seq=13 ttl=64 time=10.6 ms

发现也是通了,组网成功

刚开始的时候延迟会比较大,等待一会就慢慢会降下来

那现在只能两个设备互访,那如何访问服务器所在的局域网内的所有设备呢???

我目前的方案是  SSH代理

可以参考我之前的文章

基于SSH打通隧道实现异地组网

当然有更加好的方法,会稍微麻烦一些如果你想深入研究的话可以看我这篇文章

OpenWRT+zeroTier旁路由组网-CSDN博客