本文参考: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.json4. 修改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 restart7. 别忘了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 ...................
苏公网安备32058202012049号