群晖 docker ZeroTier方案

news/2024/12/13 21:29:23/文章来源:https://www.cnblogs.com/LungGiyo/p/18605874

zerotier

ZeroTier 官方解释为将整个世界转变为单个数据中心或云区域,将所有设备,虚拟机和应用程序联接起来,就像在同一个交换机接入所有设备一样。zerotier 类似 VPN, 为内网服务器所在 NAT 网络和客户机所在 NAT 网络各虚拟出一个 VLAN, 这样俩个 VLAN 就可以通过 ZeroTier 建立连接,在通过 UDP 打洞技术就可以实现内网服务器和内网客户机直接交互数据。目前 ZeroTier 提供的点对点穿透技术成功率还是比较高的,可以应付大多数网络,国内长城宽带无法点对点穿透。而 zerotier 因为是国外的项目,官方提供的中转服务器在国外,国内连接延迟高甚至连不上,所以官方给出了 moons 概念,可以自己搭建中转服务器。另外 ZeroTier 支持 Windows、macOS、Linux 三大主流平台,iOS、Android 两大移动平台,以及 QNAP(威连通)、Synology(群晖)、Western Digital MyCloud NAS(西部数据)三个 NAS 平台,还支持 LEDE 开源路由器项目,支持客户端真的很多。zerotier 适合有 linux 基础的个人,一般用于 NAS, 为了稳定性需要自购一个云主机做中转,服务器和客户机都需要安装 zerotier,企业追求稳定可以考虑其他方式。

名词解释:
ZeroTier 整的还挺有浪漫主义气质,官方的服务器叫 PLANET,用户自己建立的中转服务器叫 MOON。
MOON 服务器只起到一个握手的作用,在 P2P 打通后就没有 MOON 服务器啥事了,因此不用担心 MOON 服务器的延迟和宽带会影响联机体验,但是 MOON 服务器务必位于国内,如果服务器位于海外的话,数据经由 GFW 出口,可能无法顺利打通 P2P。[6]
PLANET 行星服务器,Zerotier 各地的根服务器,有日本、新加坡等地
moon 卫星级服务器,用户自建的私有根服务器,起到中转加速的作用
LEAF 相当于各个枝叶,就是每台连接到该网络的机器节点。
部署中间服务器 Moon

这里要简单提一下 UDP 打洞的原理,UDP 打洞的本质是让 NAT 后面的机器 A 和 B 先连接一个有公网 IP 的中间服务器,然后中间服务器经过一番操作之后让 A 和 B 直接互联,这样之后的数据传输就是 A 和 B 之间直接传输,不再通过中间服务器。

但是出于节省资源和增强健壮性的角度,A 和 B 服务器直接打出来的「洞」并不是永久的,而是维持一段时间后释放,下次连接时重新打洞。这样就带来一个问题,Zerotier 是一款国外的项目,他提供的中间服务器到大陆的网络状况并不好,有很高的延迟,并且很可能丢包,这就导致我们每次「打洞」都有很高的延迟。

以我的网络环境进行的测试中,第一次「打洞」有接近 500ms 的延迟,之后延迟降低到 100ms 以下,直到这个「洞」被释放。

为了解决这个问题,Zerotier 提供了一个 moons 的概念,官方文档中提供了详细的解释和配置方法。

这篇博客文章提供了一份中文的教程,有兴趣的读者可以按此操作。

我的中间服务器部署在腾讯云,对三网都有良好的延迟和极低的丢包,因此在部署成功后,「打洞」的第一个数据包延迟降低到了不到 200ms,同时由于丢包较低,打洞成功率也有所上升。

来源: https://blog.sandtears.com/2019/02/18/zerotier-and-p2p.html


教程

注册账号

要使用 Zerotier 要先去官方网站创建一个账号,直接选择 Free 套餐即可,可以提供 100 台以内设备的内网穿透,完全够用了。

之后去网络管理页面创建一个网络并记住 NetworkID。

网络管理界面可以配置很多东西,但是这里只介绍需要用到的部分,就是 NetworkID 和下面的 Members。

NetworkID 是在连入新设备时需要用到的标识符,每个设备连接这个虚拟的局域网时都要输入这个 ID。

Members 则是连入网络的设备列表,按照默认的设定,当有一个新设备接入网络时,用户需要在这个页面进行授权


服务端安装:

安装与配置
curl -s https://install.zerotier.com | sudo bash #一键安装
systemctl enable zerotier-one #记得配置开机启动
加入zerotier网络
zerotier-cli join <network id> #上面截图的
记录必要信息,在网络管理页面,找到对应网络id,在Members中:
1. 在前面打钩,添加备注
2. 记录服务器的address,后面要用

国内服务器搭建一个moon服务器

国内搭建moon服务,可以加速udp打洞过程   生成moon.json模板
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json 
要记住id之后加入moon服务器全靠他。检查 "id"是否为你vps的10为字符id,可在zerotier网页管理端查看,如果不是说明上一步配置有误。
vi 编辑 moon.json,修改 “stableEndpoints” 为 VPS 的公网的 IP,以 IPv4 为例,记得带引号:

生成签名文件,执行之后生成 000000xxxx.moon 文件。
zerotier-idtool genmoon moon.json
将 moon 节点加入网络:
在 VPS 的 Zerotier 安装目录下(/var/lib/zerotier-one)建立文件夹 moons.d,将生成的 000000xxxx.moon文件拷贝进去。
mkdir /var/lib/zerotier-one/moons.d
mv 000000xxxx.moon /var/lib/zerotier-one/moons.d/000000xxxx.moon
重启 zerotier,重启电脑。至此,VPS 上(moon 服务器)配置完成。
systemctl restart zerotier-one


NAS安装

群晖会有路由丢失的情况, 并且群晖7.0以上(DSM 7.0+) 会有TUN问题,。

创建一个持久的 TUN

DSM7 tun模块会出现问题,docker启动后,日志会提示:FATAL: cannot start ZeroTier One in container: /dev/net/tun not present.

使用ssh登录群晖,然后使用命令sudo -i ,提升到root权限,执行以下命令,创建TUN
1、检查:lsmod | grep tun,如果结果为空,请尝试安装它:
insmod /lib/modules/tun.ko

2、测试tun.ko模块是否有效:依次输入以下命令:
1)mkdir /dev/net
2)mknod /dev/net/tun c 10 200
3) chmod 600 /dev/net/tun
4) cat /dev/net/tun
如果cat命令的返回结果是File descriptor in bad state,则表示模块已正确安装。
来源: http://www.nasyun.com/thread-77576-1-1.html

3、使tun.ko模块持久化
 #编写脚本到路径: /usr/local/etc/rc.d/tun.sh 这将使得 /dev/net/tun 在启动时调用echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh#给这段脚本添加权限chmod a+x /usr/local/etc/rc.d/tun.sh#运行脚本/usr/local/etc/rc.d/tun.sh#检查TUN的运行状态(输出“/dev/net/tun”)ls /dev/net/tun
TUN存在问题可查阅这篇文章:Fix TUN/TAP not available on a Synology NAS 

在 DSM7 中安装 Docker 套件

直接安装即可


ZeroTier容器的配置

群晖 docker 镜像下载

使用docker安装 zerotier/zerotier 。 可能需要使用代理才能下载。

创建zerotier容器,并启动

创建一个Zerotier目录
创建目录,然后复制路径,这里演示用:/volume1/docker/zerotier-one 

创建docker容器配置,并且启动:
其中/dev/net/tun 就是上面解决的持久的 TUN;/volume1/docker/zerotier-one 是宿主机目录;网络模式使用host模式;
docker run \-d \--restart=always \--name zerotier-one \--device=/dev/net/tun \--net=host \--cap-add=NET_ADMIN \--cap-add=SYS_ADMIN \-v /volume1/docker/zerotier-one:/var/lib/zerotier-one \zerotier/zerotier


配置ZeroTier网络信息:

通过docker ps 查看容器id
执行以下命令:
docker exec -it 2da zerotier-cli status #查看状态
docker exec -it 2da zerotier-cli join db64858fed8a5da0 #加入网络
docker exec -it 2da zerotier-cli orbit 9d153e5b7c 9d153e5b7c#使用moon服务,地址为Members-Address
docker exec -it 2da zerotier-cli listpeers #检查是否加入moon
docker exec -it 2da zerotier-cli listnetworks #查看配置情况

注:也可以使用docker提供的终端机去执行:

在 zerotier网页端显示的信息,勾选加入。

增加路由

这是为了解决:群晖docker部署zerotier重启不能连接的自动解决方法_群晖zerotier启动不了
使用的命令是route add -net 192.168.XXX.0/24 dev ztwdjclgcv

其中 192.168.XXX.0/24 需要修改为zerotier网站上设置的本局域网的IP地址:172.29.0.0/16


 ztwdjclgcv则需要修改为启动docker后的设备序号,按如下方法查询:
通过docker exec -it 2da zerotier-cli listnetworks #查看配置情况
或者输入命令 ip a, 出来的最后一条信息序号后的字符串即为设备号: ztkseq7usn

vim命令增加zerotier_addroute.sh脚本,将脚本放到 /usr/local/路径, 脚本文本如下,需要根据实际进行修改。
zt7abcd2sa 替换为 ztkseq7usn , 10.147.88.0/24 替换为  172.29.0.0/16
#!/bin/bashecho `date -d today +"%Y-%m-%d %T.%N"` " Add route start......"#判断docker是否启动,标志是通过ip a命令查看特有设备标志zt7abcd2sa,各个机器不同。
dkstart=`ip a |grep zt7abcd2sa`while [$dkstart -eq ""]
do
#如果不存在,那么就等待60秒后再判断。
echo `date -d today +"%Y-%m-%d %T.%N"` " Docker is not exist, waiting 60s."
sleep 60
dkstart=`ip a |grep zt7abcd2sa`
done#循环出来,说明docker已经启动。判断路由是否存在。
resultstr=`route -n |grep zt7abcd2sa`
blankstr=""if [$resultstr -eq $blankstr]
then
echo `date -d today +"%Y-%m-%d %T.%N"` " Route is not exist, we will add route!"
#增加路由命令
route add -net 10.147.88.0/24 dev zt7abcd2sa
sleep 3
#等待3秒后判断是否增加成功resultstr=`route -n |grep zt7abcd2sa`if [$resultstr -eq $blankstr]
then
echo `date -d today +"%Y-%m-%d %T.%N"` " Add route failed!"
else
echo `date -d today +"%Y-%m-%d %T.%N"` " Add route success! The route info is: "$resultstr
fielse
echo `date -d today +"%Y-%m-%d %T.%N"` " Route is exist. The route info is: "$resultstr
fiecho `date -d today +"%Y-%m-%d %T.%N"` " Add route end!"

生成的脚本需要增加执行权限,通过命令修改:chmod +x zerotier_addroute.sh ,修改后脚本为绿色。


增加计划任务:

控制面板->任务计划->新增->触发的任务->用户定义的脚本。

用户定义脚本中,加入之前编辑的脚本,并将打印日志写入日志文件。

bash /usr/local/zerotier_addroute.sh >>/usr/local/addroute.log



并在任务计划中勾选“已启动->保存


在docker创建zerotier实例时,主要要将“启用自动重新启动”选上。

测试:

可在控制面板,计划任务中,选中刚才自定义的计划任务,点“运行”,运行一次脚本,并在telnet后台查看运行日志是否正常运行。日志存放在/usr/local/目录下。

查看命令:tail /usr/local/addroute.log 







docker版的zerotier时间与本地差8小时的解决方法:
1、暂时停止henrist-zerotier-one容器;
2、选择“编辑——环境——新增”,
3、左边输入:TZ,右边输入:CST-8
4、保存退出,然后重新开启容器

PC:

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

点击系统托盘中的图标,选择Join New Network,加入

管理员身份运行powershell,执行
加入moon主机:
cd C:\Program Files (x86)\ZeroTier\One #按照文件夹 ,自己找
zerotier-cli.bat orbit [节点ID地址] [节点ID地址] 
zerotier-cli.bat listpeers




安卓:

用第三方可以支持 moon服务:
https://github.com/kaaass/ZerotierFix
1. 加入网络
2. 加入mood服务
3. 允许移动网络下使用


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852115.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

43. JavaScript流程控制、函数、对象、BOM、DOM

1. 流程控制 1.1 if判断 [1] 单if分支if(条件){   条件成立运行的代码 } [2] if...else分支if(条件){   条件成立运行的代码 }else{   条件不成立运行的代码 }var a = 10; if (a >= 20) {console.log("ok") } else {console.log(&q…

JS-16 循环语句之for

循环语句用于重复执行某个操作 for语句是循环命令,可以指定循环的起点,终点和终止条件。他的格式如下 for(初始化表达式;条件;迭代因子){ 语句 } for语句后面的括号里面,由三个表达式。 ①初始表达式(initialize):确定循环变量的初始值,只在循环开始时执行一次。 ②布尔表…

ℯ ℐℴℴ ℴ ℯ ℒℯℊℯ ℴ ℯ ℴℴ ℋℯℴℯ

𝒯𝒽ℯ ℐ𝓃𝓉𝓇ℴ𝒹𝓊𝒸𝓉𝒾ℴ𝓃 𝓉ℴ 𝓉𝒽ℯ ℒℯℊℯ𝓃𝒹 ℴ𝒻 𝓉𝒽ℯ 𝒞ℴ𝓃𝒹ℴ𝓇 ℋℯ𝓇ℴℯ𝓈 𝒫𝒶𝓇𝓉 1 𝒯𝒽ℯ 𝒜𝓊𝓉𝒽ℴ𝓇-ℒℴ𝓊𝒾𝓈 𝒞𝒽𝒶 The author of the Legend of …

五阶魔方教程

初学五阶魔方 首先,请先看过之前的四阶魔方教学,或者其它类似转法的网页,因为接下来的内容全是建立在魔方的概念上然后加以延伸。同样的,这个教学只介绍能够解出所需最容易的方法,并称不上非常有效率。 1.完成中心 五阶是奇数层,中心是固定的,所以没有四阶中心定位错误的…

JS-15 三元运算符

JavaScript还有一个三元运算符(即该运算符需要三个运算子)?: ,也可以用于逻辑判断。 (条件)?表达式1:表达式2 →布尔表true→表达式1→ →布尔表false→表达式1→ 这个三元运算符可以被视为if...else...的简写形式,因此可以用于多种场合。 1、判断一个整数是奇书与偶数…

RHEL8.10上配置nftables的NAT支持tftp服务

日期:2024.12.07 前言:配置pxe启动环境时跨网段的tftp服务器访问不到,记录下排查过程及解决方案。 参照:https://unix.stackexchange.com/questions/579508/iptables-rules-to-forward-tftp-via-nat https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/com…

场景篇

场景篇 设计模式工厂方法模式简单工厂模式工厂方法模式抽象工厂模式总结策略模式总结责任链模式技术场景 单点登录这块怎么实现的总结权限认证是如何实现的总结上传数据的安全性怎么控制总结负责项目的时候遇到哪些棘手问题 给出了四个方向:可以找某一个方向好好进行准备怎么做…

linux 家族debian和CentOS

1、两者的来源 2、两者的区别 debian德班和CentOS是Linux里两个著名的版本。两者的包管理方式不同。 debian安装软件是用apt(apt-get install),而CentOS是用yumdebian下的包扩展名是.deb,CentOS下包扩展名是.rpm debian系列中最出名的是Ubuntu。Ubuntu专注于图形化界面操作,…

DINOv2

(一)data processing 1.1 去重 最开始精选数据集(curated data)+未整理数据池(uncurated data)包含1.2B张图像 copy detection pipeline - "A Self-Supervised Descriptor for Image Copy Detection" 简称方法SSCD,是基于SimCLR的改进 使用SSCD方法对图片抽取…

子查询与嵌套查询

title: 子查询与嵌套查询 date: 2024/12/13 updated: 2024/12/13 author: cmdragon excerpt: 子查询和嵌套查询是关系型数据库中强大的查询工具,允许用户在一个查询的结果中再进行查询。通过使用子查询,用户能够简化复杂的SQL语句,增强查询的灵活性和可读性。本节将探讨子…

JS-14 条件语句之switch

多个if...else连接在一起使用的时候,可以转为使用更方便的switch结构 表达式→值1→语块1→break;→ 表达式→值2→语块1→break;→ 表达式→defalut→默认语块→ switch(fruit){case"banana"://...break;case"apple"://...default://... }需要注意的是…

深入解析 Transformers 框架(五):嵌入(Embedding)机制和 Word2Vec 词嵌入模型实战

本文深入探讨了 Transformers 框架中词嵌入(Token Embeddings)的关键作用和实现细节,展示了将离散符号映射至连续向量空间的过程。通过具体代码示例,我们揭示了 Qwen2.5-1.5B 大模型中嵌入矩阵的工作原理,并演示了如何将文本序列转换为嵌入向量。此外,文章还介绍了经典的…