前言
我之前想要异地组网的话,一般都采用内网穿透的方法,但是这个内网穿透有弊端就是都是要通过公网服务器转发流量,对于大流量的传输就比较不方便,我发现了 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)
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 容器日志
docker compose logs -f zerotier
日志最后输出一行 zerotier | 200 join OK 代表已经加入网络成功了
测试
在最上面设备的图中我们看到 linux 服务器的虚拟 ip 是 172.27.14.177 ping 一下试试
C:UsersAdministrator>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 客户端
[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 代理
可以参考我之前的文章
当然有更加好的方法,会稍微麻烦一些如果你想深入研究的话可以看我这篇文章
Comments NOTHING