由于家境贫寒,买不起高性能服务器,加之现在很多云厂商并不提供ARM架构的服务器供大家使用,所以有了自己搭建一个服务器集群的想法。设备分散在多个不同的机房(家里)均无公网 IP,想要实现在外网快速连通所有机器。
网络情况
选取一台有公网IP的机器作为跳板(我选择的是一个1c1g5m容器)由于转发需要的网络带宽比较大,但是对于CPU要求不高。接入的机器分布在国内外各种地方,大部分没公网IP,甚至无法直通。
方案
使用的是 zerotier +自建 moon 的方案,zerotier的稳定性和灵活度是远远高于frp之类的方案的,可以实现类似于花生壳 蒲公英组网类似的效果,将多个机器集中到一个大内网中。
但是zerotier的服务器位于海外,会导致ping非常的高,还容易断线,所以我们需要自己搭建一个moon转发服务,在国内P2P打洞基本是失败的,所以大部分情况下我们需要中转服务器,中转对延迟要求和带宽要求很高,中转服务器必须能够被子节点直接ping通 这点需要注意一下!CPU和内存要求很低,可以使用弹性服务器或者容器运行。
方案选型对比
方案 | 优势 | 劣势 |
---|---|---|
FRP | 可以直接端口级别转发 | 但是无法实现点多点ip通讯,比如使用内网数据库 |
n2n | 自建服务,数据安全可靠 | 自建服务有维护成本,如果服务挂掉比较麻烦 |
zerotier | 可以想访问内网一样通过ip访问,免费的服务足够用 | 需要自己去暴露端口,比如nginx 反向代理,服务器在境外速度较慢 |
zerotier 安装
curl -s https://install.zerotier.com/ | sudo bash
sudo systemctl start zerotier-one.service #启动服务
sudo systemctl enable zerotier-one.service #开机自启
组网
sudo zerotier-cli join e5cd7a9e1cxxxxx #替换成你自己的网络ID
配置中转服务器
cd /var/lib/zerotier-one/
sudo zerotier-idtool initmoon identity.public > moon.json
编辑 moon.json
中的 stableEndpoints
使用双引号填入你中转服务器的公网 IP,并记住第一行的ID
在当前目录下执行下面命令,会生成一个 xxxx.moon
的文件,创建moons.d
目录并移动 xxxx.moon
到moons.d
中。最后重启服务即可。
zerotier-idtool genmoon moon.json
sudo mkdir moons.d #创建moons.d文件夹
sudo mv xxxx.moon moons.d/ #移动上一步生成的文件到这个文件夹中
sudo systemctl restart zerotier-one #重启服务
注意
如果使用的是云厂商的服务器,记得确认安全组是否允许了 UDP 9993 端口,新增入站规则如下图
节点配置中转服务器
使用 zerotier-cli orbit
配置中转服务器。注意ID要输入两遍,成功后会有 200 orbit OK
的输出。
sudo zerotier-cli orbit 「上面moon.json文件中的ID」 「上面moon.json文件中的ID」
效果
配置中转前,延迟在300-400ms
配置后稳定在40-50ms,效果十分明显(单程10-20ms,转发会X2)
节点取消中转服务器
sudo zerotier-cli deorbit xxxxxxx