前一篇文章,我们已经可以通过为设备安装 ZeroTier 软件来接入虚拟局域网,以此实现 P2P 访问,但这种方案的问题在于,需要为每一台想接入的设备均安装 ZeroTier 软件并在控制台加入网络,非常不方便。

其实我们只需要在局域网的出口设备 —— 路由器上安装该软件,并进行一定的配置,就可以达到外网访问任意局域网设备的效果。

前置条件

  • 路由器系统:OpenWrt
  • 一个 ZeroTier 虚拟局域网 ID
  • OpenWrt 内网段(文中假设为 192.168.0.0/24)与 ZeroTier 虚拟网段无冲突
  • 愿意捣鼓、无惧踩坑的你

OpenWRT 端软件配置

后文将默认你已经在 OpenWrt 上成功安装了 ZeroTier 客户端,否则请出门左转~

首先,如果是自建 planet,我们需要将 planet 文件放到 ZeroTier 的配置目录下,planet 文件的生成方法见此文。如果是自建 moon,则需要将 moon 文件放置到配置目录的 moons.d 目录下,本文假设配置目录为 /etc/zerotier。需要注意的是,OpenWrt 下某些版本的 ZeroTier,行星服务器的配置文件名可能并不是 planet,而是 world。

接下来,我们通过 uci 对 zerotier 服务进行配置:

bash
mkdir -p /etc/zerotier/moons.d

uci set zerotier.sample_config.enabled='1'
uci set zerotier.sample_config.config_path='/etc/zerotier'
uci commit zerotier

接下来,查看 zerotier 的配置文件(cat /etc/config/zerotier),不出意外的话,刚刚修改的参数已经填写到文件中了。然后重启路由器。

设置网络的 secret 参数:

bash
uci set zerotier.sample_config.secret="$(cat /var/lib/zerotier-one/identity.secret)"
uci commit zerotier

重启 ZeroTier 服务,并使用命令 zerotier-cli join 加入网络。稍等片刻,在网页端控制台中即可发现新设备的加入,进行授权。然后小等一会,回到路由器终端,执行以下命令检查状态:

bash
zerotier-cli listnetworks

若一切正常,应该会显示加入的网络与分配到的虚拟 IP 地址。至此,OpenWrt 客户端软件配置已完成,接下来我们需要配置一下路由与防火墙。

ZeroTier 静态路由配置

前往 ZeroTier 网页端,对虚拟网络进行管理,选择 Routes,添加一条配置,其 Targets 为 OpenWrt 内网网段(例如:192.168.0.0/24),Gateway 配置为 ZeroTier 分配给 OpenWrt 的 IP 地址。如此,静态路由配置完成。

OpenWrt 网络配置

首先执行 ifconfig 命令看一下 ZeroTier 分配给的接口名称,例如我这里是 zt0。


来到 luci 界面,依次选择 Network->Interfaces,添加一条新的 interface,命名为 zerotier,将其物理端口绑定为前面的 zt0,防火墙新建一条命名为 zerotier:


然后前往 Network->Firewall,配置如下:


最后,在 OpenWrt 中执行下面命令:

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

注意将 zt0 修改为 ZeroTier 为你分配的接口名称。

经过上面这些配置,外网接入虚拟局域网的设备就可以与 OpenWrt 局域网内的所有设备互访了。在配置成功后,我们可以将防火墙的三条规则写入 Custom Rules 中,方便开机自动启用。