OpenWRT使用ZeroTier来实现异地组网的方案

OpenWRT使用ZeroTier来实现异地组网的方案

一般的异地组网方案分有两种,一种是依赖于公网地址,另一种是依赖于中心服务器。

依赖于公网地址的方案,比较常见的有OpenVPN、WireGuard、Nebula、Headscale等这类工具。

这类方案强依赖公网IP,虽然IPv4地址已经枯竭,但靠着NAT续了命,但你愿意交钱(或者交涉)的话,还是会给你分配到一个IPv4。

如果你不想交钱也可以,可以使用IPv6,但目前运营商给的IPv6是会变动的,你可以考虑使用DDNS来解决。

但IPv6还有个问题,就是运营商对此的支持力度不是很足,不够快和稳定(建议你还是交钱)

该说说另一种方案依赖于中心服务器了,这类工具需要有服务器来支撑运行,比如ZeroTier,其他的类似ToDesk、RustDesk。

文章是基于OpenWRT搭建的,其他情况也可以做个参考,因为文章的方案使用到了ZeroTier的特定功能,没有直接使用更简单的使用方式。

PS:可能有人会对我说的ZeroTier是依赖中心服务器有异议,虽然在打洞穿透成功后流量可能已转向P2P,但没有官方的中心服务器启动都启动不了,所以我认为它是伪去中心化的。去中心的化的有Nebula、Headscale,但它们都刚需拥有公网地址的服务器协助,但所有服务是用户可以自建的,而ZeroTier关键的Planet是不可以的,也没开源。

搭建过程

先接单的介绍一下ZeroTier。

ZeroTier是一个创建虚拟局域网的工具,虚拟局域网可以将不同物理位置的设备连接到一个虚拟网络中,效果如同处于同一个局域网内。

创建虚拟局域网

  1. ZeroTier的官网上注册一个账号

  2. 创建一个虚拟网络

    image-20250301192620518

    通过点击按钮创建之后,注意这个NETWORK ID,后面需要用到它。

OpenWRT安装ZeroTier

官方源这边我是没有搜索到ZeroTier的luci可视化页面,所以下文的话,有关ZeroTier我还是以全程终端命令行的方式说明。

安装ZeroTier

1
2
opkg update
opkg install zerotier

设置和启动ZeroTier

1
2
/etc/init.d/zerotier enable #这里是设置成服务自启,不想要可以不执行
/etc/init.d/zerotier restart

创建接口

  • 在网络->接口->接口页面中点击添加新接口

    image-20250301201514304

    可以参考上图,然后填好相关内容后点击创建接口。

配置防火墙

  • 在网络->防火墙->常规设置中点击添加

    image-20250301202016954

    可以参考上图,然后填好相关内容后点击保存。

将接口加入到防火墙区域

  • 在网络->接口->接口页面中点击刚刚创建的接口的编辑按钮

  • 转到防火墙设置中,选择分配防火墙区域

    image-20250301202315943

加入创建的虚拟网络

1
zerotier-cli join xxx

注意上面的xxx是在上一步在官方网页端创建的NETWORK ID。

在官方网页端添加设备

image-20250301194921563

方式一可以通过查看Auth这一列是否被勾选来判断是否在此网络中验证通过。

添加其他设备到此虚拟网络中

这里以Android设备为例,其他平台的设备都可以去看下ZeroTier的官网找对应的客户端支持。

Android下载ZeroTier One应用,通过点击ADD NETWORK来加入到虚拟网络中(依然是熟悉的NETWORK ID)

image-20250301195653897

小阶段结束

到此阶段,将需要组网的设备统统加入到此虚拟网络就达成了组网目的了。

如果发现网络没ping通,请考虑下是否完成相关网络设置的重启,省事的话这里建议直接重启路由器。

但我还需要实现两个功能:

  1. 通过OpenWRT去访问其管理下的设备
  2. 使用OpenWRT来当此虚拟局域网的DNS服务器

接下来再介绍我是如何设置的,可以参考一下。

让OpenWRT来当虚拟局域网的DNS与转发

设置虚拟局域网DNS

  1. 打开ZeroTier官网登陆账号点击进入相关虚拟网络

  2. 在Settings选项中设置DNS

    image-20250301212244186

  3. 检查接入的设备中是否使用了虚拟局域网的DNS(以Android为例)

    image-20250301212434347

设置虚拟局域网路由转发

这里有个要求,就是OpenWRT子网的网段要与虚拟局域网的网段不同

  1. 打开ZeroTier官网登陆账号点击进入相关虚拟网络

  2. 在Settings选项中设置Managed Routes

    image-20250301212816043

    参考上图的设置,按照自身实际情况去修改配置。

效果测试

image-20250301213439697

效果如上图,proxy.gugu是我在OpenWRT上设置的主机名映射。

自建流量中转Moon服务器

ZeroTier的理念是优先NAT打洞,失败的话会转向使用服务器进行流量中转。

这里用到的服务器是ZeroTier官方的服务器进行中转,但在国内的原因,速度感人。

下面会讲到自建ZeroTier的中转服务器Moon,使用自己的服务器作为Moon来进行流量中转。

正当我想写下去的时候,看到ZeroTier官网的Moon文档上写着:

warning

Using moons is now discouraged. Please contact us for advice and alternatives.

官方已经在不推荐使用Moon了,那我也不打算详细讲Moon的搭建步骤了,下面贴上官网文档方便自阅:

Creating Your Own Roots

PS

看到官方Moon文档上的警告,不太理解为什么,在网上检索的时候看到有人说到了ZeroTier的变化…

早年一个网络节点数限制为 1000 ,后来逐步限制到 500 、100 、25 、15 个,连个用户通知都没有,真心是怀疑这个软件是不是故意这么干的(偷偷限制自建 moon 只能用官方的),逼迫用户升级到付费版本。

…五味杂陈,ZeroTier官方不会真的在让用户付费上步步紧逼吧,打算先观察一阵子,看情况再切其他方案吧。


OpenWRT使用ZeroTier来实现异地组网的方案
https://blog.gugu.dev/2025-03-02/OpenWRT使用ZeroTier来实现异地组网的方案/
作者
MinMin
发布于
2025年3月2日
许可协议