不知道什么时候起,我就有“内网穿透”的需求了。最早恐怕可以追溯到小学时接触“灰鸽子”的时候说起。
为了实现这个需求,我也是折腾过许多方案,看过许多文章,对此原理也是略知一二吧。ZeroTier 算是比较早就接触过的,它可以将不同地方的设备组成虚拟的局域网。但是当时只是浅尝而止,无它,只是因为当时的穿透效果弱鸡,延迟高到无法忍受。但是当时的我并没有想其中的原因,只是简单的认为“ZeroTier”不太行,现在看来多少还是太年轻了。

需求分析

  • 通过 ZeroTier 组网,搭建 Docker Swarm 集群,从而允许本地电脑加入 swarm 集群提供服务。
  • 远程开发,但是又不想将服务暴露出来。
  • 远程管理处于内网的服务器。

看得出来,ZeroTier 简直就是完美的解决方案,它比 VPN 好用太多了。

起因

上面废话这么多,其实我老早之前就搭建好了。这次的原因是,我登录 ZeroTier Central 后才发现社团之前一直沿用的 ZeroTier 网络莫名其妙的消失了。也就是说,从“网页管理”那里根本看不到这个网络了,但是它又确实存在的,唯一的问题就是因为我无法管理了,就没办法添加新的节点,管理节点的 IP 地址等。😮‍💨没办法,因为这个事情,我不得不重新组一个网络。

组网过程

这里在直接下载就行了,由于基本是都是 Linux,一行命令就可以了。

  • 加入 ZeroTier 网络

    • zerotier-cli join xxx

需要先启动 zerotier-one 服务,可以通过 zerotier-cli info 查看情况。

  • 在管理界面分配 IP,配置路由。

这里为了省事,直接分配了 10.0.0.0/8 这个网段(因为打的字比较少哈哈哈)。
image.png

自建 MOON 服务器

ZeroTier 最理想的就是直接 NAT 打通,但是有时候网络太复杂根本打不通 NAT 通道,这个时候就需要外部服务器给我们做一个代理转发。不管能不能打通都需外部服务器做桥梁,这也是“内网穿透”的核心所在。
一般情况下,基本是不用管这些,但是奈何我们的网络环境比较独特,没有 MOON 服务基本上也就没 ZeroTier 啥事情了。这里之所以叫“MOON”,是因为官方搭建的服务器叫“PLANET”,所以私人搭建只能降一级叫做“MOON”,我觉得挺不错的。之前看过许多搭建 MOON 的文章,基本是都是千篇一律也不是很理解,这次看到官网给的文档才算是略知一二。

前置条件

  • 固定的 IP 地址,一般情况下要求是公网 IP,必须保证所有的节点都可以直接访问到这个 IP 才行。
  • 开放的端口,一般默认的是 9993

流程

  • 进入 ZeroTier(一般是“/var/lib/zerotier/”)的目录
  • 创建 moon.json 配置文件,这里创建的文件携带了你的密钥
zerotier-idtool initmoon identity.public > moon.json
  • 修改 moon.json 文件,加入节点 IP 地址(访问路径)

    • 官网给出的例子是:10.0.0.2/9993,这里你需要修改成自己的 IP 地址。
{
  "id": "deadbeef00",
  "objtype": "world",
  "roots": [
    {
      "identity": "deadbeef00:0:34031483094...",
      "stableEndpoints": [ "{你的IP地址}/9993" ]
    }
  ],
  "signingKey": "b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0",
  "signingKey_SECRET": "ffc5dd0b2baf1c9b220d1c9cb39633f9e2151cf350a6d0e67c913f8952bafaf3671d2226388e1406e7670dc645851bf7d3643da701fd4599fedb9914c3918db3",
  "updatesMustBeSignedBy": "b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0",
  "worldType": "moon"
}
  • 创建 MOON 文件,上一步搞定了配置,这次就来创建 MOON 文件。
zerotier-idtool genmoon moon.json

执行完成后会创建一个 0000000XXXXX.moon 文件,将其复制到“moons.d”文件夹(没有就自己创建一个)下面即可。这里的 XXXXX 就是你的 MOON 节点的地址,需要记住它。

  • 重启 ZeroTier 服务
systemctl restart zerotier-one

这个时候基本是就搞定了 MOON 节点的创建。

  • 加入 MOON 节点

MOON 节点也是一个网络,你需要使用上面生成的 MOON 地址。

zerotier-cli orbit xxx xxx # xxx 是你上面创建的MOON地址

稍安勿躁

zerotier-cli listpeers

这个时候你应该可以看到属于你自己的“MOON”的节点了。如果没有出现请尝试重启“ZeroTier”后重试。

配置路由器 NAT 转发

这是一个很简单的需求,我的电脑不想安装“ZeroTier”这个软件,当时我又需要访问“ZeroTier”网络下面的节点设备,因此我需要在一个路由器上安装“ZeroTier”并且加入这个节点,然后通过路由器的 NAT 转发功能来实现在路由器下面的设备都可以直接访问到 ZeroTier 网络下面的节点。
:::info
常见的 OpenWrt 固件集成了 ZeroTier 的服务,因此一般情况不需要手动安装 ZeroTier 了。一些固件更是直接帮你完成了 NAT 转发的功能,基本是无需手动配置。
:::

ifconfig  # 查看 ZeroTier 的接口名称

image.png
这里我们知道了接口的名称,就叫它 zt0 吧方便后面示范。

iptables -I FORWARD -i zt0 -j ACCEPT
iptables -I FORWARD -o zt0 -j ACCEPT
iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE

在防火墙里面加入上面的规则,就可以完成本地 NAT 的转发。请注意 iptables 的配置需要手动保存一下,否则重启后就消失了。

进阶需求 - DNS 服务解析

当你的网络中有许多节点的时候,你需要分别记住不同的 IP 对应不同的设备是什么。如果要访问它的话,每一次都需要输入一遍 IP 地址,这点很不友好。ZeroTier 显然也考虑到了这个情况,因此弄了一个 DNS 服务器,叫做“zeronsd”,通过它我们可以给节点“指定”一个友好的名称,在使用 IP 地址的时候,通过名称来代替即可。

这里需要弄清楚,一台终端,可能有多个网络接口,即有多个 interfaces,这个时候 DNS 要怎么工作?比较理想的就是一个网络接口配置一个 DNS 解析服务器,当查询来临时根据接口来请求不同的 DNS 服务器。而 ZeroTier 工作的时候会创建一个 interface。这点刚好符合我们的需求,我们只希望在 ZeroTier 创建的接口上去查询指定的 DNS 服务器(也就是我们搭建的内部 DNS 服务器)。

更多内容请参考

DNS 这块我一直有心去弄的,但是由于时间有限,对我来说提升确实有限,就没有弄这个东西了。

Last modification:August 20th, 2021 at 08:54 pm
要饭啦~