家里的Nas,如何远程实时访问?教程来了~

办公技巧 1小时前 4

去年,给大家介绍过在家里或单位安装Nas,用来实现文件存储的共享,还没看过的补课《科普:建议你也这样存放文件》。

有了Nas,在局域网里面存储文件非常方便,但如何才能实现远方的设备也能访问Nas中的文件呢

今天给大家分享2个方法,使用的前提略有不同,效果也大不一样,看看你喜欢哪种。

为什么异地访问Nas难?

为什么家里Nas或单位的Nas,我们离开局域网后就难以访问呢?

主要原因就是因为IPv4地址不够用,现在已经不能实现每家的宽带分配一个IPv4地址了,而是一大片区域共用运营商的同一个对外IPv4地址。藏得太深了,外部根本访问不到。

所以需要想办法把你的Nas暴露在互联网中,才能被异地访问到。

提前准备:域名一个

如果你是用的正版的Nas,一般会自带外部访问功能,会分配二级域名给你,就不需要你再额外准备域名了。

如果你用的是盗版的Nas系统,那么就得自己准备一个域名,最便宜的就行,不需要备案。腾讯云、阿里云都可以,这种10多块钱的,随便注册一个备用。

方法一:利用IPv6直链

前面说了IPv4不够用了,但IPv6就完全没这个问题了。它可以分配给2^128个设备,可以给地球上的每个沙子都分配一个IPv6地址。

IPv6支持给你家(单位)内部每个设备都分配一个地址,并不是一条宽带只有一个入口地址。

所以,如果你的Nas支持IPv6,同时访问的设备也支持IPv6,那简直不要太简单,直接跑满宽带异地访问Nas中文件。

电脑浏览器访问下面网页,确定电脑是支已经支持IPv6,现在一般的家庭宽带都已经支持IPv6,手机流量也早已支持IPv6,但单位的内部网络有些可能还不支持IPv6。

检测地址:www.test-ipv6.com

如果出现上面这样的10/10,就表示已经支持IPv6了。

在Nas的管理界面中,查看Nas是否已经被分配了IPv6地址:

IPv6地址并不是一直不变的,它会发生变化,这个时候域名就派上用场了,我们需要动态地把域名解析到变化的IPv6地址上

本来Nas的后台是支持动态解析的(找DDNS相关字眼),但群晖这边自带的动态解析,居然只支持IPv4,它是不是忘了马上2026年了?

于是,需要用到下面这个bash脚本定时来解析域名指向最新的IPv6地址(需要用dnspod解析域名):

#!/bin/bash

# DNSPod动态DNS更新脚本(IPv6版本)
# 使用方法:配置下面的参数后,添加到NAS的计划任务中定期执行

# ======= 配置区域 ========
# DNSPod API参数
API_ID="你的Dnspod的ID"                      # 替换为你的API ID
API_TOKEN="你的Dnspod的API"          # 替换为你的API Token
DOMAIN="你的域名"                # 你买的那个域名(如bukenglaoshi.com)
SUB_DOMAIN="你想要的二级域名"                    # 子域名(如nas)

# 网络接口配置(根据你的NAS实际情况调整)
NETWORK_INTERFACE="eth0"            # 网络接口名称,可能是eth0、ovs_eth0等

# 日志文件配置
LOG_DIR="./"
LOG_FILE="$LOG_DIR/dnspod_ipv6_ddns.log"
MAX_LOG_SIZE=1024000                # 日志最大大小(字节)

# ======= 脚本开始 ========

# 创建日志目录
mkdir -p "$LOG_DIR"

# 日志函数
log() {
    local now=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$now] $1" >> "$LOG_FILE"
}

# 检查日志大小并轮转
check_log_size() {
    if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -gt $MAX_LOG_SIZE ]; then
        mv "$LOG_FILE" "${LOG_FILE}.old"
    fi
}

# 获取当前IPv6地址(优先获取公网IPv6)
get_current_ipv6() {
    # 尝试获取全局IPv6地址(2开头的公网地址)
    local ipv6=$(ip -6 addr show dev $NETWORK_INTERFACE | awk '/inet6/ && /global/ && !/(::1|fd00::)/ {print $2}' | cut -d'/' -f1 | head -n 1)

    if [ -z "$ipv6" ]; then
        log "错误:无法获取IPv6地址,请检查网络接口配置"
        exit 1
    fi

    echo "$ipv6"
}

# 获取DNSPod当前的记录ID和IP
get_dns_record() {
    local response=$(curl -sX POST "https://dnsapi.cn/Record.List" \
        -d "login_token=$API_ID,$API_TOKEN&format=json&domain=$DOMAIN&sub_domain=$SUB_DOMAIN&record_type=AAAA")

    # 检查API响应是否正常
    local code=$(echo "$response" | jq -r '.status.code')
    if [ "$code" != "1" ]; then
        log "DNSPod API错误: $(echo "$response" | jq -r '.status.message')"
        exit 1
    fi

    # 提取记录ID和IP
    local record_id=$(echo "$response" | jq -r '.records[0].id')
    local record_ip=$(echo "$response" | jq -r '.records[0].value')

    if [ "$record_id" == "null" ]; then
        log "未找到AAAA记录,可能需要创建新记录"
        echo ""
    else
        echo "$record_id $record_ip"
    fi
}

# 更新DNSPod记录
update_dns_record() {
    local record_id=$1
    local new_ip=$2

    local api_url="https://dnsapi.cn/Record.Modify"
    local post_data="login_token=$API_ID,$API_TOKEN&format=json&domain=$DOMAIN&sub_domain=$SUB_DOMAIN&record_type=AAAA&record_line=默认&value=$new_ip"

    if [ -z "$record_id" ]; then
        api_url="https://dnsapi.cn/Record.Create"
        log "尝试创建新的AAAA记录"
    else
        post_data="$post_data&record_id=$record_id"
        log "尝试更新现有AAAA记录 (ID: $record_id)"
    fi

    local response=$(curl -sX POST "$api_url" -d "$post_data")
    local code=$(echo "$response" | jq -r '.status.code')

    if [ "$code" == "1" ]; then
        log "成功更新DNS记录: $SUB_DOMAIN.$DOMAIN -> $new_ip"
    else
        log "DNS更新失败: $(echo "$response" | jq -r '.status.message')"
        exit 1
    fi
}

# 主程序
main() {
    check_log_size
    log "=== 开始DNSPod IPv6 DDNS更新 ==="

    # 获取当前IP和DNS记录
    local current_ip=$(get_current_ipv6)
    local dns_info=$(get_dns_record)
    local record_id=$(echo "$dns_info" | awk '{print $1}')
    local dns_ip=$(echo "$dns_info" | awk '{print $2}')

    log "当前IPv6地址: $current_ip"
    log "DNS记录IP: ${dns_ip:-无}"

    # 比较IP,如有变化则更新
    if [ "$current_ip" != "$dns_ip" ]; then
        log "检测到IP变化,正在更新DNS记录..."
        update_dns_record "$record_id" "$current_ip"
    else
        log "IP地址未变化,无需更新"
    fi

    log "=== 脚本执行完成 ==="
}

# 执行主程序
main

把上面脚本保存为.bash文件,存进Nas的某个目录中。然后添加一条计划任务,每1小时执行一次。

如果一切顺利的话,访问https://你的域名:5001就能看到你Nas的登录界面啦~

先别急,这只是网页版的界面,要想把Nas像磁盘一样挂载,还需要一些设置。

在Nas的套件中心(应用中心)搜索“webdav”,安装上它:

安装好了之后,在你远方的电脑上,在磁盘列表那个界面的空白处点击鼠标右键,选择“添加一个网络位置”,填写网址"https://你的域名",然后登录Nas的账号

Nas就像普通磁盘一样,挂载在你的电脑上啦~

最终存取文件的速度,取决于你两边设备的网速。

方法二:CloudFlare穿透

CloudFlare提供了免费的穿透,可以以它为跳板,实现远程访问Nas;大致的原理是这样的。

登录CloudFlare后,在左边找到“Zero Trust”,点击进去:

在“网络”中找到“连接器”,然后创建一个隧道

选择左边这个“CloudFlared”,后面的项目名字随便输入:

创建完成后,把下面这个复制到记事本中,把最后面这串字符留着备用

接下来需要设置绑定的域名,按我截图中填写即可:

在Nas的套件管理中,搜索“container”,安装这个家伙:

安装好了之后,创建一个项目,按我截图操作:

这是那个.yml文件的源码:

version: "3.8"
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=刚刚叫你复制的那串字符,很长
    restart: unless-stopped
    volumes:
      - /volume3/docker/cloudflare-tunnel:/etc/cloudflared

好了,保存就行了。

正常情况下,你访问绑定的域名,就能直达你的Nas登录界面了,不加端口号。

如果你需要用这种方式来挂载Nas为磁盘,那么在CloudFlare的隧道里面,还要添加一个域名,主要是端口和网页版的后台不同,要对应“Container”中的端口:

总结

用本文的2种方法,你就能直接把远程的Nas挂载到电脑,像普通磁盘那样来使用里面的文件了。

但是访问的速度是大不相同的,CloudFlare节点会走海外,导致速度非常卡,很多地区还根本连不通;而IPv6这边则能实现“秒开”

很早之前就想写这篇文章;最近终于给安排下来了。

结果写的过程中发现越来越难,可能对于新手来说难度还是算大的。本来中间还写了域名解析相关的内容,后来全部删掉了,不然可能更多人会绕进去。

文章中虽然是以群晖为例,但大致的原理是相通的。大家可以先看文章中我画的几个简单的示意图,先简单理解一下大致的逻辑。

在国内也有一些提供穿透的的平台,但大多数是收费的,我根据大家的讨论情况,后续再来补充介绍。

- end -

不坑老师小灶资源(限时开启) ¥ 199