安装zerotier

通过官方的一键安装脚本安装

curl -s https://install.zerotier.com | sudo bash

如果你是root用户,那么不需要加上sudo,去掉sudo即可,非root用户直接执行上述命令

检查是否安装成功

执行下面的命令,如果有返回则没问题

zerotier-one -v

加入你所在的zerotier账户网络

zerotier-cli join xxxxxx

把上面的xxxxxx换成你的网络id

允许新设备加入网络

对着新设备前面的红框单击,打上勾即可

打通两地nat后面的局域网设备

原理

先梳理一下两地的ip情况,两边都有一个由zerotier建立起来名称为zt开头的虚拟网卡,它们下发的ip就是在zerotier管理页对应的ip,我们需要通过这个两个ip来访问到它们所属的局域网,实现打通两地局域网。

假设:A地的局域网ip段为192.168.123.0/24,zerotier的内网ip为10.118.10.1/24,B地的局域网ip段为10.10.10.0/24,zerotier的内网ip为10.118.10.2/24,前提是,两地做好了zerotier的路由,比如A地访问B的的局域网,那么路由就是Daddr=10.10.10.0/24,gateway=10.118.10.1,反过来,B地访问A地的局域网,就是Daar=192.168.123.0/24,gateway=10.118.10.2,如果是zerotier内网互相访问是没问题的,也就是10.118.10.0/24网段的ip互相访问,当A地的zerotier客户端访问B地的zerotier所在的局域网ip段,也就是192.168.123.0/24去访问10.10.10.0/24,它们就是通过zerotier组成的内网ip去互相访问的,但绝对不跟两地的局域网同网段,这时候A地的出口ip就是10.118.10.1,但是在B地不认得这个ip,10.118.10.1跟10.10.10.0/24没有任何关系,那么我们就需要用到它了!没错,它,防火墙,源地址转换,我将用nftables防火墙做解释,iptables原理同样,操作也更简单,先看下面的示例:

nft add table inet nat \
nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; } \
nft add rule inet nat postrouting ip saddr 10.118.10.0/24 ip daddr 10.10.10.0/24 masquerade

我来解释一下,第一行,创建一个inet(ipv4+ipv6)名为nat的表

第二行,创建链,在名为nat表上创建一个名为postrouting的类型为nat的链

第三行,创建规则,在名为nat表,名为postrouting链上建立一个规则,将源地址为10.118.10.0/24的ip,目的地址为10.10.10.0/24的ip进行masquerade,也就是ip地址伪装,这个是重点,只有这个做出来,我们的局域网才认得被另一地的ip所访问

最后

保存防火墙规则,不要使用目的网卡为zt开头的网卡作为目的地址,因为当nft防火墙起来的时候,zerotier服务还没起来,就没有zt这个虚拟网卡,会导致nft防火墙起不来,报错。

nft list ruleset > /etc/nftables.conf
systemctl enable nftables.service --now