群晖docker部署zerotier重启不能连接的自动解决方法

本文参考:

1、《使用Zerotier实现免费内网穿透》https://coffeemilk.blog.youkuaiyun.com/article/details/119360712

2、《解决群晖 docker 安装 zerotier 后重启失效问题》https://post.smzdm.com/p/a4do0e6x/

3、Synology Docker - routing table entries do not survive reboot - #24 by cleverit - Community Support - ZeroTier Discussions

问题:

最近没事,折腾之前买的一个群晖NAS DS918+,使用zerotier部署可在外网访问的个人局域网。zerotier 在docker部署完成后,刚建立的时候可以正常连通。但是使用中发现一个问题,zerotier重启后无法访问,表现为zerotier管理页面显示群晖docker 状态online,docker里通过zerotier-cli listnetworks 查询也可以看到分配的ip,状态ok,但是外网电脑无法访问NAS的IP地址。

解决方案

问题根因是因为缺少一条关键的路由,需要通过命令增加路由:

route add -net 192.168.XXX.0/24 dev ztwdjclgcv

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

 ztwdjclgcv则需要修改为启动docker后的设备序号,按如下方法查询:

启动docker后,在telnet终端上输入命令 ip a, 出来的最后一条信息序号后的字符串即为设备号: 

输入该命令,没有出现异常,那么就可以了。

通过在PC上ping 服务器地址,试试是否可以ping通。

以上只是手动解决了该问题。每次启动NAS后还要手动执行挺麻烦的。我们可以将命令编辑为脚本,并通过群晖的计划任务来运行脚本。

该脚本在NAS启动的时候触发启动,并每60秒检测一次docker是否启动,在docker启动后,自动增加路由后退出。

1、制作脚本:

脚本文本如下,注意以下绿色部分的设备号,和橙色部分的IP,需要根据实际进行修改。

addroute.sh 脚本内容

#!/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!"

可以通过telnet将登录NAS服务器,将脚本放到 /usr/local/路径下。

通过vim命令增加addroute.sh脚本

进入vim编辑界面后,按“i”键,然后拷贝以上脚本,然后按鼠标右键,自动粘贴脚本到编辑器中,然后按“ESC”键,再按“:wq!”保存脚本。

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

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

3、增加计划任务:

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

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

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

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

 

4、测试:

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

查看命令:tail addroute.log 

在PC电脑上ping NAS服务器 是否能够ping通。

如果可以正常运行,可以重启NAS,等几分钟后,再次ping NAS服务器IP地址,能够ping通说明自启动功能生效。

### 安装和配置 ZeroTier One #### 准备工作 为了在 NAS 设备上成功安装并配置 ZeroTier One,需确认设备的操作系统支持 Docker 或者具备相应的包管理工具。对于群晖 NAS 来说,通常通过套件中心来安装应用程序。 #### 下载并安装 ZeroTier One 可以通过 Docker Hub 获取官方发布的 ZeroTier One 镜像,并利用 Docker 进行部署: ```bash docker pull zerotier/zerotier ``` 启动容器时建议指定名称以便管理和后续操作: ```bash docker run -d --name=zerotier-one --net=host --cap-add=NET_ADMIN --restart=unless-stopped zerotier/zerotier ``` 上述命令中的选项解释如下: - `-d` 表示后台运行容器; - `--name=zerotier-one` 给容器命名; - `--net=host` 使用主机网络模式简化端口映射设置; - `--cap-add=NET_ADMIN` 授予必要的权限用于网络接口控制; - `--restart=unless-stopped` 设置重启策略确保服务稳定性; #### 加入或创建虚拟网络 一旦容器正常运作,可通过 ZeroTier 的 Web 控制台或者 CLI 工具加入现有的虚拟网络或是创建新的网络环境[^2]。 执行以下命令获取节点 ID 并将其加入到特定的网络中(替换 `<NETWORK_ID>` 为实际的目标网络标识符): ```bash docker exec -it zerotier-one /bin/bash -c "zerotier-cli join <NETWORK_ID>" ``` #### 网络配置验证 完成以上步骤之后,应该能够看到该 NAS 成功加入了所选的 ZeroTier 虚拟网络。此时可以在其他成员间互相 ping 测试连通性,也可以进一步调整防火墙规则和其他高级参数以满足具体需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值