ZeroTier实现内网穿透、异地组网

简介: ZeroTier实现内网穿透、异地组网,其基本工作原理是组建一个虚拟局域网,各个设备(NAS、Linux、Windows、Mac、iOS、Android)安装了客户端、加入到这个虚拟局域网后,就会自动分配一个IP,从而实现局域网内各个设备及服务的相互访问。

背景

公司有几台内网服务器没有公网IP地址,只能在公司局域网内访问,多有不便。通过工具实现内网穿透后,内网服务器上的一些服务如gitlab、jira、Jenkins甚至是SSH就可以实现异地访问。目前较为流行的内网穿透工具有frp、ngrok、zerotier、花生壳等。这两天简单研究了一下zerotier,所以本篇文章主要介绍zerotier。

ZeroTier简介

项目地址:https://github.com/zerotier/ZeroTierOne

官网:https://www.zerotier.com/

ZeroTier是一款利用 UDP 打洞来实现内网穿透的工具,相比其他工具成功率更高、部署更简单。其基本工作原理是组建一个虚拟局域网,各个设备(NAS、Linux、Windows、Mac、iOS、Android)安装了客户端、加入到这个虚拟局域网后,就会自动分配一个IP,从而实现局域网内各个设备及服务的相互访问。

zerotier的一些专有名词:

  • PLANET 行星服务器,Zerotier 官方根服务器,在国外。免费版最大支持25个设备连接。
  • MOON 卫星服务器,私有根服务器,可以利用带有公网IP的云服务器自己搭建,起到代理加速的作用
  • LEAF  网络客户端,连接到根服务器的网络节点,如上述提到的NAS、群晖、Linux、Windows等

使用PLANET 行星服务器

通过Zerotier官方根服务器建立虚拟局域网,优点是在没有自带公网IP的云服务器的情况下也可以异地组网,部署简单快捷,全地球都可以访问;缺点是:① 免费版允许连接的设备有限,最大25台,不过个人或小团队使用的话也够用了;② 数据不安全,毕竟是外国的服务器,一般没什么重要数据的情况下可以使用;③ 受网络波动影响,用网高峰期可能连接不稳定;

一、注册ZeroTier服务

1.注册账号

访问https://my.zerotier.com/network,注册账号,注册后登录。

2.创建网络

注册后登录到主页,会有一个“Create A Network”的黄色按钮,点击即可创建一个网络,一切保持默认即可。

创建完成后,主页会显示这个网络,记住这个16位的NETWORK ID,后面会用到。

二、客户端加入网络

1.内网服务器安装客户端

因为主要就是想内网穿透访到这几台内网服务器,所以这几台服务器都要安装zerotier客户端。zerotier有两种安装方式,一种是最原始方式的编译安装,一种是通过脚本自动安装。下面分别介绍一下这两种方式:

方式一:脚本安装

首次安装的话,推荐这种方式,简单快捷,只要执行以下命令一键安装即可。安装完成后会自动在/var/lib/zerotier-one/下生成相关文件及目录

curl-s https://install.zerotier.com | sudobash# Linux系统

其他操作系统:下载地址:https://www.zerotier.com/download/

方式二:编译安装

① 下载源码包

这种方式稍微有点繁琐,需要安装一些依赖,比如:gcc、cargo。主要适用于zerotier无法加入网络,想卸载重装但卸载不干净的情况。首次安装推荐使用方式一。

可以先通过Windows下载到本地然后通过SSH工具上传到服务器,再解压。当然如果服务器已经安装git工具就更方便了,可以通过git命令一键克隆源码:

git clone https://github.com/zerotier/ZeroTierOne.git

文件夹内会显示如下文件:

② 编译

进入ZeroTierOne,执行make命令即可

make

执行make时可能会遇到报错“g: error: unrecognized command line option ‘-std=c++17’”,是因为编译器不支持c++17,需要升级GCC。

CentOS默认安装的GCC是4.8.5的版本,可以通过如下方式升级g++,推荐7.3版本。

yum install gccgcc-vyum -y install centos-release-scl  
# 升级到9.1版本 yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils 
scl enable devtoolset-9 bash

注意:部分软件的编译,9.3.1的高版本可能编译不过,可以将上述命令中的9改为8或7就可以安装激活8.x.x或7.x.x版本的gcc了

# 如果是想升级到7.3版本,则使用如下命令yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils 
scl enable devtoolset-7 bash

安装完gcc 7后,再次执行make命令,可能还会报错“/bin/sh: cargo: command not found”

zerotier的编译依赖cargo,安装cargo:

yum install -y cargo

再次执行make即可编译通过:

③ 启动zerotier-one

./zerotier-one -d

启动后,会自动绑定9993端口,查看9993端口被绑定,即表示启动成功:

④ 给zerotier-cli创建软链接

此种安装方式安装后,zerotier-cli只保存在ZeroTierOne目录中,系统中没有zerotier-cli这个命令,在后续使用zerotier-cli命令查看网络情况时,需要一直在ZeroTierOne文件夹下通过./zerotier-cli的方式执行,多有不便。所以,可以通过创建软链接或是将zerotier-cli文件复制到/usr/local/bin目录下的方式,在全局使用zerotier-cli命令。以下为zerotier-cli创建软链接:

chmod+x zerotier-cli  # 增加执行权限ln-s /var/lib/ZeroTierOne/zerotier-cli /usr/local/bin/zerotier-cli

注意:创建软链接时,不能使用相对路径,要使用绝对路径,否则在使用zerotier-cli命令时,会报错“bash: /usr/local/bin/zerotier-cli: Too many levels of symbolic links”

2.客户端加入创建的网络

客户端分别加入网络,想穿透哪台,哪台就加入。

zerotier-cli join 830xxxxx9c49  # 上面第一步创建网络生成的16位IDzerotier-cli status  # 查看网络状态

客户端加入后,zerotier的Web管理页面就能看到该网络,勾选该网络,表示同意客户端接入

勾选后,管理端会随机分配一个IP地址给这台客户端,同时也可以自定义一个IP地址。例如我加入了多台内网服务器,并自定义了IP地址和名称:

3.客户端查看本地服务器网络情况

zerotier-cli listnetworks
# 如果连接成功,并且管理页面中勾选此客户端,则会返回以下内容200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 830xxxxxxxx49 high_wozniak 4a:ce:1d:66:95:9b OK PRIVATE ztqu3hhgt3 10.147.18.122/24

zerotier-cli客户端服务器加入网络后,相当于在本地虚拟了一块网卡,网卡地址就是虚拟局域网分配给这台客户端的地址:

4.测试连通性

例如有两台服务器都安装了客户端,并且都加入了上面创建的网络,客户端A地址是10.147.18.122,客户端B的地址是10.147.18.211,则可以在客户端A所在的服务器上ping客户端B,测试两台机器有没有互通。

ping10.147.18.211  # ping同一虚拟网络下的其他客户端

网络延迟不到1ms,挺好的。

5.异地电脑安装客户端

就像开篇提到的,我的需求是想在家中也可以访问公司的内网服务器上的服务,那么我在家中的电脑也需要安装zerotier客户端,并加入到zerotier网络。这也是这个工具比较麻烦的地方。以我个人电脑为例,我的是Mac电脑(Windows步骤差不多),连接的是手机热点。

在官网下载、双击安装即可,中间 有什么权限请求的,允许就行了。

安装完成后,打开zerotier,电脑顶部会有个zerotier的图标,选择加入新网络,输入上面生成的网络ID,加入。

6.访问其他客户端上的服务

比如有的服务器上安装了Jira、有的安装了Gitlab,输入zerotier分配该客户端(内网服务器)的虚拟局域网地址,并带上端口号,即可访问。

访问Jira

访问Gitlab

访问Jenkins

访问mayfly

mayfly是一款不错的开源一站式服务器、数据库管理工具,内网穿透到这台服务器后,通过mayfly工具,就相当可以随时随地在网页端、访问其管理的各个内网服务器终端。

例如:连接到jira服务器中端:

搭建MOON中转服务器

鉴于上述提到的zerotier官方行星服务器速度不稳定、数据不安全的弊端,有条件的比如有云服务器的可以自建moon卫星服务器,用于中转加速。我试了一下,感觉没什么区别,速度并没提升多少,可能是我还没有理解到moon的精髓,亦或是姿势不对,所以不过多发表意见,以下只提供教程:

一、安装配置zerotier

1.下载zerotier

自建卫星服务器,同样需要安装zerotier,安装方式同客户端安装一致,唯一区别是在云服务器上安装。

curl-s https://install.zerotier.com | sudobash# Linux系统

2.生成认证配置文件

进入云服务器的zerotier-one文件夹,生成认证配置文件

cd /var/lib/zerotier-one/
zerotier-idtool initmoon identity.public > moon.json

如下图所示,执行上述命令后会生成一个moon.json的配置文件

3.编辑配置文件,添加公网ip

编辑moon.json,添加云服务器的公网ip

"stableEndpoints": ["180.76.xxx.xxx/9993"]

其中,180.76.xxx.xxx为云服务器的公网ip,9993为zerotier默认端口(注:云服务器安全组中需开放9993端口,否则客户端连接不上moon

4.生成签名文件

zerotier-idtool genmoon moon.json
# 执行通过后会给出下面的提示,并生成一个.moon结尾的文件# wrote 0000006a449297b4.moon (signed world with timestamp 1665386844310)

5.将moon节点加入网络

在/var/lib/zerotier-one/目录下新建一个moons.d的目录,并将生成的.moon结尾的文件移动到此目录下。

mkdir moons.d
mv 0000006a449297b4.moon moons.d/

6.重启中转服务器的zerotier-one

systemctl restart zerotier-one  # 重启zerotier-one服务

二、客户端加入moon

1.复制.moon文件到各个客户端

客户端(内网服务器)的/var/lib/zerotier-one/目录下也新建一个moons.d的目录,并将moon节点的.moon文件复制到此目录下。随后重启zerotier-one服务。

systemctl restart zerotier-one  # 重启zerotier-one服务

2.查看是否建立连接

zerotier-cli listpeers  # 查看是否建立连接

如果出现moon节点的IP地址,并且结尾显示MOON,则表示内网服务器客户端已加入moon。

我看了网上很多教程,moon的搭建过程、客户端接入到此就结束了,就没有然后了.......我没觉得有什么不同。因为我尝试过在自建卫星服务器后,把行星服务器上的各个客户端接入都删除,理论上此时应该会自动转到moon作为根服务器,但是此时的moon并没有承担起管理网络、根服务器的职能,无法查看各个客户端的IP地址,各个客户端也就无法相互访问.......很多人提到的中转加速我也没感受到速度有什么变化。也可能是我研究的不够深入,还有什么地方没设置好的缘故,回头再研究研究这个moon。总之只要不删除行星服务器上的各个客户端接入,各个客户端就能正常访问。

附:卸载zerotier

yum remove zerotier-one -yrm-rf /var/lib/zerotier-one/

本文部分内容参考以下文章:

https://post.smzdm.com/p/a3067ond/

https://www.cnblogs.com/shizhe99/p/14620020.html

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
SQL 数据库连接 网络安全
金蝶云星空企业版v8.0如何通过内网穿透实现异地公网远程访问
金蝶云星空企业版v8.0如何通过内网穿透实现异地公网远程访问
|
4月前
|
运维 安全 网络安全
远程访问内网设备:对比IPsec VPN,SD-WAN异地组网更具优势
无论是远程办公还是工业物联,高效网络连接至关重要。传统IPsec VPN虽能提供安全通道,但部署复杂且灵活性有限。相比之下,SD-WAN作为一种软件定义广域网技术,以其简易部署、智能选路及云端管理等优势脱颖而出。它不仅简化了配置流程,支持任意网络环境下的快速组网,还通过智能优化路径保证了跨地域和运营商间的高质量传输。此外,SD-WAN的云端化管理平台使得维护与扩展更为灵活便捷,集成的安全功能进一步提升了整体网络防护水平。
232 0
|
7月前
|
存储 监控 安全
防火墙组网
防火墙组网
70 5
|
存储 网络协议 数据处理
异地远程访问连接家里的群晖NAS【内网穿透】
异地远程访问连接家里的群晖NAS【内网穿透】
|
安全 网络协议 程序员
一键穿越,私享互联,自建FRP内网穿透!
内网穿透对于多我们程序员来讲,应该是不陌生的。在对接某些第三方平台的时候,比如说:微信支付,经常会涉及到回调,在开发的时候就需要使用内网穿透来进行本地调试。那么今天给大家分享一下用 frp 搭建属于自己的内网穿透,方便在我们日常的开发中进行调试。同时是 frp 是开源并且是免费的,只需要一台云服务器即可搭建。
一键穿越,私享互联,自建FRP内网穿透!
|
网络协议 网络安全
关于wireguard异地组网
关于wireguard异地组网
|
安全 文件存储 网络架构
【服务器】无公网IP,异地远程连接威联通NAS
【服务器】无公网IP,异地远程连接威联通NAS
416 0
|
弹性计算 网络安全 网络虚拟化
使用阿里云VPN网关打通本地服务器局域网和云上专有网络VPC的方法
阿里云VPN网关和本地服务器固定IP组建局域网如何操作?
4521 0
使用阿里云VPN网关打通本地服务器局域网和云上专有网络VPC的方法
利用SAG构建IDC间的内网通讯
背景: 在互联网行业,同时拥有多个IDC机房是很常见的。通常为了使其实现内网互通会找运营商拉专线来实现。但专线的施工时间和整体的成本让很多企业望而却步。 业务价值: 智能接入网关(Smart Access Gateway)是阿里云提供的一站式快速上云解决方案。
962 0