前言
之前小白写过一篇教程:wireguard异地组网|异地内网互通|以腾讯云广州香港为例,来介绍使用wireguard异地组网,从而实现fake iplc的效果,但是小白实际测试下来,如果是多客户端异地组网,貌似客户端与客户端之间的流量都需要通过服务端中继(也有可能是我没设置好……),而不能实现客户端点到点的数据传输。如果此时,客户端与客户端之间进行大流量的数据传输(你懂的),如果服务端性能不够强劲的话,压力还是很大的。
后来有个老哥用的zerotier,听他讲zerotier是可以实现客户端点到点的P2P传输的,我们还以腾讯云广州香港为例,利用zerotier实现内网互通。
ZeroTier 原理
ZeroTier
这一类 P2P VPN
是在互联网的基础上将自己的所有设备组成一个私有的网络,可以理解为互联网连接的局域网。最常见的场景就是在公司可以用手机直接访问家里的 NAS
,而且是点对点直连,数据传输并不经由第三方服务器中转。
Zerotier
在多设备之间建立了一个 Peer to Peer VPN(P2PVPN)
连接,如:在笔记本电脑、台式机、嵌入式设备、云资源和应用。这些设备只需要通过 ZeroTier One
( ZeroTier 的客户端) 在不同设备之间建立直接连接,即使它们位于 NAT
之后。连接到虚拟 LAN
的任何计算机和设备通常通过 NAT
或路由器设备与 Internet
连接,ZeroTier One
使用 STUN
和隧道来建立 NAT
后设备之间的 VPN
直连。
简单一点说,Zerotier
就是通过 P2P
等方式实现形如交换机或路由器上 LAN
设备的内网互联。
ZeroTier
官方搭建了一个行星根服务器叫做 地球 Earth
,这个行星根服务器是唯一且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。
行星根服务器 R 记录了所有的路径信息,设备 A 能通过 ZeroTier
唯一地址标识找到需要连接的设备 B。这个过程如下:
- A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。
- 如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根 (planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。
- R 还向 A 发送一个消息,包含有关它如何到达 B 的提示。同时,将消息发给 B,通知 B 它如何到达 A。
- A 和 B 获取它们的消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。
- 如果无法建立直接路径,则通信可以继续中继 (速度慢)
除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。由于 Earth 在国外,如果使用免费套餐,连接时的延迟可能会很高。不过 ZeroTier
能自己创建根服务器 月球 Moons
,这样我们就能在大局域网中得到更好的体验了。
注册与客户端安装
注册帐号
进入https://my.zerotier.com/login,并创建账号,记录NETWORK ID,客户端要用到
客户端配置
直接使用脚本安装
curl -s https://install.zerotier.com | bash
Debian系统有可能出错,原因如下:
Debian10、11要安装zerotier时,都会出错。好像是1.65之后的都是出现这个问题,搞了很久都没有解决。因此在使用安装脚本之前,务必安装前签名GPG
apt install curl gnupg apt install apt-transport-https ca-certificates lsb-release #这几个不是必须要安装的,不过在安装docker时也会用到 curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import && \ if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | bash; fi
直接使用命令行进行操作的方法如下:
# 启动 $ zerotier-one -d # 获取地址和服务状态 $ zerotier-cli status # 加入、离开、列出网络 $ zerotier-cli join # Network ID $ zerotier-cli leave # Network ID $ zerotier-cli listnetworks
加入自己的网络,如果提示200 join OK,说明没有问题。这里特别说一下,子方尝试过使用lxc安装,这里会提示 500 join OK,在管理页面能看到在线,但看大家说,需要解决tun-br问题
zerotier-cli join NETWORK ID
查看自己的网络, 这里会有zerotier的网卡信息。另外,使用<ip addr>查看自己的网卡。
200 listnetworks 83048a0632a2cb16 16:d3:3a:48:47:7b ACCESS_DENIED PRIVATE ztqu3crtje –
zerotier-cli listnetworks
认证设备和组网
回到一开始注册的网页,会发现设备列表当中新增了两台设备,在前面的方框打钩即可。根据 Node ID
判断设备的类型,牢记设备被分配的 IP
。
当然,我们也可以删掉自动分配的IP,自己分配内网IP,小白这里为了方便记忆,改成了10.144.0.3
和10.144.0.4
。这是我们可以回到广州和香港的机器,去看一下内网IP。我们可以看到,两台机器都已经获得了内网IP。
我们来看下测试一下延迟和速度。
我们可以看到,第一个ping的延迟很高,应该是广州和香港两台机器在向根服务器请求互相连接,而后面11ms的延迟则是两者已经建立了P2P的点对点传输。
这里就存在一个问题,根服务器位于境外,由于总所周知的原因,高峰期可能导致客户端之间无法建立连接。所以我们可以自建moon/planet服务器,这个以后有机会我们再来讲。
我们再来看下速度,路由啥的。
fake iplc/迫真IPLC
有到了喜闻乐见的fake iplc了,我们直接走起。
跑个油管
注意:纯属娱乐,和wireguard一样,有握手所以特征明显,udp会被限流。仅仅当作虚拟专用网络来说还可以,要富强的话,你有其他更好的选择。
提示
如果内网不通的话,考虑下是不内核转发没开启,可参考如下命令:
开启转发功能。其中,ens18要替换为自己的本地网卡,ztqu3crtje要替换为zerotier的虚拟网卡
sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE iptables -A FORWARD -i ens18 -o ztqu3crtje -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i ztqu3crtje -o ens18 -j ACCEPT
apt install iptables-persistent bash -c iptables-save > /etc/iptables/rules.v4 使规则持久化
延伸阅读
上面的示例中,我们只介绍了 ZeroTier
的基本使用。ZeroTier
的功能远不止这些,如果你非常感兴趣还可以参考下面这些文档:
- Openwrt 使用 ZeroTier 实现内网穿透
链接:https://qingsay.com/zerotier-openwrt.html
- 无公网 IP 搞定群晖 + ZEROTIER ONE 实现内网穿透
链接 1:https://www.hao4k.cn/thread-29377-1-1.html
链接 2:https://zhuanlan.zhihu.com/p/73558450
- 使用 ZeroTier 建立 IPv6 隧道
链接:https://moe.best/tutorial/zerotier-ipv6.html
- 在容器中不依赖 TUN/TAP 使用 ZeroTier 实现 P2P VPN
链接:http://www.senra.me/nat-traversal-series-zerotier-p2p-vpn-can-be-used-in-container-without-tuntap/
- Zerotier 简明教程
链接:https://jiajunhuang.com/articles/2019_09_11-zerotier.md.html
- 使用 Docker 创建 ZeroTier Moon 节点
链接:https://www.cnblogs.com/webenh/p/11263421.html
- Zerotier 2.0 的愿景图
总结
从上面的介绍,我们可以看到 ZeroTier
在使用上非常简单、也支持多设备多平台,并且可以无需公网服务器。但由于其免费的根服务器在国外,可能网速会一定影响,建议自建私有根服务器。
参考文档(抄)
2.debian11 安装zerotier并实现局域网自动nat转发
3.Debian11 zerotier nat转发遇到的部分问题