本文主要介绍如何使用zerotier进行虚拟局域网的搭建。内容包含zerotier下载安装
,moon节点搭建
,router配置
。
zerotier下载安装
zerotier的官方下载地址: https://www.zerotier.com/download/ 大部分操作平台可以在这直接下载,对于以下部分平台有代替软件或者需要额外配置
android
建议使用ZerotierFix代替,此软件支持配置Moon节点
qnap
在升级到qnap 5.0.1之后zerotier 1.10.1会启动报错,需要按照以下方式配置,如果后续qnap或者zerotier升级修复,则无需关注
https://forum.qnap.com/viewtopic.php?t=167752
Moon节点搭建
网上教程较多,不赘述,需要一台公网服务器,随意找一个教程搭建即可
https://www.cnblogs.com/Yogile/p/12642423.html
router配置
假设你家有一台路由器(lan-ip: 192.168.2.1),一台nas(lan-ip:192.168.2.2) 此时你希望手机能直接连接到家里的nas,那么需要将nas和手机同时加入到zerotier的虚拟局域网中
nas(lan-ip:192.168.2.2, zt-ip:192.168.192.2), phone(zt-ip:192.168.192.100)
均加入zerotier之后,手机可以通过zt-ip来访问nas
这样虽然能访问,但是有两个缺点:
- 如果家里局域网有多个设备需要加入到zerotier,那每个设备都需要安装/配置zerotier,非常繁琐,甚至有的设备不能安装zerotier
- 手机连接局域网设备需要两套配置,在局域网内配置一套lan-ip,在外面的zt网络配置配置zt-ip,每次需要切换,不能无感切换
设想一下,假如我们把一台局域网的设备加入zerotier网络,并将该设备作为路由(router),所有访问局域网内其他设备的流量均由这台路由代理,那么局域网内设备就无需加入zerotier网络。 并且可以设置成手机访问局域网网段(192.168.2.x)也由这台路由代理,这样手机不论在局域网内,还是在外面的zt网络内,都可以通过nas的lan-ip来访问nas
linux配置
以支持iptables的linux设备为例,可以是你家的路由器、nas或树莓派。这台路由的ip假定为(lan-ip:192.168.2.1, zt-ip:192.168.192.3)
zerotier网络配置路由转发
将局域网的网段(192.168.2.0/24)全部由zerotier的ip转发
配置路由网络转发
官方教程: 链接🔗
ssh进入到路由设备的后台
打开ipv4的路由转发
1
sudo sysctl -w net.ipv4.ip_forward=1
配置路由表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# PHY_IFACE为物理网卡地址 PHY_IFACE=eth0 # ZT_IFACE为zerotier虚拟网卡地址 ZT_IFACE=zt7nnig26 # 这两个网卡地址可以通过 ip a 查看 # 配置iptables转发规则 sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT # 配置持久性,下次重启也生效(如果不支持该命令,自行查找解决) sudo apt install iptables-persistent sudo bash -c iptables-save > /etc/iptables/rules.v4
Done
此时应该已经生效了,试试用你的zerotier设备通过局域网ip访问家里的设备吧。
补充配置
你应该可以通过lan-ip访问所有其他局域网设备,但唯独不能通过路由的lan-ip(192.168.2.1)访问路由。如果你没有这个需求你可以搁置不处理,但我这用的是nas作为路由,如果不能通过nas的lan-ip来访问nas,那么仍然没有解决上述的问题。
原理不解释了,直接说结论。我们需要配置一下路由设备自身ip访问的DNAT
1 2 3 4
iptables -t nat -I PREROUTING -i <zt-nic> -d <ROUTER-LAN-IP> -j DNAT --to-destination <ROUTER-ZT-IP> # 以上面这个例子,配置如下 iptables -t nat -I PREROUTING -i $ZT_IFACE -d 192.168.2.1 -j DNAT --to-destination 192.168.192.3
执行后,应该就能通过路由的lan-ip(192.168.2.1)直接访问路由设备了。
Mac作为路由配置
假如你使用Mac作为路由,由于其不支持iptables
,而是使用的pfctl
,因此配置上稍有不同
打开ipv4的路由转发
1
sysctl -w net.inet.ip.forwarding=1
配置pf
新增
/etc/pf.zerotier.conf
,增加以下配置1 2 3 4 5 6 7 8 9 10
# PHY_IFACE为物理网卡地址 PHY_IFACE=en0 # ZT_IFACE为zerotier虚拟网卡地址 ZT_IFACE=zt7nnig26 # 这两个网卡地址可以通过 ip a 查看 nat on $PHY_IFACE from $ZT_IFACE:network to any -> ($PHY_IFACE)
更新pf配置
执行
sudo pfctl -e -f /etc/pf.zerotier.conf