去年,给大家介绍过在家里或单位安装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 -