通过 ZeroTier 实现外网设备与局域网内所有设备互联
前一篇文章,我们已经可以通过为设备安装 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 服务进行配置:
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 参数:
uci set zerotier.sample_config.secret="$(cat /var/lib/zerotier-one/identity.secret)"
uci commit zerotier
重启 ZeroTier 服务,并使用命令 zerotier-cli join
加入网络。稍等片刻,在网页端控制台中即可发现新设备的加入,进行授权。然后小等一会,回到路由器终端,执行以下命令检查状态:
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:
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 中,方便开机自动启用。