okaa

放弃moon节点,直接搭建Zerotier根服务器

外网访问家庭局域网方案

随着NAS、软路由的普及,越来越多的人产生了外网访问家庭网络的需求。当前访问家庭网络的方案主要分为三类:

1.公网ip

这一类当然是最方便的,也是花费较少的方案。可以通过ip地址直接访问家庭网络,即使是变动的公网ip,也只需购买域名配置DDNS即可。但随着政策的加严,获取ipv4公网ip的渠道越来越少,之前寄托了很多希望的ipv6现在看来也存在诸多问题。

2.隧道穿透

这一类是通过一台具有公网ip的机器(通常是一台云服务器)作为中转,在这台机器与家庭局域网内的机器建立隧道,借由公网下的服务器作为跳板访问家庭网络。这一类服务有自建的,如Frp、NPS等,也有商家提供服务的,如SakuraFrp、DDNSTO等。

3.虚拟局域网

这一类更适合私人或小团体使用,其原理是建立一个虚拟的广域网,并为加入这个虚拟网络的设备分配一个虚拟的ip,并在这个广域网内通过虚拟ip互访。最知名的代表就是Zerotier,也是我今天所要介绍的

Zerotier的优缺点

通俗来讲就是 Peer to Peer (P2P) ,ZeroTier 根服务器记录请求路径来做类似于DNS的解析。主要功能,就是可以把多个不同网络的设备连接在一起,用来就像在一个局域网下 。

Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,zerotier就会自动分配虚拟ip,无需了解ip、端口等配置。

但很可惜,zerotier的根服务器都在国外,我们到zerotier服务器需要经过层层的NAT中转,这导致我们通过zerotier网络互访时不仅存在较大的延迟,而且在网络高峰段非常容易断连。

在之前,对于这种情况,我们的解决方案是在国内的服务器上搭建一个zerotier的moon中转节点,作为zerotier根服务器的代理加速,但加速效果有好有坏(有的人说速度很快,但我的中转就很慢),而且这种方式的一个问题就是,安卓端的手机无法加入moon节点。这个问题很快就被解决了,kaaass大佬做了一个ZerotierFix的app,相比于官方增加了可以加入moon节点的功能。

Zerotier-planet

虽然大佬的app解决了安卓客户端不能加入moon节点的问题,但moon节点的搭建以及客户端的配置仍然不是一个比较简单的过程,又要配置服务器端又要配置客户端,zerotier便捷性的优点就体现不出来了。

前段时间,小众软件推荐的一分钟自建 zerotier-planet 行星服务器吸引了我,简单浏览了一下,发现过程是真的很简单。jonnyan404大佬的这个项目是基于另一个项目ztncui优化而来,简单而言就是用docker部署一个独立的zerotier虚拟网络。部署这个项目的全部准备只有在你的公网服务器上安装好docker和docker-compose。

jonnyan404大佬已经写好了zerotier-planet的docker配置脚本,我们只需登陆服务器执行以下几个命令

1. 从gitee仓库下载docker配置文件

git clone https://gitee.com/Jonnyan404/zerotier-planet

2. 进入下载的项目文件夹

cd zerotier-planet

3. docker安装zerotier-planet,如果服务器是Ubuntu系统,记得命令前加上 sudo

docker-compose up -d

4. 然后就可以访问 http://ip:4000 访问web界面了(记得防火墙开放4000端口)

默认用户名:admin 默认密码:mrdoc.fun

建议登陆后立即创建新用户,并切换到新用户登陆,删除默认的admin账户,以保证安全

接下来的操作与官方版的zerotier没有太大区别了,这里新建一个虚拟网络test,ID是

119c41e47a8a0433

zerotier-planet

Private: 设置对设备的访问控制权,默认勾选上

Private

Easy setup: 设置虚拟广域网段,可以自己设置

Easy setup

Routes: 设置路由,一般就只有一个默认的路由(也就是刚刚设置的网段),稍后介绍它的扩展用法

Routes

Assignment Pools: ip地址分配,你可以指定该网段下虚拟ip可供分配的范围

Assignment Pools

接下来,只要在自己的设备上安装zerotier的客户端,然后通过ID加入网络,就可以在该页面刷新出设备列表了,为新设备勾选Authorized即可分配虚拟的ip地址了。

ip分配

基于zerotier网络可以实现许多功能,例如windows端的远程桌面连接,ssh连接linux服务器,访问个人服务器上的博客

应用扩展-允许openwrt客户端自动NAT

尽管zerotier已经支持相当多的平台了,但仍有一些设备不受支持,比如我升级到DSM 7.0的小猫盘。为了让这些无法安装zerotier客户端的设备也加入到这个虚拟网络中,我们需要一个支持zerotier的openwrt路由器。以我的R2S为例

zerotier设置

1. 首先将R2S也加入虚拟网络,在openwrt后台管理中填入虚拟网络ID,并允许客户端NAT。

R2S-Openwrt

2. 设置虚拟网络路由

R2S-虚拟ip

我的R2S分到的虚拟ip为10.81.33.114,在Routes我们再新建一个路由

新建路由

我这里已经设置过了,Target应根据路由器的网段来决定,比如我的R2S局域网访问地址为192.168.2.1,则Target则应填192.168.2.0/24Gateway则填R2S分配到的虚拟ip,这里是10.81.33.114

openwrt设置

除了zerotier上的设置,还要对openwrt进行设置,使得流量可以通过虚拟广域网传播

新建zerotier接口

我们在openwrt 网络>接口 里新增一个zerotier接口,系统会为其分配一个zt开头的物理接口,我的是zt6xtbbu66。对该接口进行设置,传输协议选择静态地址ipv4地址填分配的虚拟ip,ipv4子网掩码是默认的225.225.225.0,在防火墙设置创建/分配防火墙区域选择lan

接着在 网络>防火墙 里自定义防火墙规则,增加以下规则

iptables -I FORWARD -i zt6xtbbu66 -j ACCEPT

iptables -I FORWARD -o zt6xtbbu66 -j ACCEPT

iptables -t nat -I POSTROUTING -o zt6xtbbu66 -j MASQUERADE

记得将zt6xtbbu66换成你自己对应的物理接口,重启防火墙

测试

这个时候,R2S下的设备应当已经加入zerotier广域网了,以我的小猫盘为例,在局域网下它的访问地址为192.168.2.147:5000,在安卓手机上通过ZerotierOne连接zerotier广域网,并断开WiFi,在浏览器中访问192.168.2.147:5000

小猫盘

访问成功,表明小猫盘已经通过R2S接入到局域网了

退出移动版