在我翘首以盼许久的nas到货的前一天,得空来实践已经研究了很长时间的内网穿透。
一开始想着用DDNS来简单快速地实现,结果一看得到的外部IP还是学校的内网IP,一时突然想起用DDNS需要有绑定在自己路由器上的公网IP来着
于是火速转向ZeroTier,用组建一个可以异地加入的虚拟局域网的形式来实现内网穿透,原理是在不同地方不同网络的设备通过一个双方都能访问的服务器来交换传输数据,这个服务器我们称之为planet,即行星,也可以理解为地球。
ZeroTier官网上可以注册登录可以快速创建一个使用了官方服务器的虚拟局域网
但考虑到高峰时段设备之间的连接可能会变得不可用,而我恰巧有一台希望物尽其用的服务器,那么就可以自己创建一个planet服务,这种自建的planet一般就称为moon,即月球,功能上与官方的根服务器上没什么区别,也是作为不同设备交换传输数据的中转。
于是花了半天的时间把搭建moon和管理连接的moon的坑给踩过去~

一、搭建moon节点

1.下载zerotier

curl -s https://install.zerotier.com |sudo bash

2.放行防火墙9993端口的UDP流量

3.切换工作目录

cd /var/lib/zerotier-one

4.导出并修改moon的配置文件

zerotier-idtool initmoon identity.public >>moon.json
nano moon.json

修改stableEndpoints字段的值为当前服务器的公网IP及端口号(用”/“分隔)

5.创建moon服务

zerotier-idtool genmoon moon.json

6.创建该moon节点的文件夹并移入上一条命令创建的moon文件

mkdir /var/lib/zerotier-one/moons.d

cp 0000xxxxxxx.moon ./moons.d/

7.重启zerotier服务

systemctl restart zerotier-one

8.服务器加入自己的moon节点网络

zerotier-cli orbit (moon节点ID)

二、其他设备加入moon节点

1.下载zerotier程序

2.将创建的moon文件放入到zerotier-one的moons文件夹中

  • Linux :/var/lib/zerotier-one/moons.d/
  • Windows:C:\ProgramData\ZeroTier\One\moons.d\
  • MacOS:/Library/Application Support/ZeroTier/One/zerotier-one/moons.d/

然后使用相应zerotier的程序输入节点ID加入自己的moon

3.Android手机端加入moon节点

需要三样东西:ZeroTier Fixapp、moon文件、以及自定义的planet文件

  1. ZeroTier Fix的安装包可查看作者在知乎上文章Zerotier 非官方安卓客户端发布:支持自建 Moon 节点
  2. moon文件和上一步操作的文件是相同的
  3. 需要在Linux系统上使用mkmoonworld工具将moon的配置文件moon.json转换为world.bin文件,再重命名为planet

前两步轻轻松松,最麻烦是第三步
首先mkmoonworld工具只有linux版本就限定了操作平台,虽然这个planet文件确实本该就由moon的所有者分发,这个所有者必然用的linux
其次是mkmoonworld工具似乎对linux内核版本有要求或者其他原因,我使用ZeroTier Fix作者写的这个版本会报错FATAL: kernel too old,找到另一个版本才转换成功
最后一个问题是怎么把00000xxxxx.moon文件和转换并重名好的planet文件传到手机上——得益于手机上糟糕的文件管理,由QQ或者微信传输到手机上的文件真的很难找到文件在哪!
准备妥当之后还有三步:

  1. ZeroTier Fix设置里选择启动自定义 Planet,选择传到手机上的Planet文件;
  2. 入轨中通过传到手机上的00000xxxx.moon文件导入moon节点;
  3. 在首页的加号添加网络ID输入自己的moon节点ID

三、创建节点管理后台

1.执行命令

(1)下载ztncui

根据系统选择以下两种下载方式之一

curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.13_amd64.deb
dpkg -i ztncui_0.8.13_amd64.deb

yum install  https://download.key-networks.com/el7/ztncui/1/ztncui-release-1-1.noarch.rpm -y
yum install ztncui -y

(2)配置ztncui的环境配置,并重新启动
sh -c "echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret`>/opt/key-networks/ztncui/.env"
sh -c "echo HTTP_ALL_INTERFACES=yes >> /opt/key-networks/ztncui/.env"
sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"

chmod 400 /opt/key-networks/ztncui/.env
chown ztncui.ztncui /opt/key-networks/ztncui/.env

systemctl enable ztncui
systemctl restart ztncui

ztncui这里是我踩坑时间最长的地方
如果用systemctl status ztncui查看ztncui的状态时发现一直启动失败,可以在ztncui程序所在的目录/opt/key-networks/ztncui手动执行ztncui程序查看具体的错误来源
我碰到的是由于服务器的Linux系统版本落后缺少相应node环境和gcc环境,而报如下错误,解决方法由此去->

/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /opt/key-networks/ztncui/node_modules/argon2/build/Release/argon2.node)

2.暂时放行服务器的3000端口

在其他设备能通过虚拟局域网进入后台后关闭3000端口来保证安全

3.ztncui启动成功后,登录服务器的3000端口进入后台

四、创建并管理moon节点的网络

这一部分可以看视频演示
在后台的右上角有Login登录按钮
默认用户名是admin,密码是password,初次登录成功后会要求修改密码