之前的一篇文章简单的通过内网穿透,异地组网的概念介绍过 ZeroTier,过去几年里面几台设备也一直陆陆续续地在使用着,虽然中间也短暂切换成 frp,也尝试过 [[Tailscale]],但 ZeroTier 一直是候选方案中排名在前的。

ZeroTier 官方默认免费的方案可以支持最多 50 台设备的连接,我陆陆续续也用不超过 20 台。所以使用官方提供的基本服务是丝毫没有任何问题的。但就是本着折腾的态度,也是学习一下 ZeroTier network controller 相关的内容,记录一下如何自建 ZeroTier network controller。

概念介绍

ZeroTier

ZeroTier 是一个虚拟组网工具,他可以让设备和设备之间通过互联网的帮助,就像是在局域网(LAN)之间通信一样。通过 安装 ZeroTier One 客户端,并加入一个 16 位数字的 ZeroTier 网络就能实现。

ZeroTier network controller

ZeroTier 网络是通过 ZeroTier network controller 来完成配置的。用户既可以使用 ZeroTier 官方 提供的 network controller,也可以使用自己搭建的独立网络控制器(standalone network controller)。

如何设置自己独立的网络控制器就是这篇文章的重点。

ztncui

ztncui 是一个开源的 ZeroTier 网络控制中心的用户界面。

代码地址:https://github.com/key-networks/ztncui

ZeroTier 网络实现原理

ZeroTier 的网络 Controller 是一个控制节点,该节点会通过 roots (根节点)来发现彼此。可以和 DNS 根服务器类比。

ZeroTier 的 Network ID 由两部分组成:节点 ID + 其他字符。

每一个 ZeroTier 节点(Nodes)会通过 Network ID 的前 10 位来发现 network controller,然后通过 networking controller 来发现局域网中的其他节点。

然后每一个节点可以通过 zerotier-cli peers 来查看匹配网络中的节点。

如果 network controller 离线了,那些已经建立连接的节点会保持连线,但是无法再往网络中添加新的节点。

如何搭建独立的 ZeroTier 网络控制器

上文提及的 ztncui 就是一个开源的 ZeroTier 网络控制器界面,通过他可以快速搭建自己的 ZeroTier 网络控制器,这里我们使用 Docker 镜像快速搭建。如果需要手工搭建,可以直接参考官网

本文使用的镜像是:

这里直接贴出 docker-compose.yml 文件:

version: '3.3'

services:
  ztncui:
    container_name: ztncui
    image: keynetworks/ztncui
    restart: always
    volumes:
      - ~/ztncui/ztncui:/opt/key-networks/ztncui/etc
      - ~/ztncui/zt1:/var/lib/zerotier-one
    environment:
      - NODE_ENV=${NODE_ENV}
      - HTTP_PORT=${HTTP_PORT}
      - HTTP_ALL_INTERFACES=yes
      - ZTNCUI_PASSWD=${ZTNCUI_PASSWORD}
      - MYADDR=${MYADDR}
    ports:
      - '3443:3443'
      - '3180:3180'

说明:

  • HTTP_PORT:后台端口
  • ZTNCUI_PASSWD:后台默认密码
  • MYADDR: VPS 的网络地址,公网 IP 地址

然后在同级目录新建文件 .env:

# more https://github.com/key-networks/ztncui-aio
NODE_ENV=production
HTTP_PORT=3443
ZTNCUI_PASSWD=
MYADDR=your.ip

后续更新会在 dockerfile

然后使用 docker-compose up -d 启动。

启动之后可以访问 IP:3443 可以访问管理后台。

独立网络控制器的优劣

优点

自建 ZeroTier network controller 可以提升节点建立连接的稳定性,同时也解除了官网的设备连接数限制。

但 network controller 自身并不能提升节点和节点之间的连接速度。

缺点

一旦使用了自建的 ZeroTier 网络,便需要一定精力去维护 network controller 的稳定性。

并且如果 network controller 挂掉可能无法再新增加节点。不过新增节点的操作也不是高频操作,对我个人使用而言问题不大。

外延

除了 ztncui 这一个用户界面,还有一些在逐渐发展的,可以根据自己需要挑选:

reference