使用zerotier组建异地互访的局域网

最近有从外部访问无公网IP的局域网的需求,做了一些尝试。

一开始我想到的是直接用端口转发解决,在网关设备上跑个端口转发软件,改一下iptables把局域网内服务器需要的端口转发出去。但经过将近一周的测试,发现问题有二:一是增加服务时要需要修改iptables规则,但是咱家做的是传统行业,没有招聘网络技术人员(也没有这个必要),维护只能我一个人做;二是端口转发受服务端性能和带宽影响严重,国外服务器延迟高,国内服务器带宽贵,实在不好选。

既然端口转发方案不行,那就考虑p2p方案,网上搜了一圈,发现有两个现成的:zerotier-one和n2n,看过两边的文档后选择了zerotier,不用维护服务端。

于是开搞,左边是办公室网关(gl-inet GL-B1300),右边是家庭网关(gl-inet GL-AR750)。

根据官方wiki官方手册分别安装上zerotier-one、在VPS建立好MOON服务器,在zerotier管理面板https://my.zerotier.com/network建立私有network后,编辑/etc/config/zerotier,将option enabled '0'改为option enabled '1'list join 'SampleNetworkID'改成list join 'YourNetworkID',如果建立了moon服务器则执行zerotier-cli orbit yourMOONID yourMOONID绑定MOON,无moon则跳过此步,执行service zerotier start启动服务。可以从下图(zerotier管理面板)看到,这两个路由器已经在线了。

新建转发到wan的接口,命名为zerotier(可以随意起名,你喜欢就好)绑定到设备ztr****。新建允许转发到wan的防火墙区域,命名为zerotier或者别的什么名字,也绑定到ztr****。

在路由器分别添加以下几条iptables规则:

iptables -I FORWARD -o -j ACCEPT iptables -I FORWARD -i yourZerotierInterface -j ACCEPT iptables -t nat -I POSTROUTING -o yourZerotierInterface -j MASQUERADE

最新版本的zerotier-one自带动态配置静态路由,无需自行配置路由表。

终端内使用命令zerotier-cli listnetworks查看网络情况,其中zt********是zerotier接口(interface)的名称,记住它,接下来更改iptables链表要用到。

打开luci»网络»防火墙»自定义规则,将下面的内容粘贴到文本框内,并将zt********替换成上面记住的接口名称然后并保存。

iptables -I FORWARD -i zt******** -j ACCEPT
iptables -I FORWARD -o zt******** -j ACCEPT
iptables -t nat -I POSTROUTING -o zt******** -j MASQUERADE

如果需要限定转发源的范围,在forward后加上参数-s *.*.*.0/CIDR,要啥网段自己改。

最后在zerotier的web管理面板批准设备接入。设置两条静态路由规则,将192.168.196.151作为zerotier网络内部访问192.168.0.0/24的网关、192.168.196.226作为192.168.7.0/24的网关。这里有个注意事项,虽然192.168.0.1/24与192.168.0.0/24等价,但前者下发到openwrt无法被识别,所以必须使用*.*.*.0/CIDR这种格式

查看各客户端以及和PLANET及MOON的连接情况使用此命令:zerotier-cli listpeers

其中,PLANET是zerotier官方服务器,MOON是自建的加速服务器,LEAF是终端设备。

使用zerotier-cli peers命令可以查看当前设备通过什么地址什么方式与其它节点连接。

查看B1300的路由表,可以看到192.168.7.0/24 via 192.168.196.226192.168.196.226正是AR750在zerotier虚拟局域网中的ip。然后再确认另一部路由器中有192.168.0.0/24 via 192.168.196.151192.168.196.151是B1300在zerotier虚拟局域网中的ip。至此,确认两个局域网的lan已经连接到了一起,可以互相访问。

PING测试和traceroute测试,表明两个网关路由直接连接,连接的最大带宽取决于两边设备的带宽限制以及运营商对p2p流量的QoS:

5 条评论

发表评论

*

forty eight ÷ 48 =

  • Google Chrome 71.0.3578.98 Google Chrome 71.0.3578.98 Windows 10 x64 Edition Windows 10 x64 Edition

    两个openwrt路由,版本1.2.12和1.4.6,能互相ping对方网关,进对方路由后台也可以,就是ping不通对方路由下的内网设备。

  • Google Chrome 80.0.3987.100 Google Chrome 80.0.3987.100 Windows 10 x64 Edition Windows 10 x64 Edition

    尴尬。组网好了。移动openwrt 联通LEDE。 现在联通能ping通移动的下的设备,移动的只能ping到联通的路由,下面设备连不上

  • Google Chrome 75.0.3770.143 Google Chrome 75.0.3770.143 Android 9 Android 9

    哦草,手机移动网络的nat类型是symmetric,zerotier穿透质量很差,丢包率达到50%以上,加入moon(双向cn2 gia)中转也没有改善。但是光纤宽带联通率可达95%以上。