文章目录[隐藏]
之前一直在用,v2ray 服务器在内网开端口,相当于通过代理的方式访问内网,利用内网的 openwrt 中 smartdns 做 dns 解析服务。
同事最近买了个群晖,但是家里没有公网 IP,所以一直在用 Frp 做内网穿透。但是 FRP 使用过的比较清楚,速度依靠公网服务器的带宽,而且每起一个服务都要暴露一个端口。
在此之上,我进行了一番搜索,发现了一个新东西——Zerotier。
这是一个类似于 ZooKeeper 的工具,一款异地组网工具。每台服务器上只需要安装对应的客户端,连接到同一个网络,就可以实现 IP 互相访问。在此之上,还有自定义 DNS 服务器的功能,将通过 IP 这个步骤转换为通过域名进行访问,相当实用。
纵观国内的文章,基本都是上来就一步一步搭建,没有任何解释性说明。在几天的折腾后,搞了篇解释比较强的文章。
根据 Zerotier 的官方简介,是这个意思:
Connect team members from anywhere in the world on any device. ZeroTier creates secure networks between on-premise, cloud, desktop, and mobile devices.
概念
所有的设备都是客户端,连接方式是点对点。在路由器下面的话是用 uPnP 的方式进行转发实现客户端到客户端的直接连接。如果 uPnP 没有开启,会通过传统的服务器转发的方式进行连接。
Earth
根据其介绍,将地球上的所有设备连起来。那这里的 Earth 指的就是整体的一个服务。
Network
每一个 Network 包含的所有设备都在同一个网络里。每个网络有一个 Network ID。各客户端通过这个 ID 连接到此网络。当然,一个账号是可以创建多个网络的。
网络氛围 Public 和 Private。一般我们自己组网是要用 Private,需要在页面授权设备才可以进行访问。Public 权限好像不太有人会需要吧..
以下介绍的所有概念都是属于 Network 下的。
Planet
星球嘛。指的是官方提供的服务器节点。各客户端都是通过这些服务来互相寻址的。相当于 zookeeper 的不同节点。
Moon
自定义的 Planet。由于 Zerotier 没有国内节点,在两个设备刚开始互连的时候有可能需要通过国外的节点寻址(不过我没发现有什么慢的)导致创建连接的速度偏慢。在自己的网络里搭建 Moon 可以使连接提速。
Leaf
客户端。就是连接到网络上的每一个设备。其实经过测试,Moon 也是客户端的一种。这里特指没有额外功能,单纯用于连接的客户端。
开始使用
Zerotier 支持基本所有设备:Windows、MacOS、iOS、Android、Linux、FreeBSD、Synology、QNAP、WD MyCloud、OpenWRT。再不济,支持 Docker,凡是能跑 Docker 能联网的设备都可以用。
其中 iOS 不支持自定义 Moon,Android 的自定义 Moon 要下载非官方的 APP。
本着不给自己找麻烦的原则,能用 ui 就用 ui,能一键搭建就一键搭建。给了 docker-compose 就直接用,不要折腾乱七八糟的东西。
注册账号
[官方网站登录](https://my.zerotier.com/),我直接用 Github 登录。登录后发现我两年前玩过这个东西…
创建网络
不用输入任何没用的信息,上来直接创建网络,只需一次点击,网络就创建好了。
记住这个 Network ID,以后会经常见到。
点击网络进去,默认配置基本够用。
连接客户端
`brew install zerotier-one`
[官方下载链接](https://download.zerotier.com/dist/ZeroTier%20One.pkg)
安装好后,启动。
在下面输入网络 ID,点击 Join Network 即可。
Windows 的 UI 跟这个一毛一样。
AppStore 搜索 Zerotier,下载。点击右上角加号,输入网络 ID,OK。
根据官网给的说明,直接运行脚本即可。
`curl -s https://install.zerotier.com | sudo bash`
如果你安装了 GPG 密钥验证,用下面这条命令` 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” | sudo bash; fi`
脚本会自动将 Zerotier 的源添加到 apt/yum 里并安装。
安装好后,运行命令` sudo zerotier-cli join 你的网络ID`
即可。
DSM 7 不支持 root 安装第三方程序,因此官网建议使用 Docker 来实现。英文文档在这里:[https://docs.zerotier.com/devices/synology/](https://docs.zerotier.com/devices/synology/)
简单说就是 ROOT 权限。
首先,将虚拟网卡添加到启动项:
echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh
chmod a+x /usr/local/etc/rc.d/tun.sh
/usr/local/etc/rc.d/tun.sh
以上执行后就有虚拟网卡了。然后创建 docker 容器:
docker run -d \
--name zt \
--restart=always \
--device=/dev/net/tun \
--net=host \
--cap-add=NET_ADMIN \
--cap-add=SYS_ADMIN \
-v /var/lib/zerotier-one:/var/lib/zerotier-one zerotier/zerotier-synology:latest
启动后,执行以下加入网络
docker exec -it zt zerotier-cli join 你的网络ID
有 compose 的话,我是这么操作的:
version: '3.3'
services:
zerotier-synology:
container_name: zt
restart: always
devices:
- /dev/net/tun
cap_add:
- NET_ADMIN
- SYS_ADMIN
network_mode: host
volumes:
- './data:/var/lib/zerotier-one'
image: 'zerotier/zerotier-synology:latest'
加入网络:
docker-compose exec zerotier-synology zerotier-cli join 你的网络ID
软路由上,有一个 Zerotier 工具,启用,输入网络 ID,保存并启用即可。
首先启用虚拟网卡(跟群晖一样,这步我还不知道怎么搞)
用以下 docker compose 文件:
version: '3.3'
services:
zerotier:
devices:
- /dev/net/tun
privileged: true
image: zerotier/zerotier
network_mode: host
cap_add:
- NET_ADMIN
- SYS_ADMIN
command: ['你的网络ID']
volumes:
- ./data:/var/lib/zerotier-one
我不知道为什么网上的人都爱用第三方很久不更新的镜像。用官方的不香吗。
直接启动即可。
授权
每一次添加了客户端后,在控制面板上会显示新设备加入,勾上前面的勾表示对这个设备授权,会给其分配 IP,显示 zerotier 客户端的版本号和物理地址。
免费版最多一个网络可以有 50 个设备。真大方.. 怎么用都够用了。
使用
好了,这回,只要输入对应的虚拟 IP,就可以访问对应的设备了。这些设备相当于都处于同一个局域网下了。你会发现,速度相当快了。
状态管理
命令行的使用
所有的设备都是使用 zerotier 相同源码编译的客户端。我们平时主要操作的就是 zerotier-cli。其他的,zerotier-one 是运行程序,zerotier-idtool 是生成客户端 id 使用的。zerotier-cli 要使用**root**权限运行。
zerotier-cli peers
Path 指的是连接时连接到的 IP 地址。这台机器是我最头疼的一台,它给 zerotier 的地址都是 ipv6 的,导致它的节点与其他 ipv4 的节点没办法互联,搞了我好几天了。
不过也可以看见,同一内网下的话,IP 会使用内网的 IP,不需要再经历转发的流程。
其中 link 代表了连接状况。DIRECT 代表可以直接连接,RELAY 代表需要转发。转发的速度当然会慢一些,因此尽量保证你的 NET 类型为 A/B。(跟 switch 学来的)这里我还没有细致研究,不过只要你的路由器支持 uPnP,一般都是直连。
这里有连接方式的官方介绍,我懒得看:[https://docs.zerotier.com/zerotier/troubleshooting#recommended-local-network-and-internet-gateway-configuration](https://docs.zerotier.com/zerotier/troubleshooting#recommended-local-network-and-internet-gateway-configuration)
zerotier-cli listnetworks
这里有以下信息:网络 ID、名称、本机的虚拟 IP 地址,和网络状态。其中,网络状态 OK 表示正常,REQUEST_CONFIGURATION 表示没有 uPNP,连不上,ACCESS_DENIED 表示还没有授权。其他的状态我还没见过。
zerotier-cli info
高级
自定义 Moon
任何一个节点都可以作为 Moon 使用。当然,正常的我们肯定会选择公网 IP 的节点,一般都会使用云服务器。
官方文档在这里:[https://docs.zerotier.com/zerotier/moons](https://docs.zerotier.com/zerotier/moons)
那么第一步就是搞一台云服务器,在上面连接好网络。
进入配置文件夹,linux 上的是`/var/lib/zerotier-one`。执行`zerotier-idtool initmoon identity.public >>moon.json`
打开的文件大概长这个样子:
{
"id": "deadbeef00",
"objtype": "world",
"roots": [
{
"identity": "deadbeef00:0:34031483094...",
"stableEndpoints": []
}
],
"signingKey": "b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0",
"signingKey_SECRET": "ffc5dd0b2baf1c9b220d1c9cb39633f9e2151cf350a6d0e67c913f8952bafaf3671d2226388e1406e7670dc645851bf7d3643da701fd4599fedb9914c3918db3",
"updatesMustBeSignedBy": "b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0",
"worldType": "moon"
}
在其中的`roots/stableEndpoints`数组中填上本机的`虚拟IP/端口号`,一般端口都是 9993。如果你服务器支持 ipv6,填上 ipv6 也是不错的。
服务器要打开 9993 端口!
然后执行:
zerotier-idtool genmoon moon.json
mkdir moons.d
会生成一个 000xxxx.moon 的文件,将其放在 moons.d 文件夹中。
这个 000xxx 就是此 mood 的 id。
在与其连接的客户端上,执行:
zerotier-cli orbit 000xxx 000xxx
其中,第一个是 Word ID,第二个是 moon id。不用考虑细节,两个一样就对了。
这样,在连接的时候,就可以看到这台机器已经从 LEAF 变成了 MOON。
自定义 controller
Controller 就相当于一个完整的 zerotier 服务。由于 iOS 端不支持自定义 controller,我也没做这个东西。等我把家里的网络重新整理一遍再来玩这个。
自定义 dns
使用 zerotier/zeronsd 来进行 DNS 的设置,官方文档在这里:[https://docs.zerotier.com/zeronsd/quickstart](https://docs.zerotier.com/zeronsd/quickstart)
这个功能目前还是 BETA 版,我将在把家里的网络整理好后再来配置 DNS。
这个 DNS 处于网络的里面,主要用于避免客户端以 IP 进行访问,太复杂了。