
### **新版教程:群晖 NAS + Cloudflare DDNS 实现公网 IPv6 远程访问(保姆级)**
#### **前言:为什么需要这篇教程?**
大家好!很多朋友家里都装了群晖 NAS,希望能随时随地访问里面的数据。但如今,公网 IPv4 地址日益稀缺,运营商通常只给我们动态的公网 IPv6 地址。这个地址会变动,直接用它来访问非常不便。
动态 DNS(DDNS)技术就是为了解决这个问题而生的。它可以将一个固定的域名(如 `nas.yourdomain.com`)自动指向你家 NAS 当前的 IPv6 地址。当 IP 地址变化时,DDNS 会自动更新解析记录,确保域名始终可用。
Cloudflare 是全球知名的 CDN 和 DNS 服务商,它不仅提供免费的 DNS 解析,还开放了强大的 API 接口,让我们可以通过脚本自动更新 DNS 记录。本教程将手把手教你如何设置,全程免费,安全可靠!
#### **准备工作:你需要什么?**
在开始之前,请确保你已经拥有以下几样东西:
1. **一台群晖 NAS**:并且已经正确接入你的家庭网络。
2. **一个属于你自己的域名**:比如 `yourdomain.com`。如果没有,可以去阿里云、腾讯云或者国外的 GoDaddy、NameSilo 等平台购买一个,价格不贵。
3. **一个 Cloudflare 免费账户**:直接去 Cloudflare 官网 [https://www.cloudflare.com](https://) 注册即可。
4. **家庭网络已开启 IPv6**:你可以访问[http://test-ipv6.com](https://)来检测你的电脑或手机是否获取到了 IPv6 地址。如果得分是 10/10,那就说明你的网络环境支持 IPv6。
#### **第一步:将你的域名交给 Cloudflare 解析**
为了能通过 API 控制你的域名,你需要将域名的 DNS 服务器(NS 记录)修改为 Cloudflare 的服务器。
1. **登录 Cloudflare**,点击 “添加站点”,输入你的域名(例如 `yourdomain.com`),然后选择免费计划。
2. Cloudflare 会自动扫描你现有的 DNS 记录。你只需确认无误,然后点击继续。
3. 最关键的一步!Cloudflare 会给你提供两个 DNS 服务器地址。你需要**回到你的域名注册商**(比如阿里云),找到域名管理后台的 DNS 修改功能,将默认的 DNS 服务器地址**替换成 Cloudflare 提供的那两个**。
4. 修改完成后,回到 Cloudflare 点击 “完成,检查名称服务器”。DNS 生效需要一些时间,从几分钟到几小时不等,请耐心等待。当 Cloudflare 显示你的站点已激活时,就说明第一步成功了!
(这是一个示例图片,请根据你的注册商界面操作)
#### **第二步:在 Cloudflare 创建 API 令牌(更安全的方式)**
原教程中使用了全局 API 密钥,这个密钥权限太高,一旦泄露,别人可以控制你账户下的所有域名。我们这里采用更安全的 **API 令牌(API Token)**,它只拥有我们授予的特定权限。
1. 在 Cloudflare 仪表板右上角,点击你的头像,选择 “我的个人资料”。
2. 在左侧菜单栏找到 “API 令牌”,然后点击 “创建令牌”。
3. 在 “API 令牌模板” 中找到 “编辑区域 DNS”,点击 “使用模板”。
(示例图)
4. **配置令牌权限**,这是最重要的一步:
* **名称**:给你的令牌起个名字,比如 `Synology DDNS Update`。
* **权限**:保持默认的 `区域` - `DNS` - `编辑` 即可。这表示该令牌只能编辑 DNS 记录。
* **区域资源**:选择 `特定区域`,然后在下拉菜单中选择你**刚刚添加的那个域名**。
* 其他设置保持默认即可。
5. 点击 “继续以显示摘要”,确认信息无误后,点击 “创建令牌”。
6. **立即复制并保存好生成的 API 令牌!** 这个令牌只会显示一次,关掉页面就再也找不回来了。如果弄丢了,只能重新创建一个。
#### **第三步:获取你的区域 ID (Zone ID)**
每个域名在 Cloudflare 中都有一个唯一的“身份证号”,就是区域 ID。我们的脚本需要用它来告诉 Cloudflare 要操作哪个域名。
1. 回到你的 Cloudflare 仪表板主页,点击你的域名。
2. 在右侧的 “API” 部分,你会看到 “**区域 ID**”。点击旁边的 “**单击以复制**” 并保存好它。
#### **第四步:在群晖上创建并配置 DDNS 脚本**
现在,我们要把核心的 DDNS 更新脚本放到群晖 NAS 上。
1. **登录你的群晖 DSM 桌面**。
2. 打开 **File Station**,在任意一个你方便管理的位置(比如 `docker` 共享文件夹下)创建一个新的子文件夹,命名为 `scripts`。
3. 进入 `scripts` 文件夹,点击 “新增” -> “新增文件”,创建一个空白文件,并将其重命名为 `cloudflare_ddns.sh`。
4. 右键点击 `cloudflare_ddns.sh` 文件,选择 “用文本编辑器打开”。
5. 将下面的**完整脚本代码**复制并粘贴到文本编辑器中。
```bash
#!/bin/bash
# --- 请根据你的信息修改以下变量 ---
# Cloudflare API 令牌 (在第二步获取)
CF_API_TOKEN="这里替换成你的API令牌"
# Cloudflare 区域 ID (在第三步获取)
CF_ZONE_ID="这里替换成你的区域ID"
# 你想用于 DDNS 的完整域名 (例如: nas.yourdomain.com)
# 注意:这个 AAAA 记录需要你先在 Cloudflare DNS 设置中手动创建一次,IP 地址随便填,比如 ::1
DNS_RECORD="nas.yourdomain.com"
# 日志文件存放路径,建议放在脚本同目录下,方便查看
LOG_FILE="/var/services/homes/你的用户名/scripts/cloudflare_ddns.log"
# 注意:请将“你的用户名”替换成你的群晖登录用户名,并确保路径正确!
# 或者直接使用绝对路径,例如:LOG_FILE="/volume1/docker/scripts/cloudflare_ddns.log"
# --- 脚本核心逻辑,以下部分通常无需修改 ---
# 函数:记录日志
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 1. 获取公网 IPv6 地址
# 我们尝试多个命令来提高成功率,优先使用 `ip -6 addr`
ipv6_address=$(ip -6 addr show scope global | grep -oP '(?<=inet6\s)[\da-f:]+' | head -n 1)
# 如果上面的命令没获取到,尝试用 `ifconfig`
if [ -z "$ipv6_address" ]; then
ipv6_address=$(ifconfig | grep 'inet6' | grep 'Scope:Global' | awk '{print $2}' | head -n 1)
fi
# 检查是否成功获取 IPv6 地址
if [ -z "$ipv6_address" ]; then
log "错误:未能获取到公网 IPv6 地址。"
exit 1
fi
log "获取到当前公网 IPv6 地址: $ipv6_address"
# 2. 从 Cloudflare API 获取当前 DNS 记录的 IP
# 使用 -s 静默模式, -X GET 请求
api_response=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records?type=AAAA&name=${DNS_RECORD}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json")
# 检查 API 请求是否成功
if ! echo "$api_response" | grep -q '"success":true'; then
log "错误:从 Cloudflare API 获取 DNS 记录失败。响应: $api_response"
exit 1
fi
# 解析 JSON,获取旧的 IP 和记录 ID
old_ip=$(echo "$api_response" | grep -oP '(?<="content":")[^"]*' | head -n 1)
record_id=$(echo "$api_response" | grep -oP '(?<="id":")[^"]*' | head -n 1)
# 检查是否成功获取到记录 ID
if [ -z "$record_id" ]; then
log "错误:未能在 Cloudflare 上找到域名 ${DNS_RECORD} 的 AAAA 记录。"
log "请先去 Cloudflare DNS 设置页面手动添加一个,IP 地址可随意填写(如 ::1)。"
exit 1
fi
log "Cloudflare 上记录的旧 IP 地址为: $old_ip"
# 3. 比较 IP 地址并决定是否更新
if [ "$ipv6_address" == "$old_ip" ]; then
log "IP 地址未变化,无需更新。"
exit 0
else
log "IP 地址已变化,准备更新 DNS 记录..."
# 4. 调用 API 更新 DNS 记录
update_response=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${record_id}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"AAAA\",\"name\":\"${DNS_RECORD}\",\"content\":\"${ipv6_address}\",\"ttl\":120,\"proxied\":false}")
# 5. 检查更新结果
if echo "$update_response" | grep -q '"success":true'; then
log "成功!DNS 记录已更新为: $ipv6_address"
exit 0
else
log "失败!更新 DNS 记录时出错。响应: $update_response"
exit 1
fi
fi
```
6. **非常重要:修改脚本中的变量!**
* `CF_API_TOKEN`: 替换成你在第二步保存的 API 令牌。
* `CF_ZONE_ID`: 替换成你在第三步保存的区域 ID。
* `DNS_RECORD`: 替换成你规划好的、用于访问 NAS 的完整域名,例如 `nas.yourdomain.com` 或 `synology.yourdomain.com`。
* `LOG_FILE`: 这是一个记录脚本运行情况的文件,强烈建议配置好!将路径修改为你实际存放日志文件的位置。例如,如果你的脚本放在 `/volume1/docker/scripts/` 目录下,那么日志文件路径可以设置为 `/volume1/docker/scripts/cloudflare_ddns.log`。**确保这个路径对你的用户是可写的!**
7. **首次手动添加 DNS 记录**
脚本的逻辑是“更新”一个已存在的记录。因此,你需要**先去 Cloudflare 的 DNS 管理页面,手动添加一个 AAAA 类型的记录**。
* **类型**: `AAAA`
* **名称**: 填你规划的子域名 (如 `nas`)
* **IPv6 地址**: 随便填一个合法的 IPv6 地址,比如 `::1`
* **代理状态**: **务必关闭**(点击橙色云朵,让它变成灰色)。
* **TTL**: 自动或 2 分钟。
8. 保存并关闭文本编辑器。
#### **第五步:设置定时任务,让脚本自动运行**
为了让 NAS 定期检查并更新 IP,我们需要在群晖的“控制面板”中创建一个计划任务。
1. 打开群晖的 **控制面板** -> **任务计划**。
2. 点击 “新增” -> “计划的任务” -> “用户定义的脚本”。
3. 在“常规”标签页中:
* **任务名称**:填写一个你能看懂的名字,如 `Cloudflare DDNS 更新`。
* **用户账号**:选择 `root`。使用 root 权限可以避免很多不必要的权限问题。
4. 在“计划”标签页中:
* **运行频率**:选择“每天运行”。
* **频率**:设置为“每 5 分钟”一次。这个频率足够了,过于频繁没有意义。
5. 在“任务设置”标签页中:
* **用户定义的脚本**:在文本框中输入运行脚本的命令。格式为 `bash /脚本的绝对路径`。
* 例如,如果你的脚本存放在 `/volume1/docker/scripts/cloudflare_ddns.sh`,那么这里就填写:
```
bash /volume1/docker/scripts/cloudflare_ddns.sh
```
6. 点击“确定”保存任务。
#### **第六步:测试与验证**
1. 在任务计划列表中,找到你刚刚创建的任务,选中它,然后点击上方的“**运行**”按钮,手动执行一次。
2. 稍等几秒钟,然后去你设置的日志文件路径(例如 `/volume1/docker/scripts/cloudflare_ddns.log`)下查看日志文件。
* 如果日志显示 `成功!DNS 记录已更新为: ...`,恭喜你,配置成功了!
* 如果日志显示错误信息,请根据错误提示检查你的 API 令牌、区域 ID、域名等信息是否填写正确。
3. 你也可以登录 Cloudflare 网站,查看你的那条 AAAA 记录的 IP 地址是否已经变成了你 NAS 的公网 IPv6 地址。
4. 最后,在**连接着蜂窝网络(或另一个 WiFi)的手机或电脑上**,尝试 `ping 你的域名` (例如 `ping nas.yourdomain.com`),看看是否能 ping 通。如果能,就大功告成了!现在你可以通过 `http://[你的域名]:端口号` 的方式来访问你的 NAS 服务了(注意 IPv6 地址需要用方括号括起来)。
---
这篇全新版本的教程希望能帮助到每一位想折腾 NAS 的朋友。相比原文,它采用了更安全的 API 令牌,提供了更健壮和注释更详细的脚本,并把每一步都解释得更加清晰。祝你玩得开心!
0 评论