前言
这种方式是基于路由器运行客户端的方式,把所有连接到路由器内的设备都连接到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
- SSH到你的路由
为免干扰测试环境,建议找一个已经彻底恢复初始设置的路由和新建一个虚拟网络测试,由于我的架构没有支持LUCI界面的包,这里我使用的多数是命令行,原理一样
**17.x.x版本的openwrt固件的zerotier客户端版本太低,经过测试已经不能连接官方平台,会被踢下线**
安装zerotier
-
opkg update
-
opkg install zerotier
配置zerotier
在后台中心参考如下图配置你的网络
-
配置虚拟网络的路由表,下图示例的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
网段。
-
配置地址池
以上基本步骤完成后,继续下一步骤: -
加入网络
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防火墙、接口
- 新建以下防火墙规则
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
- 新建一个网络接口:转到Network -> Interfaces,单击Add new interface并输入以下设置:
Name of the new interface : ZeroTier Protocol of the new interface : Unmanaged Adapter : "ztXXXXXXXX"
- 然后转到Network -> Firewall,单击Add以使用以下设置创建一个新区域:
以上操作完成后记得保存,然后重启路由
加入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一下这个路由实体IP
192.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