群晖NAS DSM7.2使用Zerotier自建内网穿透,解决重启不能自动启动问题

一、背景与效果

在小黄鱼买了个二手的DS220+使用快两年了,为了能随时随地使用家里的NAS,折腾了很多的内网穿透方案,最终选定Zerotier作为我的最终方案。使用Zerotier免费注册的账号,能够免费挂25个设备,已经足够我使用;如果有更严格的安全要求和设备数量要求,Zerotier还能自建服务器,非常实用。速度方面,由于采用了UDP的P2P直连,访问NAS速度只受限于自己的宽带上行和NAS的处理器速度,目前家里的宽带能够支持我上传下载接近10M/S的速度,十分够用。

1、常用功能Synology Photos和Synology Drive

NAS上我最常用的是Synology Photos、Synology Drive,用于同步照片和文件自动同步。有了Photos,我和老婆的苹果设备就不需要更多的空间来存储照片,自动同步到家里的NAS,安全性和私密性都有了保障。此外Synology Drive是我最重要的应用,由于自己的工作性质,有许多的资料文件都可以使用它实现多态设备自动同步,包括办公室的PC、笔记本电脑、家里的台式、手机等。

2、常用功能Docker 部署Gitea

除了上面的功能,作为程序员,为了管理自己的私人项目代码,部署了Gitea用于随时随地提交管理代码库。补充说明一下,由于国内你懂的原因,在NAS上使用Docker拉去镜像需要使用魔法或者费力找镜像站。

二、Zerotier部署的坑与解决办法

由于 DSM 7 不允许第三方应用直接使用root权限运行,群晖套件中心的Zerotier就不能用了,网友有使用Docker折腾成功的方案,但是我还是选择了计划任务的方案。
计划任务的方案简单来说就是在群晖控制面板->计划任务中创建一个开机触发任务,执行一个开启Zerotier的脚本,这样每次开机或重启都能自动开启Zerotier进行内网穿透。听起来还是蛮简单的,但实际执行起来就会遇到很多的坑,不过经过一段时间的摸索,还是解决了这些问题,每次断电和计划重启后都能顺利开启zerotier。

1、tun

zerotier的使用需要依赖TUN模块,tun模块是LinLinux内核中的一个虚拟网络设备;一般linux系统内核都支持该模块。关于TUN模块的资料参考
Linux下安装tun模块的详细步骤及注意事项
确保本机已经安装好TUN模块后,在文件路径/usr/local/etc/rc.d/创建脚本tun.sh,用于随时可以启动tun;因为重启主机后tun模块不一定能顺利启动。

#!/bin/sh
insmod /lib/modules/tun.ko

2、重启后的问题及解决方案

断电后重启,有可能tun模块没有启动,或者还没启动成功,这个时候就需要通过脚本检测是否重启成功,等待tun模块启动成功后再启动zerotier。下面的脚本配合上面的脚本就可以完美解决nas重启后zerotier不能正常启动的问题。

#!/bin/bash

scriptdir="$(dirname "$0")"
tun_script="/usr/local/etc/rc.d/tun.sh"  # 开启 TUN 的脚本路径
device="/dev/net/tun"  # TUN 设备路径

# 检查并加载 TUN 模块
function check_and_load_tun() {
    if [ -e "$device" ]; then
        echo "TUN device is already available."
    else
        echo "TUN device not available. Attempting to load TUN module..."
        if [ -x "$tun_script" ]; then
            "$tun_script"
            sleep 2  # 等待设备加载
            if [ -e "$device" ]; then
                echo "TUN module loaded successfully."
            else
                echo "ERROR: Failed to load TUN module. Exiting."
                exit 1
            fi
        else
            echo "ERROR: TUN script ($tun_script) not found or not executable. Exiting."
            exit 1
        fi
    fi
}

# 执行检查和加载 TUN
check_and_load_tun

# 启动 ZeroTier
$scriptdir/zerotier-one -d
if [ $? -ne 0 ]; then
    echo "ERROR: Failed to start zerotier-one."
    exit 1
fi

echo "zerotier-one started successfully."
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容