ZeroTier 是为了解决复杂网络以及因特网过于中心化而提出的组网解决方案。ZeroTier 可以使得在不同网络,不同物理空间的机器组件在同一个虚拟局域网中,使得他们之间可以交换数据,直接连接。

[[ZeroTier]] 使用点对点 的网络,并且在上面附加一层 VXLAN-like 虚拟网络层 来提高局域网的可见性,安全性。

所以简单来说,ZeroTier 通过创建一个虚拟网络,把你的设备添加到这个网络,那么在这个网络内,你的设备就像在同一个路由器内那样可以使用各种端口。

免费版 ZeroTier 支持局域网内 100 个设备。ZeroTier 支持 Windows、macOS、Linux 三大桌面平台,iOS、Android 两大移动平台,QNAP(威连通)、Synology(群晖)、Western Digital MyCloud NAS(西部数据)三个 NAS 平台,还支持 OpenWrt/LEDE 开源路由器项目。

官网地址:

各系统安装包下载

官网下载:

Debian/Ubuntu:

curl -s https://install.zerotier.com | sudo bash
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
sudo apt install zerotier-one

使用

  • 注册 ZeroTier
  • 创建 Network 私有局域网,得到一个 16 位的 Network ID
  • 在需要加入虚拟局域网的设备上安装各个平台客户端,设备会生成一个 10 位的 ZeroTier address
  • 在设备上加入刚刚创建的 Network ID zerotier-cli join <network id>(或在网页上添加 ZeroTier address)
  • 在官网 network 页面上找到设备,在设备前勾选,信任设备,获得局域网 IP

Windows 系统用命令 ipconfig,Linux/Unix 用命令 ifconfig,然后会看到一个虚拟网卡,有一个 IP 地址。这个 IP 和在官网看到的 network 下的 IP 是一致的,只有同在该虚拟网络下的机器才能访问。

接下来,就可以访问同一个局域网中的其他节点的任何内容,比如 FTP 服务(端口 21),比如搭建在局域网的网站(端口 80)

图文教程可以参考这篇文章

ZeroTier 的网络地址

ZeroTier 的网络地址采用 64 位格式,前 40 位(10个十六进制数字)表示网络控制器,剩下的 24 位(6 个十六进制数字)表示控制器内的网络。

建立中转服务器 moon

ZeroTier 的官方服务器在国外,国内客户端使用时延迟较大,网络高峰期时甚至各个客户端节点之间访问不了。此时,“自定义根服务器”,又称 moon 中转服务器就显得非常重要,它的主要功能是通过自定义的服务器作为跳板加速内网机器之间的互相访问。

ZeroTier 定义了几个需要知道的专业名词:

  • PLANET 行星服务器,ZeroTier 各地的根服务器,有日本、新加坡等地
  • moon 卫星级服务器,用户自建的私有根服务器,起到中转加速的作用
  • LEAF 相当于各个枝叶,就是每台连接到该网络的机器节点。

在使用 zerotier-cli listpeers 命令时能看到这几个名词。

获取 moon.json 文件

充当 moon 的机子最好有公网 IP,现在我们尝试用 QNAP 搭建一个 moon 中转:

zerotier 安装好之后会带有 zerotier-idtool 这个命令,之后的内容需要依赖该命令。假设现在有一台公网固定 IP 的 VPS,在上面安装完 ZeroTier 之后。

cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json

获得 moon.json 文件。查看文件内容,其中 id 为 VPS 的 ZeroTier ID。 vi 编辑 moon.json,修改 “stableEndpoints” 为 VPS 的公网的 IP,以 IPv4 为例:

"stableEndpoints": [ "121.121.121.121/9993" ]

121.121.121.121 为公网 IP,9993 为 ZeroTier 默认端口。

另外,记录下 json 中的 id 值,是一个 10 位的字符串。

生成签名文件

用到上一步中的 moon.json, 执行

zerotier-idtool genmoon moon.json

执行之后生成 000000xxxx.moon 文件。

将 moon 节点加入网络

在 VPS 的 ZeroTier 安装目录下(/var/lib/zerotier-one)建立文件夹 moons.d,将生成的 .moon 文件拷贝进去。

重启 zerotier,重启电脑。至此,VPS 上(moon 服务器)配置完成。

其他客户端机器连接 moon 节点

其他虚拟局域网中的机器想要连接到 moon 节点的话有两种方法,第一种方法就是使用 zerotier-cli orbit 命令。连接 moon 节点方法一,使用之前步骤中 moon.json 文件中的 id 值 (10 位的字符串)

分别在客户端机器里执行:

zerotier-cli orbit <world-id> <seed-id>

完成。

第二种方法是需要在 /var/lib/zerotier-one 目录下新建 moons.d 文件夹和 moon 节点一样,将 000000xxxx.moon 文件放到其中,并重启 zerotier。

测试

zerotier-cli listpeers

如果有 moon 服务器 IP 地址的那一行后面有 moon 字样,证明 moon 节点已经被本机连接。

不同系统下的 ZeroTier 目录位置:

  • Windows: C:\ProgramData\ZeroTier\One
  • Macintosh: /Library/Application\ Support/ZeroTier/One)
  • Linux: /var/lib/zerotier-one
  • FreeBSD/OpenBSD: /var/db/zerotier-one

zerotier-cli

zerotier-cli 命令的基本使用。

Usage: zerotier-cli [-switches] <command/path> [<args>]

Available switches:
  -h                      - Display this help
  -v                      - Show version
  -j                      - Display full raw JSON output
  -D<path>                - ZeroTier home path for parameter auto-detect
  -p<port>                - HTTP port (default: auto)
  -T<token>               - Authentication token (default: auto)

Available commands:
  info                    - Display status info
  listpeers               - List all peers
  listnetworks            - List all networks
  join <network>          - Join a network
  leave <network>         - Leave a network
  set <network> <setting> - Set a network setting
  listmoons               - List moons (federated root sets)
  orbit <world ID> <seed> - Join a moon via any member root
  deorbit <world ID>      - Leave a moon

延伸

frp 和 ngrok

和 ngrok 和 frp 功能类似,但是 ZeroTier 明显入手简单。ZeroTier 只有客户端开源,服务端并没有开源。而 ngrok 和 frp 都是完全开源。但是 ngrok 和 frp 严重依赖于公网固定 IP 的 VPS,是一个中心化的内网穿透工具,一旦中心节点挂掉,那么所有的节点都无法工作。ZeroTier 帮助用户实现了服务端,虽然安全性有待考验,但至少还是能用状态。

另外很多人提到的 N2N 开上去也不错,不过我还没怎么用过。等以后尝试过后再补上。

ZeroTier 和 Tailscale 的区别

ZeroTier 是私有协议,而 [[Tailscale]] 是在 [[WireGuard]] 协议基础之上。但 ZeroTier 官方提供了第三方对代码 review 的认证,安全性应该还好。

更具体的差异可以见官方说明