前言

这种方式是基于路由器运行客户端的方式,把所有连接到路由器内的设备都连接到zerotier的虚拟局域网上。如路由器为:192.168.1.X网段,然后同一虚拟网络ID下的所有成员,在开启客户端异地远程连接到该虚拟网络后,只需直接访问:192.168.1.X网段,即可实现远程访问。适合于某些没有办法安装zerotier客户端的设备,如:单片机、私有服务的智能家居、IP摄像头、非基于安卓的门禁主机等等这些没有适配到客户端程序的设备。

部署前请参考:https://chrisxs.com/index.php/jishu/3z7zxe4n42ps

本示例环境:

  • 设备:gl-inet 6416-A
  • 固件:OpenWrt 22.03.0 r19685-512e76967f、OpenWrt 22.03.5 r20134-5f15225c1e
  • **17.x.x版本的openwrt固件的zerotier客户端版本太低,经过测试已经不能连接官方平台,会被踢下线**

  • SSH到你的路由
    为免干扰测试环境,建议找一个已经彻底恢复初始设置的路由和新建一个虚拟网络测试,由于我的架构没有支持LUCI界面的包,这里我使用的多数是命令行,原理一样

安装zerotier

  1. opkg update
  2. opkg install zerotier

配置zerotier

在后台中心参考如下图配置你的网络

  1. 配置虚拟网络的路由表,下图示例的Destination是属于你的虚拟局域网使用的网段,例如你的路由器IP地址为:192.168.10.1则填写192.168.10.0/24。via是通过哪个虚拟局域网网段的意思,例如:你的虚拟局域网现在IP网段为192.168.30.x,而你的openwrt路由在虚拟局域网IP为192.168.30.10,则填入192.168.30.10。意思是通过该路由的虚拟局域网IP192.168.30.10转发到路由器自己的内网192.168.10.x网段。
  2. 配置地址池

    以上基本步骤完成后,继续下一步骤:
  3. 加入网络

    uci set zerotier.openwrt_network=zerotier
    uci add_list zerotier.openwrt_network.join='你的网络ID'
    uci set zerotier.openwrt_network.enabled='1'
    uci commit zerotier

    如果要删除:uci del_list zerotier.openwrt_network.join='<network id to remove from join list>'

  • 重启路由器
  • 重启后输入命令:ip a,会发现已经多出一个虚拟的网卡模块:

    root@openwrt:~# ip a
    ... (several networks)
    6: ztXXXXXXXX: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 6a:04:a7:8b:b8:6a brd ff:ff:ff:ff:ff:ff
    inet6 fe80::6804:a7ff:fe8b:b86a/64 scope link 
       valid_lft forever preferred_lft forever
  • 测试你的设备是否在线:

    root@openwrt:~# zerotier-cli info
    200 info 你的路由zerotier设备ID ONLINE 你的客户端版本号
  • 一段时间后,您的 OpenWrt 路由器应该出现在zerotier后台中心

当你的路由出现在后台中心后,点击auth授权,以便它可以从你的网络中获取 IP。想稍后将ZeroTier 网络 ID 的所有成员的所有流量路由到我们的 LAN, OpenWRT 路由器的 ZeroTier IP 地址是固定的,通过在 ZeroTier 控制器中手动设置,还要确保已选中允许以太网桥接选项。

  • 运行:ip a,如无意外,路由虚拟的网卡:ztXXXXXXXX,应该获取了虚拟局域网的IP地址

至此,zerotier方面已经配置完成。

配置openwrt防火墙、接口

  1. 新建以下防火墙规则
    uci add firewall rule
    uci set firewall.@rule[-1].name='Allow-ZeroTier-Inbound'
    uci set firewall.@rule[-1].src='*'
    uci set firewall.@rule[-1].target='ACCEPT'
    uci set firewall.@rule[-1].proto='udp'
    uci set firewall.@rule[-1].dest_port='9993'
    uci commit firewall
    /etc/init.d/firewall restart
  2. 新建一个网络接口:转到Network -> Interfaces,单击Add new interface并输入以下设置:
    Name of the new interface                : ZeroTier
    Protocol of the new interface            : Unmanaged
    Adapter                                  : "ztXXXXXXXX"

    ZeroTier 接口

  3. 然后转到Network -> Firewall,单击Add以使用以下设置创建一个新区域:
    ZeroTier 区域设置

以上操作完成后记得保存,然后重启路由

加入moon中转站

zerotier-cli orbit moonID moonID

测试

  • 假设你的路由的实体IP为:192.168.10.1,虚拟网络的IP为192.168.30.1
  • 准备另一台不同实体网络可是在同一个虚拟网络的主机(可以是手机使用客户端)。例如:使用手机用流量连接zerotier客户端,ping路由虚拟网络IP:192.168.30.1
  • 成功PING通后,再测试PING一下这个路由实体IP192.168.10.1
  • 都成功后,再PING路由实体LAN口下所连接的某个设备例如:192.168.10.x
  • 至此已经接入成功了

补充

创建防火墙区域的命令行

uci add firewall zone # =cfg15dc81
uci set firewall.@zone[-1].name='区域名称'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci add_list firewall.@zone[-1].network='区域名称'
uci add firewall forwarding # =cfg16ad58
uci set firewall.@forwarding[-1].src='区域名称'
uci set firewall.@forwarding[-1].dest='lan'
uci add firewall forwarding # =cfg17ad58
uci set firewall.@forwarding[-1].src='区域名称'
uci set firewall.@forwarding[-1].dest='wan'
uci add firewall forwarding # =cfg18ad58
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='区域名称'

创建zerotier接口的命令行

uci set network.接口名称=interface
uci set network.接口名称.proto='none'
uci set network.接口名称.device='你的虚拟网卡名称'

openwrt的zerotier服务重启、停止、启用、禁用命令:

  • 重启:/etc/init.d/zerotier restart
  • 停止:/etc/init.d/zerotier stop
  • 启用:/etc/init.d/zerotier enable
  • 禁用:/etc/init.d/zerotier disable

关于重启后失效

在某些版本的固件中可能重启后就会失效,不知道是我的路由固件原因还是软件包原因,虽然依然在连接虚拟网络,可是重启后zerotier会报错:Please check that the service is running and that TCP port 9993 can be contacted via 127.0.0.1.。实际上这时候依然存在连接

可以依次运行:

/etc/init.d/zerotier restart
zerotier-cli orbit moonID moonID

或者做成开机启动脚本

touch /etc/init.d/startup.sh
nano /etc/init.d/startup.sh

输入一下内容:

#!/bin/sh
sleep 5 #延时5秒
/etc/init.d/zerotier restart
sleep 5
zerotier-cli orbit moonID moonID

赋予脚本执行权限:

chmod +x /etc/init.d/startup.sh

配置开机时启动该脚本

ln -s /etc/init.d/startup.sh /etc/rc.d/S99startup


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。