前言

很多时候我们需要异地组网,例如公司和家里(或者总公司和子公司)电脑有时候需要组建出一个内网,方便管理和随时连接使用两方的资源,例如远程桌面、文件共享、内网通信软件等等。

市面上可以实现的方式有很多,例如蒲公英异地组网,问题是无论是购买硬件还是接入费用成本要求都比较高。所以一般中小企业或者个人用户,建议使用zerotier即可满足大部分要求(免费用户为50台主机),蒲公英的免费版本组网虽然简单,可是网速很低,所以推荐有服务器的还是自行搭建比较好。

网络上很多关于zerotier教程的概念和描述都比较模糊,也没详细解释相关流程操作,本文会尽可能修正和解释。

原理思路

  • 由于zerotier官方服务是在国外的服务器,有些地区可能会有连接慢、无法连接的情况。所以这里组合部署为:官方服务 + 私有云服务器(有公网IP的实体服务器) + 客户端,即私有云服务器作为moon中转节点使用。
  • 在官方服务使用连接有问题时,可以经由私有云作为中转,从而提升zerotier的稳定性。

行星服务器 Planet 和 月亮服务器 Moon 区别

ZeroTier 对于此的描述是这样的(机器翻译):

一个行星 Planet 上的所有 ZeroTier 节点有效地居住在一个单一的数据中心内。这使得它很容易直接连接任何地方的设备,但它的缺点是没有互联网连接就无法工作。网络连接远非完全可靠,有时出于安全原因,用户可能希望将一组节点与互联网的其他部分完全 "隔空"。
我们引入了添加你自己的用户定义的根服务器的能力。由于我们居住的数据中心是行星 Planet ,所以用户定义的根的集合被称为月球 Moon。当一个节点 "环绕 "一个月球 Moon 时,它会将月球的根添加到它的根服务器集。围绕行星 Planet 运行的节点仍将使用行星根,但如果它们看起来更快或者没有其他可用的根,它们将使用月球的根。

配置zerotier网络

  • 到https://my.zerotier.com/ 注册账号
  • 创建一个虚拟网络,随后获得并记下这个Network ID
  • 新建网络后在Advanced->Managed Routes可以看见自动默认设置好的IP网段,随后的主机加入都会默认使用这个设置(你可以自己更改)

安装客户端

  • Linux安装客户端,运行官方安装脚本并启动:
curl -s https://install.zerotier.com/ | sudo bash
systemctl enable --now zerotier-one.service
  • Windows在官网下载安装包后,以管理员身份运行以下命令即可。

  • 测试是否安装成功:zerotier-cli -v,成功的话则会显示版本号。

  • 加入虚拟网络:zerotier join 你的虚拟网络ID
  • 返回zerotier的控制台,进入该虚拟网络管理界面,在Members中可以看见一个新加入的主机,勾选Auth?即可授权该主机加入。

    • 查看本机ID和在线状态:zerotier info
    • 查看已经加入的网络信息:zerotier listnetworks
  • 随后其他主机陆续如上加入,在授权后互PING试试,只要配置正确或者不是在高峰期(因为现在还没配置中转站)都会互通,排除以上原因还不能ping通,先检查自己电脑的防火墙看看是不是禁止IMCP了。

配置moon服务端

moon中转站是以一台具有公网IP的主机作为主机中转,连接速度可以快很多,尤其是在高峰期。如果你感觉不需要,可以不用配置moon中转站。主机系统建议是Linux主机

  1. 首先把用于作为moon中转站的主机加入到在开始时zerotier所创建的网络ID:zerotier-cli join 网络ID,运行:zerotier-cli info,如果显示:200 info 网络ID 软件版本号 ONLINE则表示成功。此时,在zerotier web管理界面里面的Members项目中应该就可以看见本服务器已经加入了,勾选:Auth?允许该设备连接即可。

MOON主机配置

  1. 进入zerotier的配置文件目录:
    • Linux:cd /var/lib/zerotier-one
    • Windows:C:\ProgramData\ZeroTier\One\
  2. 生成配置文件zerotier-idtool initmoon identity.public > moon.json

  3. 编辑:moon.json文件:

    • "id"这行中记下该moon ID,
    • 找到:"stableEndpoints": ["xxx.xxx.xxx.xxx/xxxx"],把内容按照实际修改成:["你的moon服务器公网IP地址/端口号(UDP)"],同时,必须保证服务器防火墙已经开放了该UDP端口。
    • 保存该文件
    • 生成签名文件:zerotier-idtool genmoon moon.json,然后在cd /var/lib/zerotier-one目录(Windows:C:\ProgramData\ZeroTier\One\)下可以发现新增了一个文件,如:000000moonID.moon
    • mkdir moons.d新建一个用于存放签名文件的目录(Windows直接右击新建名为moons.d的文件夹),mv /var/lib/zerotier-one/000000moonID.moon /var/lib/zerotier-one/moons.d把该签名文件移动进去。(Windows直接把文件复制到C:\ProgramData\ZeroTier\One\moons.d

    • 重启zerotier systemctl restart zerotier-one。如果是Windows,则在任务管理器->服务中找到zerotier->右击选择:重启服务。

    • 查看是否配置成功zerotier-cli listmoons,若成功则显示详细配置信息,否则只会显示:[]

至此,moon中转主机已经配置完成,请把以上生成的000000moonID.moon文件,保存准备到下一步使用

客户端接入到MOON

Windows和MAC

  1. 下载Windows客户端:https://www.zerotier.com/download/
  2. 安装后在图形界面,加入网络ID,之后在以下两种方法中任选其一
    • 打开服务程序services.msc, 找到服务"ZeroTier One", 并且在属性内找到该服务可执行文件路径:C:\ProgramData\ZeroTier\One\, 打开该文件夹, 并且在其下建立moons.d文件夹,然后将moon服务器下载000moonID.moon文件,拷贝到此文件夹。再重启该服务即可(计算机右键管理-找到服务双击打开-找到zerotier one右键重新启动即可)

    • 以管理员身份运行powershell,运行zerotier-cli orbit moonID moonID

Linux

  1. 安装curl -s https://install.zerotier.com/ | sudo bash

  2. 加入网络ID:zerotier-cli join 网络ID,之后在以下两种方法中任选其一

    • 以root身份运行,运行zerotier-cli orbit moonID moonID
    • 直接在moon服务器端的/var/lib/zerotier-one目录下下载000000moonID.moon文件。然后在客户端主机的/var/lib/zerotier-one创建moons.d文件夹,并且将生成的000000moonID.moon文件拷入,并重启服务即可。

测试客户端和服务器连接

  • 首先,在客户端和服务器都得知正确的虚拟内网IP,然后,如有需要,可以现在修改虚拟内网IP网段。

在客户端运行:zerotier-cli listpeers,显示类似反馈信息为正常:

200 listpeers <ztaddr> <path> <latency> <version> <role>
200 listpeers moon中转服务器公网IP/端口;10238;7922 4 1.8.6 MOON

从以上内容得知,服务器IP出现在内容组并已经被设定成MOON类型.此时在zerotier web界面把需要连接的客户端勾选上auth?即可。
- 从客户端ping一下服务器的虚拟内网IP,如果能ping通则表明搭建已经成功,随后可以进一步测试其他内网服务如tightVNC、内网通等内网软件。

若不成功,则尝试重启客户端的zerotier服务后再试

若不成功,则尝试重启客户端的zerotier服务后再试

补充

  • zerotier-cli 的基本命令
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
  peers                   - List all peers (prettier)
  listnetworks            - List all networks
  join <network ID>          - Join a network
  leave <network ID>         - Leave a network
  set <network ID> <setting> - Set a network setting
  get <network ID> <setting> - Get 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
  dump                    - Debug settings dump for support

Available settings:
  Settings to use with [get/set] may include property names from
  the JSON output of "zerotier-cli -j listnetworks". Additionally,
  (ip, ip4, ip6, ip6plane, and ip6prefix can be used). For instance:
  zerotier-cli get <network ID> ip6plane will return the 6PLANE address
  assigned to this node.
  • 各个操作系统的配置文件路径:
Windows: C:\ProgramData\ZeroTier\One
Macintosh: /Library/Application Support/ZeroTier/One
Linux: /var/lib/zerotier-one
FreeBSD/OpenBSD: /var/db/zerotier-one
  • 如果在web界面删除过接入的客户端设备,则会在短时间内无法在客户端自主加入到服务器,而需要在web界面MANUALLY ADD MEMBER中填写并加入客户端的设备码。客户端获取自身设备码方法:在客户端本机运行zerotier-cli info

  • 在Windows中,所谓重启服务并不是关闭、打开zerotier的图形软件,而是在任务管理器-服务中找到ZerotierOneService右击选中重启


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。