本文已参与「新人创造礼」活动,一同敞开创造之路。

背景

公司有几台内网服务器没有公网IP地址,只能在公司局域网内拜访,多有不方便。经过东西完成内网穿透后,内网服务器上的一些服务如gitlab、jira、Jenkins甚至是SSH就能够完成异地拜访。目前较为流行的内网穿透东西有frp、ngrok、zerotier、花生壳等。这两天简略研讨了一下zerotier,所以本篇文章首要介绍zerotier。

ZeroTier简介

项目地址:github.com/zerotier/Ze…

官网: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.注册账号

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

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

2.创立网络

注册后登录到主页,会有一个“Create A Network”的黄色按钮,点击即可创立一个网络,全部坚持默许即可。

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

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

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

二、客户端参加网络

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

由于首要就是想内网穿透访到这几台内网服务器,所以这几台服务器都要装置zerotier客户端。zerotier有两种装置方法,一种是最原始方法的编译装置,一种是经过脚本主动装置。下面别离介绍一下这两种方法:

方法一:脚本装置

初次装置的话,引荐这种方法,简略方便,只需履行以下指令一键装置即可。装置完成后会主动在/var/lib/zerotier-one/下生成相关文件及目录

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

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

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

方法二:编译装置

① 下载源码包

这种方法稍微有点繁琐,需求装置一些依赖,比方:gcc、cargo。首要适用于zerotier无法参加网络,想卸载重装但卸载不干净的状况。初次装置引荐运用方法一。

能够先经过Windows下载到本地然后经过SSH东西上传到服务器,再解压。当然假如服务器现已装置git东西就更方便了,能够经过git指令一键克隆源码:

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

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

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

② 编译

进入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 gcc
gcc -v 
yum -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

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

留意:部分软件的编译,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

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

装置完gcc 7后,再次履行make指令,或许还会报错“/bin/sh: cargo: command not found”

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

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

yum install -y cargo

再次履行make即可编译经过:

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

③ 启动zerotier-one

./zerotier-one -d

启动后,会主动绑定9993端口,检查9993端口被绑定,即表明启动成功:

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

④ 给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”

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

2.客户端参加创立的网络

客户端别离参加网络,想穿透哪台,哪台就参加。

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

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

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

勾选后,办理端会随机分配一个IP地址给这台客户端,一起也能够自定义一个IP地址。例如我参加了多台内网服务器,并自定义了IP地址和称号:

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

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客户端服务器参加网络后,相当于在本地虚拟了一块网卡,网卡地址就是虚拟局域网分配给这台客户端的地址:

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

4.测验连通性

例如有两台服务器都装置了客户端,并且都参加了上面创立的网络,客户端A地址是10.147.18.122,客户端B的地址是10.147.18.211,则能够在客户端A所在的服务器上ping客户端B,测验两台机器有没有互通。

ping 10.147.18.211  # ping同一虚拟网络下的其他客户端

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

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

5.异地电脑装置客户端

就像开篇说到的,我的需求是想在家中也能够拜访公司的内网服务器上的服务,那么我在家中的电脑也需求装置zerotier客户端,并参加到zerotier网络。这也是这个东西比较费事的地方。以我个人电脑为例,我的是Mac电脑(Windows步骤差不多),衔接的是手机热门。

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

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

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

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

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

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

拜访Jira

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

拜访Gitlab

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

拜访Jenkins

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

拜访mayfly

mayfly是一款不错的开源一站式服务器、数据库办理东西,内网穿透到这台服务器后,经过mayfly东西,就相当能够随时随地在网页端、拜访其办理的各个内网服务器终端。

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

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

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

树立MOON中转服务器

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

一、装置装备zerotier

1.下载zerotier

自建卫星服务器,同样需求装置zerotier,装置方法同客户端装置共同,仅有差异是在云服务器上装置。

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

2.生成认证装备文件

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

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

如下图所示,履行上述指令后会生成一个moon.json的装备文件

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

3.修改装备文件,增加公网ip

修改moon.json,增加云服务器的公网ip

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

其间,180.76.xxx.xxx为云服务器的公网ip,9993为zerotier默许端口(注:云服务器安全组中需敞开9993端口,不然客户端衔接不上moon)

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

4.生成签名文件

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

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

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。

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

我看了网上很多教程,moon的树立进程、客户端接入到此就完毕了,就没有然后了…….我没觉得有什么不同。由于我尝试过在自建卫星服务器后,把行星服务器上的各个客户端接入都删除,理论上此刻应该会主动转到moon作为根服务器,可是此刻的moon并没有承担起办理网络、根服务器的功能,无法检查各个客户端的IP地址,各个客户端也就无法相互拜访…….很多人说到的中转加快我也没感受到速度有什么变化。也或许是我研讨的不够深入,还有什么地方没设置好的缘故,回头再研讨研讨这个moon。总归只需不删除行星服务器上的各个客户端接入,各个客户端就能正常拜访。

附:卸载zerotier

yum remove zerotier-one -y
rm -rf /var/lib/zerotier-one/