前言
很多时候我们需要异地组网,例如公司和家里(或者总公司和子公司)电脑有时候需要组建出一个内网,方便管理和随时连接使用两方的资源,例如远程桌面、文件共享、内网通信软件等等。
市面上可以实现的方式有很多,例如蒲公英异地组网,问题是无论是购买硬件还是接入费用成本要求都比较高。所以一般中小企业或者个人用户,建议使用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
- 查看本机ID和在线状态:
- 随后其他主机陆续如上加入,在授权后互PING试试,只要配置正确或者不是在高峰期(因为现在还没配置中转站)都会互通,排除以上原因还不能ping通,先检查自己电脑的防火墙看看是不是禁止IMCP了。
配置moon服务端
moon中转站是以一台具有公网IP的主机作为主机中转,连接速度可以快很多,尤其是在高峰期。如果你感觉不需要,可以不用配置moon中转站。主机系统建议是Linux主机
- 首先把用于作为moon中转站的主机加入到在开始时zerotier所创建的网络ID:
zerotier-cli join 网络ID
,运行:zerotier-cli info
,如果显示:200 info 网络ID 软件版本号 ONLINE
则表示成功。此时,在zerotier web管理界面里面的Members
项目中应该就可以看见本服务器已经加入了,勾选:Auth?
允许该设备连接即可。
MOON主机配置
- 进入zerotier的配置文件目录:
- Linux:
cd /var/lib/zerotier-one
- Windows:
C:\ProgramData\ZeroTier\One\
- Linux:
- 生成配置文件
zerotier-idtool initmoon identity.public > moon.json
-
编辑:
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
- 下载Windows客户端:https://www.zerotier.com/download/
- 安装后在图形界面,加入网络ID,之后在以下两种方法中任选其一
- 打开服务程序
services.msc
, 找到服务"ZeroTier One", 并且在属性内找到该服务可执行文件路径:C:\ProgramData\ZeroTier\One\
, 打开该文件夹, 并且在其下建立moons.d
文件夹,然后将moon服务器下载000moonID.moon
文件,拷贝到此文件夹。再重启该服务即可(计算机右键管理-找到服务双击打开-找到zerotier one右键重新启动即可) -
以管理员身份运行powershell,运行
zerotier-cli orbit moonID moonID
- 打开服务程序
Linux
-
安装
curl -s https://install.zerotier.com/ | sudo bash
-
加入网络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
文件拷入,并重启服务即可。
- 以root身份运行,运行
测试客户端和服务器连接
- 首先,在客户端和服务器都得知正确的虚拟内网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
右击选中重启