Loading

群晖 docker ZeroTier方案

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,同时由于丢包较低,打洞成功率也有所上升。


教程

注册账号

要使用 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,则表示模块已正确安装。

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/bash

echo `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
fi

else
echo `date -d today +"%Y-%m-%d %T.%N"` " Route is exist. The route info is: "$resultstr
fi

echo `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. 允许移动网络下使用


posted @ 2024-12-13 21:24  LungGiyo  阅读(128)  评论(0编辑  收藏  举报