新版教程:群晖 NAS + Cloudflare DDNS 实现公网 IPv6 远程访问(保姆级)

### **新版教程:群晖 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 评论