前言
前两天我的群晖 NAS 提示 DSM 有新版本更新。由于已经好久没更新,一瞄发行说明发现新 feature 和 bugfix 还挺多,想着时间也不短了,那就顺手更一下吧。
系统更新得倒是很顺利,更新后啥异常也没发现,内网/外网访问都正常,我也就没再管。
直到昨晚事情才开始不对:我突然发现通过 DDNS 完全无法访问 NAS 上的任何应用。不过当时家里网络卡得要命,我也没太当回事,只以为是网络抽风。
但今天一早起来网络速度恢复,可域名依然不通,这时候我才知道绝对不是网络速度的问题了,这才开始正式排查。
排查链路复盘
下面是我这次遇到问题后的完整排查过程。一方面是给可能遇到同样坑的朋友提供一个参考思路,另一方面也是给自己做个记录,方便以后再遇到类似情况时能更快定位问题。
1. 先确认 NAS 服务本身是否正常
第一步很简单: 通过内网 IP 访问 NAS,一切正常,系统服务都在。
2. 再确认公网访问是否正常
用家里的 公网 IP 直连 NAS 暴露出去的端口,能通。说明 ISP 没问题,端口也没被封。
3. 检查群晖 DSM 自带的 DDNS 状态
打开 控制面板 → 外部访问 → DDNS。
果然看到 DDNS 状态一直卡在 "正在连接..." , 点"测试连接",转半天圈,最后报 连接超时。
至此基本确认问题出在 DDNS。
4. 怀疑是否是 NAS 上的代理导致的问题
我之前遇到过: 只要开了系统代理 → 重启 NAS → 自定义 DDNS 会无法连接,
必须是:
- 先连上 DDNS
- 再手动开启系统代理
这很奇怪,但确实存在这个问题,我也一直没有去解决,所以这次我也先排查了一遍代理设置,结果发现代理是关闭的,这条可能性排除了。
5. 怀疑 Cloudflare 又宕机?
突然想起前两天 Cloudflare 宕机,难不成又宕机了?
我登录 CF 控制台看了眼,没有任何告警。为了确认,我还顺手访问了几个托管在 Vercel、经过 Cloudflare 的服务,一切正常,说明 Cloudflare 没锅。
6. 终于把怀疑对象指向 DSM 更新
这时我不禁想起了福尔摩斯法则:
"当你排除了所有不可能的,剩下的即使再离谱,也必然是真相。"
我先是在 Nas 上添加 DDNS 的地方看了一下服务提供商,果然,没有之前自定义的 Cloudflare 了。
我回忆了一下,群晖默认不支持 Cloudflare DDNS,需要自己手动部署第三方脚本,比如很多玩家都用的 SynologyCloudflareDDNS。
但我这是两三年前配置的了,早忘得干干净净,只记得当时是用 SSH 登进去扔了些脚本、改了 ddns_provider 配置,我只好去网上重新查教程。
7. 转折:ddns_provider 配置"消失了"
网上的做法都差不多,我也照着检查了一下 NAS 的 /etc/ddns_provider.conf。
结果一打开就发现:我之前手动添加的 Cloudflare provider 配置彻底没了。
八成是这次 DSM 更新覆盖了系统文件,把自定义的 DDNS provider 给清干净了。
于是我把缺失的配置重新补上、保存,然后再回到 DSM 的 DDNS 界面一看,果然有变化: 列表里多出了一个"访问 DDNS 供应商的网站"的按钮。
这说明新增的 provider 已成功加载(因为在 ddns_provider.conf 里设置 website 字段后,DSM 会自动在面板中显示这个入口)。

再测试连接,结果:还是失败。
8. 再一查:原先放在 /sbin 的脚本也没了
我继续顺着配置里引用的脚本路径查下去(就是 SynologyCloudflareDDNS 的核心脚本)。
结果:指定路径下根本没有脚本! 我甚至怀疑是不是我之前放在其他地方了,于是全盘搜索了一遍。
找不到,根本找不到,基本可以确认整个 /sbin 目录都被更新重置了。
至此终于搞清楚问题根因:
DSM 更新时覆盖了系统目录,导致自定义 DDNS Provider 配置 + 脚本全部消失。
9. 修复:重新上传脚本 + 重新配置 provider
我重新下载脚本,上传到 /sbin,给可执行权限,再更新 ddns_provider 配置。
测试连接,这次成功了,DDNS 恢复正常!
10. 为什么前两天还能用?
现在回头一想,为什么更新当天没问题?
很简单:因为我的公网 IP 那几天没变。 DDNS 虽然挂了,但只要 Cloudflare 上的 DNS A 记录还指向老 IP,访问就不会出问题。
直到昨天公网 IP 有一点点变动(可能只差一两位),我登陆 CF 又没仔细看 A 记录,这才导致域名完全失效。
总结
这次问题的根因其实非常隐蔽:
- DSM 更新 → 覆盖系统目录
- 自定义 DDNS Provider 配置被删
/sbin下的 Cloudflare 更新脚本也清空- 但因为公网 IP 没变,所以问题延后了两天才暴露
- 最后一度误以为是 Cloudflare、代理或网络的问题
最终的解决办法就是:重新放回脚本 + 重写 ddns_provider.conf。