本文参考:Yogile、ZqinKing和帅绝人寰的文章
zerotier官网:https://www.zerotier.com/
后台管理页面:https://my.zerotier.com/
zerotier介绍
为什么是Zerotier One
要想外网/公网上访问家里的群晖,大致方案有两个:一个是动态域名+公网IP+端口映射。相关文章也很多,限于本文主题就不涉及了。另一个就是内网穿透了,网上常见的方案有很多,比如frp,ngrok,n2n,nps(如果没记错的话,这东西丢包严重)等等,说实话都是没听过的名字(虽然算是相关专业从业人员,但也是很久没有折腾各种黑科技了)。
由于之前有使用hamachi的经验,所以第一个念头就是使用hamachi,搜了一圈发现这个软件已经淡出市场了,而且好像还在墙外,于是就放弃了,不禁还有些唏嘘。搜索新近的方案,如上述那些一看到要搭建各种服务器就本能的害怕,没有去仔细研究了。
内心还是倾向于找类似hamachi的方案。也就是点对点vpn,只用安装客户端,就可以秒互联。因为我的主要需求是自己在外面拿个手机连自己家里的群晖,也不用对大众提供服务,所以这种点对点的方式最适合我。更重要的,我也并不希望家里的机器暴露在公网上,而基于vpn的方案恰好能提供这方面的安全性。这么一来就选中了ZeroTier。
ZeroTier方案内网穿透原理
ZeroTier One的原理跟hamachi基本一样,就是虚拟出一块网卡,连上一个虚拟网络,安装了ZeroTier One客户端的设备可以连入这个网络,经过授权连接成功之后彼此都在同一网段,可以像在局域网一样互相访问,例如访问共享文件夹,web server,ftp server,联机游戏(例如打星际),当然也就包括访问群晖。所以如果你的群晖和你的手机连上了这个网络,不论两台设备具体在哪里,都像同一局域网内,从而实现内网穿透,达到从外网访问内网群晖的目的。
主机1可以是群晖主机,主机2可以是手机或平板。只要主机1和主机2都能连到互联网,安装上ZeroTier One的客户端后,就会在本机虚拟出一块网卡,并获得对应IP,图例中是172.28.x.x网段。经过网络所有人授权后(后面会详细讲解),这两个主机就可以通过172.28.x.x网段互相访问了,由于就像在局域网一样,所以基本没有任何限制,任何基于TCP/IP的网络服务都可以访问到,自然也就可以访问到群晖了。
注:图中省掉了公网IP,因为公网IP多少不重要,只要主机能上公网,能连上ZeroTier,就能获得172网段IP了,也就可以互联互通了。
ZeroTier One的优势
相比其他流行方案,ZeroTier One有这么几个优势:
- 免费版支持客户端多。连入同一个网络的客户端不超过100个就都免费
- 速度快,p2p模式。客户端联通之后流量基本不经过服务端/superNode而是点对点传输,传输速度取决于你设备所在宽带上行带宽以及手机端4g上网的速度
- 管理配置简单。不要被全英文的界面吓到,明白原理之后安装配置极其简单
最重要的是支持多种平台。支持win、mac、安卓、苹果,以及多种发型版Linux,比如群晖系统(这也是选择ZeroTier One的重要原因),如下图,可以下载spk文件直接在群晖中部署(注意群晖有各种架构,下载时要注意处理器架构)
注意事项
zerotier的穿透并不是100%成功,如果nat类型不一样(例如一边是锥型一边是对称型失败还是挺高的),nat次数过多,都会失败。这种情况下,数据会通过moon节点转发(类似于frp),速率取决于moon节点,zerotier官方提供的moon节点在国外,延迟是相当的高,所幸可以自己搭建moon。
不推荐将zeortier的网络控制调节为公共。
注册zerotier帐号并创建虚拟局域网
首先在my zeroteir注册帐号并登录
点击Create A Network
即可
下面图片中的英文小写加数字就是设备加入虚拟局域网的id
这里是控制连接网络用户
安装zerotier
1. Windows
点击这里下载zerotier的win安装包(大约12m)
一路按默认设定安装即可
安装软件的过程可以看做往系统插了一张新网卡,并把网卡连了一根网线,此网线通往ZeroTier的专有网络,逻辑上独立于你当前局域网之外。如果弹出如下窗口,点击是。
安装好后,从菜单运行,不会出主程序窗口,而是在任务栏出ZeroTier One
的小图标,右键点击会出现弹出菜单,在此处点击Join Network...
加入刚刚申请的网络
点击Join Network...
会弹出一个小窗,填入新申请这个网络id号,再点击Join
即可
2. mac
点击这里下载zerotier的mac安装包(大约1.63m)
一路按默认设定安装即可
安装软件要管理员权限,输入mac密码就行
安装好后,从启动台点击zerotier
,上方状态栏就会出现zerotier
的图标,点击图标出现弹出菜单,在此处点击Join Network...
加入刚刚申请的网络
点击Join Network...
会弹出一个小窗,填入新申请这个网络id号,再点击Join
即可
3. Iphone(这里没图单纯懒得截图)
点击这里进入苹果商店(iOS 应用程序在 iOS 10 或更高版本上运行。)
安装后,点击zerotier
进入应用,在右上角点击+
,跳出用户须知,往下划,点击accept
,进入add network
,在Network ID
一栏填入新申请这个网络id号,再点击下方的Add Network
即可
4. 安卓(这里没图单纯懒得截图)
点击这里进入谷歌商店或者点击这里,该应用程序应适用于Android 5
或更高版本,但建议使用更新的版本。LineageOS
和GrapheneOS
可能有问题。
安装后,点击zerotier
进入应用,在右上角点击+
,进入Join Network
,在Network ID:
一栏填入新申请这个网络id号,再点击下方的Add Network
即可
5. LINUX (DEB/RPM)
- 基于
Debian
和RPM
的发行版(包括Debian、Ubuntu、CentOS、RHEL、Fedora和其他发行版
)可以通过以下脚本安装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
使用脚本后,使用
apt
或yum
管理未来对zerotier-one
的更新 Archlinux
可以用aur社区里安装yay -S zerotier-one
或者
yaourt -S zerotier-one
在终端输入
systemctl enable zerotier-one
systemctl start zerotier-one
sudo zerotier-cli join 填入新申请这个网络id号
### 6. BSD(没用过,仅放官网原文)
点击[这里下载](https://www.freshports.org/net/zerotier/)
FreeBSD 包是由 FreeBSD 社区创建和支持的,而不是由 ZeroTier, Inc. 创建和支持。请联系包维护者报告与打包相关的错误。
### 7. NAS设备
#### 群晖
1. docker(没用过,仅复制)
适用于Synology NAS
的ZeroTier One
可用作Docker
容器。请参阅此处的说明:https://docs.zerotier.com/devices/synology/
。
2. 直接装(官网莫名没有下载链接)
在[帅绝人寰](https://post.smzdm.com/p/741270/)里发现这个链接https://download.zerotier.com/RELEASES/1.6.5/dist/synology/
,姑且我在这做了个备份https://www.eneziyuan.top:2020/?dir=/zerotier
所有带syn
字段,spk
结尾的都是ZeroTier One 给群晖的安装包,有种老鼠掉进米缸的感觉了。
但是如何确定哪个版本还要费一点周折。方法一,可以在这个平台支持列表查询自己cpu类型,决定下载哪个版本。但在这个列表,我却找不到对应的版本,所以用方法二:网上下一个putty.exe
,然后ssh
连到自己群晖的终端。(黑群晖只要是x86,一律可以用含有x86的)
在hostname处输入群晖的IP,点击open。弹出窗口输入群晖用户名密码(不推荐使用admin这个账户,建议密码强度设置高一点,不然会被黑)
登录后打命令uname -ar
,就会出现cpu版本信息
,大概长这样:
这就很明显了,是64位系统
,bromolow
的版本,下载zerotier-1.2.8r0-syn-bromolow-6.1.spk
就可以了。
在群晖端安装就相对简单了。登录DSM,打开套件中心,选择手动安装,找到刚刚下载的spk文件,点击下一步
然后会出现ZeroTier One的版本信息
因为我系统里早已安装了ZeroTier One的套件,所以这几步只是演示,可能和第一次安装界面稍有不同。安装过程大约几分钟。安装完成后可以在主菜单找到,点击运行。
运行后主界面基本没有内容, 唯一的操作就是在右下角[Network ID]
填入网络id号,然后点击join
。
#### 威联通(没用过,不做过多介绍)
软件包可用于x86、x64和几个ARM变体
。安装后,可以从命令行控制 ZeroTier。查看[ZeroTierNAS存储库](https://github.com/zerotier/ZeroTierNAS)以获取更多信息。
#### WD MyCloud(没用过,不做过多介绍)
ZeroTier One适用于Western Digital MyCloud EX2/4/Ultra NAS和个人云设备
,包在download.zerotier.com
。安装后,您可以从ZeroTier One
命令行界面加入虚拟网络。有关 更多信息,请参阅[ZeroTierNAS存储库](https://github.com/zerotier/ZeroTierNAS)。
### 8. 其他
#### 社区OpenWRT端口(没用过,不做过多介绍)
ZeroTier, Inc. 不直接支持社区端口。请联系端口维护者寻求帮助或报告特定于端口的错误。
github地址:https://github.com/mwarning/zerotier-openwrt
#### docker(没用过,不做过多介绍)
该存储库包含一个 Dockerfile,可用于创建容器化 ZeroTier,以用于纯容器的 Linux 发行版。
github地址:https://github.com/zerotier/ZeroTierOne/blob/master/ext/installfiles/linux/zerotier-containerized/Dockerfile
[点击这里](https://download.zerotier.com/dist/qnap/)下载
### 9. 开源(纯搬运)
#### Github 上的 libzt
ZeroTier 的库版本。
ZeroTier SDK 将您的网络带入用户空间。我们已将我们的网络管理程序核心与网络堆栈[lwIP](https://savannah.nongnu.org/projects/lwip/)配对,以为您的应用程序提供专有的私有虚拟网络接口。
github地址:https://github.com/zerotier/libzt
#### GitHub 上的 ZeroTier one
ZeroTier One 可以很容易地从源代码编译,以便在我们通过预构建包支持的操作系统之外的操作系统上使用。这包括不太常见的 Linux 版本、较旧的 FreeBSD、OpenBSD、NetBSD 等。
github地址:https://github.com/zerotier/ZeroTierOne
旧版本
可以在[此处](https://download.zerotier.com/RELEASES/)找到旧版本的 ZeroTier 。
### 10. 最后允许设备加入网络
重点来了,此时回到页面 刷新一下(或者直接从客户端系统栏图标上右键点出菜单,点击ZeroTier Central
进入此页面),将页面拉下来,此时就会看之前No Devices have joined this network
的地方出现这个客户端,显示online
但是别急,此时客户端并未连上这个虚拟网络,需要进一步授权。在此管理页面勾选前面的复选框,此时这个客户端就终于连上这个网络了
可以看到,勾选之后,左侧虚线变成了绿色实线,表示客户端已经连上这个网络(1d7193******63d387)
。另外客户端在此虚拟网络中的IP也已经得到,为10.147.18.99
。中间short name
和description
的部分,我也填入了相应短名称和描述,这样方便在多个客户端连入后,明确知道各个客户端分别是什么。这个很有用,整个ZeroTier世界里面全是数字,就靠这个描述和名称来标识各个客户端了。
***
## 配置ZeroTier Moon私有中转节点
如果终端PC ping OpenWrt下桥接网络延迟超过30ms且时断时续就表示终端PC与OpenWrt之间的P2P隧道没有打通,一般移动网络与电信或者联通之间使用UDP穿透会失败。这时候就需要自建Moon节点进行中专加速。
这边测试了联通和广电的点对点隧道,是不能直接用UDP打通的。搭建MOON节点后可以看到网络明显稳定了许多
搭建ZeroTier的Moon行星节点需要一台有公网IP的VPS
,最好用国内的
,因为国内的转发延迟相对与国外的VPS还是要快上不少。要是实在没有可以用谷歌云,注册送100刀,用香港的节点延迟在40ms上下,流量计费100刀大概1T流量,也可以用[甲骨文Oracle](https://www.oracle.com/cn/index.html)免费的,但要visa卡或者万事通卡,本事示例用的时一个阿里云的上海,系统为Centos 7。
### 1. vps安装ZeroTier(详细情况请看上面Linux安装教程)
* 执行命令:
```Linux
curl -s https://install.zerotier.com/ | sudo bash
- 执行完成 ZeroTier就已经安装完成了。
2. vps加入ZeroTier局域网
- 执行命令:
zerotier-cli join <network id>
- 完成之后按ZeroTier官网允许其入网。
3. 生成moon模板
- 执行命令:
cd /var/lib/zerotier-one
- 执行命令:
zerotier-idtool initmoon identity.public > moon.json
4. 修改moon.json
- 执行命令
vi moon.json
- 修改
stableEndpoints
为vps的公网的IP
,例如"stableEndpoints": [ "8.8.8.8/9993" ]
5. 生成签名文件
- 执行命令:
zerotier-idtool genmoon moon.json
- 执行之后会生产一个
000000xxxx.moon
的文件,将这个文件用Winscp
等工具从vps上下载下来。
6. 将moon节点加入网络
- 执行命令:
mkdir moons.d
- 执行命令:
mv ./*.moon ./moons.d/
- 重启 zerotier即可。
systemctl restart zerotier
或者
zerotier-cli restart
7. 别忘了9993加入开放端口
在其他ZeroTier节点中添加启用已设置好的Moon节点
自动配置
- 输入命令:
sudo zerotier-cli orbit [moon.json 文件中的 id] [moon.json 文件中的 id]
- Windows 有一点不同,需要使用管理员权限的 PowerShell 输入:
zerotier-cli orbit [moon.json 文件中的 id] [moon.json 文件中的 id]
手动配置
各个系统平台下 ZeroTier 目录位置 :
- Windows: C:ProgramDataZeroTierOne
- Macintosh: /Library/Application Support/ZeroTier/One
- Linux: /var/lib/zerotier-one
- FreeBSD/OpenBSD: /var/db/zerotier-one
OpenWrt需要修改一个脚本,因为其var目录时一个内存虚拟的临时目录,重启后原有配置不会保留。通过ssh连接OpenWrt(ssh功能可在系统->管理权中开启)。
执行命令vi /etc/init.d/zerotier
,在“add_join() {”
上方插入两行代码:mkdir -p $CONFIG_PATH/moons.d cp /home/moons.d/* $CONFIG_PATH/moons.d/
- 在对应系统平台下的 ZeroTier 目录位置,创建
moods.d
文件夹。sudo mkdir /var/lib/zerotier-one/moods.d
- 将
moon服务器
生成的0000006xxxxxxxxx.moon
拷贝到moons.d
文件夹下。 - 重启
zerotier-one服务
。- Linux :
/etc/init.d/zerotier-one restart
- Windows :
- 按下
windows键+r
,打开运行
窗口。 - 输入
services.msc
回车。 - 找到
ZeroTier One服务
,右键选择 “重新启动。
检测生效
- Linux :
- 在对应系统平台下的 ZeroTier 目录位置,创建
- 在
非moon
的客户端,输入命令:zerotier-cli listpeers
Windows
有一点不同,需要使用管理员权限
的PowerShell
输入:zerotier-cli listpeers
如果出现如下情况:
moon服务器
的ID 、IP
地址出现在列表中,证明联通moon服务器
。200 listpeers <ztaddr> <path> <latency> <version> <role> ................... 200 listpeers 6xxxxxxxxx [moon IPv4地址]/60723;11450;11405 -1 1.4.6 MOON ...................