本文最后更新于 2024-06-05,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

一、Zerotier 原理

1717586356114.webp

概念

  1. planet:核心角色,官方不允许自建私有,zerotier 的行星服务器,用于管理全球所有的 zerotier 客户端的地址信息,帮助建立客户端间的直接链接,以及在无法建立直接链接时,作为中继服务器转发设备间的流量。
  2. moon:官方允许自建私有,作为离客户端更近的中继服务器存在,可以使转发的效率更高。

原理

* 客户端注册

在内网机器上启动一个 zerotier 客户端,使用 join 加入一个网络,在控制台对客户端进行授权,此时 planet 上有如下记录:

10.0.0.1 - 150.0.0.1/15679
10.0.0.2 - 160.0.0.1/22226
* 尝试 p2p 连接

当在 10.0.0.1 机器上访问 10.0.0.2,内网机器向 planet 查询到目标地址的公网 160.0.0.1,端口为 22226。

10.0.0.1 尝试与 160.0.0.1的 22226 端口进行直接数据交互,这个过程称为 udp 打洞实现 p2p 直连。

* planet 转发

由于各种网络限制,p2p 不能直连。

此时通过 planet 转发,如果还配置了 moon 节点,此时会通过速度快的 moon 节点进行转发。

如上图则大概率从上海的 moon 节点进行数据转发,此时网络取决于 moon 的带宽。

二、私有 zerotier-planet 的优势

  • 解除官方的设备连接数限制
  • 提升手机客户端连接的稳定性
docker run -d \
--name zt-ui \
-v /home/docker/zt-ui/zerotier-one:/var/lib/zerotier-one \
-v /home/docker/zt-ui/ztncui/etc:/opt/key-networks/ztncui/etc \
-p 4000:4000 \
-p 9993:9993 \
-p 9993:9993/udp \
-e MYADDR=1.1.1.1 \
-e HTTP_PORT=4000 \
-e HTTP_ALL_INTERFACES=yes \
-e ZTNCUI_PASSWD=admin123 \
--restart=always \
hausen1012/ztncui

三、搭建私有 planet

docker run -d \
--name zt-ui \
-v /home/docker/zt-ui/zerotier-one:/var/lib/zerotier-one \
-v /home/docker/zt-ui/ztncui/etc:/opt/key-networks/ztncui/etc \
-p 4000:4000 \
-p 9993:9993 \
-p 9993:9993/udp \
-e MYADDR=1.1.1.1 \
-e HTTP_PORT=4000 \
-e HTTP_ALL_INTERFACES=yes \
-e ZTNCUI_PASSWD=admin123 \
--restart=always \
hausen1012/ztncui

这里需要注意的是传参需要将 1.1.1.1 修改为公网 ip。

2、生成 planet 文件

docker exec -it zt-ui bash /tmp/patch.sh && \
docker restart zt-ui

如果 linux 内核版本太低,可能报错 FATAL: kernel too old,那么需要升级内核。

关于升级内核,可以参考这篇文章 Linux 系统内核升级

当然,如果你觉得云服务器不太方便升级内核,那么完全可以用一台测试的虚拟机进行生成文件,文件生成后用 ftp 上传到 /home/docker/zt-planet 目录,然后再启动容器。

3、测试

docker exec -it zt-ui zerotier-cli listmoons
# 显示如下内容则表示搭建成功
[
 {
  "id": "00000004e3b1b4b0",
  "roots": [
   {
    "identity": "04e3b1b4b0:0:ea0c548b45efcc701c052305f06568c749a4647b9a5b111e2b372c05f7c3ed56ae1009c29cb1aa51d95057bf1b65b3a2f7b01d129437f6b72efd08f68281fb52",
    "stableEndpoints": [
     "1.1.1.1/9993"
    ]
   }
  ],
  "signature": "b4f539ef93e198203d9e270c155d091769408ff98489d83bcf6444d2a95112ca7369138b98d42512caa3c878f3eff2c27ecada28f549ea19e3a407e71bbeb008d51f6ba92af17e8b6e4c1b8eacbd4abc42f0f639746ea924cffb99b539f94e2b",
  "timestamp": 1665642068786,
  "updatesMustBeSignedBy": "7fcb120079801a1ddde8c1fb6657365351bca7279e8470728f4cf01fb5efc81b57cde03338b4ea76dfd39570f74f2654d8d52a22613e77ed2e4cbb46a648a42d",
  "waiting": false
 }
]

1.1.1.1 为公网 ip 则搭建 planet 成功。

四、创建私有网络

访问 http://公网ip:4000,账号密码:admin/admin123。

1、创建网络

1717586651385.webp

2、初始化网络

点击 Easy setup

1717586665598.webp

设置网段和子网掩码

1717586679165.webp

五、安装 zerotier 客户端

docker 安装

既然已经搭建了私有的 planet,当然是使用自己的,需要先下载服务器 /home/docker/zt-planet/zerotier-one 目录下的 planet 文件。

1、启动 zerotier 客户端
docker run -d \
--name=zt-cli \
--device=/dev/net/tun \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN -d \
-v /home/docker/zt-client/zerotier-one:/var/lib/zerotier-one \
--restart unless-stopped \
hausen1012/zerotier
2.替换 planet 文件

将服务器下载的 planet 文件上传到客户端的 /home/docker/zt-client/zerotier-one 目录。

3、重启客户端
docker restart zt-cli
4、查看 planet
docker exec -it zt-cli zerotier-cli listpeers

1717586735205.webp

可以看见 stableEndpoints 的配置是自己的公网 ip。

加入网络
docker exec -it zt-cli zerotier-cli join 8b8b9ed58a10bd45
6、授权

1717586764258.webp

ip 也可以自己设置,不过要在刚刚设置的网段内。

1717586778734.webp

windows 安装

1、下载客户端

下载地址

2、安装客户端

双击安装即可

3、替换 planet

将下载好的 planet 文件复制到 C:\ProgramData\ZeroTier\One 目录下

4、重启服务

如果仅仅只是重启 ui 是不行的,需要找到任务管理器 -> 服务 -> ZeroTierOneService,进行重启。

1717586809525.webp

5、查看 planet

1717586829847.webp

可以看见 planet 地址是自己的公网。

6、加入网络

点击右下角图标,join new network,输入刚刚创建的虚拟网络 id,我这边是 8b8b9ed58a0baa3d。

7、授权

和 dokcer 安装一样的操作,不再赘述。

六、测试

通过上述方式将两台机器加入到网络,通过 ping 查看是否能打洞成功。其中 202 本地虚拟机,vps 是有公网 ip 的云服务器。

1717586845491.webp

ping 检测

在 10.0.0.202 机器上 ping 10.0.0.222。

1717586858026.webp

listpeers 查看到只有自己的私有根服务器,ping 的延迟不到 100ms 和直接 ping 公网 ip 差不多,说明打洞成功。

局域网 scp 检测

1717586876651.webp

可以看见速度能达到十几MB,而我的根服务器是腾讯云的 8Mbps 服务器,如果通过根服务器转发肯定不可能达到这个速度,说明打洞成功。

speedtest 测速

1717586889925.webp

反向代理

参考教程:安装及使用

⚠️Nginx Proxy Manager(以下简称NPM)会用到80、443端口,所以本机不能占用(比如原来就有Nginx)

互联网使用请确保完成了域名解析