放弃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
enter description here
Private: 设置对设备的访问控制权,默认勾选上
Private
enter description here
Easy setup: 设置虚拟广域网段,可以自己设置
Easy setup
enter description here
Routes: 设置路由,一般就只有一个默认的路由(也就是刚刚设置的网段),稍后介绍它的扩展用法
Routes
enter description here
Assignment Pools: ip地址分配,你可以指定该网段下虚拟ip可供分配的范围
Assignment Pools
enter description here
接下来,只要在自己的设备上安装zerotier的客户端,然后通过ID加入网络,就可以在该页面刷新出设备列表了,为新设备勾选Authorized即可分配虚拟的ip地址了。
ip分配
enter description here
基于zerotier网络可以实现许多功能,例如windows端的远程桌面连接,ssh连接linux服务器,访问个人服务器上的博客

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

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

zerotier设置

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

enter description here

2、设置虚拟网络路由

R2S-虚拟ip
enter description here

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

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

openwrt设置

除了zerotier上的设置,还要对openwrt进行设置,使得流量可以通过虚拟广域网传播
新建zerotier接口
enter description here
我们在openwrt 网络>接口 里新增一个zerotier接口,系统会为其分配一个zt开头的物理接口,我的是zt6xtbbu66。对该接口进行设置,传输协议选择静态地址,ipv4地址填分配的虚拟ip,ipv4子网掩码是默认的225.225.225.0,在防火墙设置中创建/分配防火墙区域选择lan
接着在 网络>防火墙 里自定义防火墙规则,增加以下规则
ptables -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
小猫盘
enter description here
访问成功,表明小猫盘已经通过R2S接入到局域网了

一分钟自建zerotier-plant

私有部署zeroteir-planet服务
基于 ztncui 整理成 docker-compose.yml 文件.

特别感谢 https://github.com/Jonnyan404/zerotier-planet/issues/11#issuecomment-1059961262 这个issue中各位用户的贡献,基于此issue中 @jqtmviyu 的步骤和kaaass的 mkmoonworld 制作成目前的patch(集成planet和moon)。

必要条件

  • 具有公网ip的服务器
  • 安装 docker
  • 安装 docker-compose
  • 防火墙开放TCP端口 4000/9993/3180 和UDP端口 9993

用法

1
2
3
4
5
6
7
8
9
10
11
git clone https://github.com/Jonnyan404/zerotier-planet
OR
git clone https://gitee.com/Jonnyan404/zerotier-planet

cd zerotier-planet
docker-compose up -d
# 以下步骤为创建planet和moon
docker cp mkmoonworld-x86_64 ztncui:/tmp
docker cp patch.sh ztncui:/tmp
docker exec -it ztncui bash /tmp/patch.sh
docker restart ztncui

然后浏览器访问 http://ip:4000 打开web控制台界面。

浏览器访问 http://ip:3180 打开planet和moon文件下载页面(亦可在项目根目录的./ztncui/etc/myfs/里获取)。

  • 用户名:admin
  • 密码:mrdoc.fun
    note: 如果未指定密码,可执行docker exec -it ztncui cat /var/log/docker-ztncui.log|grep Password获取密码.

客户端主要为 Windows, Mac,Linux, Android

zerotier官网: https://www.zerotier.com/download/

  • Windows 配置

    1. 首先去 zerotier 官网下载一个 zerotier 客户端
    2. 将 planet 文件覆盖粘贴到 C:\ProgramData\ZeroTier\One 中 (这个目录是个隐藏目录,需要运允许查看隐藏目录才行)
    3. Win+S 搜索 服务

enter description here
找到 ZeroTier One,并且重启服务
enter description here

  1. 使用管理员身份打开 PowerShell
    执行如下命令,看到 join ok 字样就成功了

 复制

1
2
3
PS C:\Windows\system32> zerotier-cli.bat join 网络id(就是在网页里面创建的那个网络)
200 join OK
PS C:\Windows\system32>

登录管理后台可以看到有个个新的客户端,勾选 Authorized 就行
enter description here

  • 执行如下命令:

     复制

    1
    2
    3
    4
    5
    6
    PS C:\Windows\system32> zerotier-cli.bat peers
    200 peers
    <ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
    fcbaeb9b6c 1.8.7 PLANET 52 DIRECT 16 8994 1.1.1.1/9993
    fe92971aad 1.8.7 LEAF 14 DIRECT -1 4150 2.2.2.2/9993
    PS C:\Windows\system32>

    可以看到有一个 PLANTET 和 LEAF 角色,连接方式均为 DIRECT(直连)
    到这里就加入网络成功了

  • Linux 客户端

    1. 安装 linux 客户端软件
    2. 进入目录 /var/lib/zerotier-one
    3. 替换目录下的 planet 文件
    4. 重启 zerotier-one 服务 (service zerotier-one restart)
    5. 执行 zerotier-cli join 网络id 加入网络
    6. 管理后台同意加入请求
    7. 执行 zerotier-cli peers 可以看到 planet 角色
  • 安卓客户端配置

  • ZerotierFix
    Zerotier 非官方安卓客户端发布:支持自建 Moon 节点 - V2EX

  • Mac 客户端 (参考 https://github.com/Jonnyan404/zerotier-planet/issues/35)

    1. 官网下载一个 zerotier 客户端
    2. 替换 /Library/Application Support/ZeroTier/One 目录下的 planet 文件
    3. 重启 zerotier-one 服务
    4. 命令行执行 zerotier-cli join 网络id
    5. 管理后台同意加入请求
    6. 执行 zerotier-cli peers 可以看到 planet 角色

私有 zerotier-planet 的优势:

  • 解除官方 25 的设备连接数限制
  • 提升手机客户端连接的稳定性

Reference Link

  • zerotier的planet服务器(根服务器)的搭建踩坑记
  • https://www.mrdoc.fun/doc/443/
  • https://github.com/key-networks/ztncui-aio