DDNS 实战:域名解析与动态 IP 应对
家用宽带的公网 IP 是动态的,重拨一次变一次,域名解析必须跟着更新——这就是 DDNS(动态域名解析)要解决的事。这一篇从「为什么需要域名」讲到「DDNS 在群晖和路由器上的两种落地方式」,最后给出一个脚本化的兜底方案。
为什么需要域名:IP 会变,名字不变
直接用 IP 访问家里的服务,理论可行但有两个致命伤:一是 IP 动态变化,隔天连不上还得重新查 IP;二是 IP 串难记、无法配 HTTPS 证书(证书签发给域名而不是裸 IP)。所以第一步永远是:拥有一个自己的域名。
域名购买渠道:国内注册商(阿里云、腾讯云等)购买,.cn/.com 均可;或海外注册商。注意:域名用于国内解析需要完成实名认证;若域名要指向国内服务器并提供 Web 服务,还涉及备案,家庭 DDNS 通常只指向家用宽带用于个人访问,不涉及对外网站服务,一般无需备案,具体以注册商与接入商规则为准。价格一年十几元起,是一次性投入最小的家庭网络组件。
DDNS 的原理与获取 IP 的两条路
DDNS 做的事情可以浓缩为一个循环:
定时(每几分钟)→ 查询当前公网 IP → 与域名解析记录比对
→ 不一致则调用域名商 API 更新解析 → 一致则跳过
关键在第一步「查询当前公网 IP」,两种来源:
- 从路由器 WAN 口读:最准确,桥接后公网 IP 就挂在 WAN 口上;
- 从外部服务探测:访问返回本机公网 IP 的查询服务。注意在运营商 NAT(无公网 IP)下探测到的是出口 IP,改它没有意义——没有公网 IP 时 DDNS 无解,请回到组网或穿透方案。
落地方式一:群晖内置 DDNS
群晖控制面板已内置:控制面板 → 外部访问 → DDNS → 新增。流程:
- 服务商下拉框选择你的域名商(DSM 内置了多家,清单随版本变化,以实际列表为准;若你的服务商不在列表中,走方式二或脚本方案);
- 填入域名(如
nas.example.com)、用户名/密钥(多数服务商使用 API 专用 Token 而非登录密码,权限按最小化原则开解析记录的读写); - 测试连接,通过后启用。群晖会周期性检查并自动更新。
同时在外部访问页确认「路由器配置」:如使用端口映射,这里还能自动同步路由器规则(部分路由器支持 UPnP/NAT-PMP 配合)。
落地方式二:路由器或第三方脚本
OpenWrt 玩家的标准做法:用 ddns-scripts 套件(LuCI → 系统 → 动态 DNS),支持主流服务商,填域名、凭据、更新周期即可,插件篇的安装方法通用。
更通用的兜底是脚本 + 计划任务:域名商都提供解析管理 API,一个几十行的脚本就能完成「查 IP → 调 API 改记录」。以腾讯云 DNSPod 的 API 为例的伪代码思路:
#!/bin/sh
# 思路示例:各服务商 API 参数以其官方文档为准
CURRENT=$(curl -s http://members.3322.org/dyndns/getip) # 查询公网 IP
LAST=$(cat /tmp/lastip)
if [ "$CURRENT" != "$LAST" ]; then
# 调用域名商 API 修改 A 记录为 $CURRENT(示例中省略鉴权细节)
update_record "$CURRENT"
echo "$CURRENT" > /tmp/lastip
fi
把它放进 cron 每 5 分钟跑一次即可。这个方案的灵活之处:一条宽带可以同时维护多个子域名(nas.xxx.com、home.xxx.com 指向同 IP),也能在脚本里顺带检测 IP 变化并推送通知。
验证与排障
配置完的验证清单:
- 在外网环境(手机关 Wi-Fi 用流量)
ping nas.example.com,返回的应是你家的公网 IP; - 解析生效但连不上服务?那是端口映射/防火墙的问题,不是 DDNS 的问题(见下一篇);
- IP 变更后几分钟内未更新?查脚本的执行日志与 API 返回码(常见是 Token 失效或请求频率超限)。
TTL 提示:解析记录的 TTL(缓存时长)建议设为 600 秒(10 分钟)或更低,IP 变化时全网生效更快;过小的 TTL 会增加 DNS 查询量,家庭场景 600 秒是常用折中。
IPv6 时代的 DDNS
国内运营商的 IPv6 已经大规模普及,家庭宽带的 IPv6 地址通常是公网可达的——这给无公网 IPv4 的家庭提供了第二条路。IPv6 场景的 DDNS 与 IPv4 的差别:
- 记录类型不同:IPv4 用 A 记录,IPv6 用 AAAA 记录,DDNS 客户端需支持更新 AAAA;
- 地址来源不同:IPv6 下每台设备可能有独立公网地址(无状态自动配置),NAS 可以直接持有自己的全球地址;也可以仍走前缀 + 后缀的形式,前缀变化时全部设备跟着变;
- 防火墙语义变化:IPv6 下没有 NAT 转发了,「端口映射」变成「防火墙放行」,在路由器防火墙里对指定内网地址放行指定端口即可,语义更干净;
- 终端支持:访问端(手机流量、外部网络)也需要有 IPv6 网络,否则回退 IPv4——这也是为什么 IPv6 通路要和 IPv4 方案并存,而不是替代。
实践建议:域名同时维护 A 与 AAAA 两条记录(分别指向 IPv4 与 IPv6 地址),访问端自动择优。群晖与主流 DDNS 客户端对新协议的支持随版本演进,具体配置项以你所用版本与 服务商文档 为准。
多域名规划:一条宽带,多个入口
随着服务变多,建议一开始就把域名的层级规划好,避免日后所有服务挤在一个域名下:
example.com # 主域(可选,放个说明页或不解析)
├── nas.example.com # NAS 管理入口(只给组网/VPN 用,不解析到公网)
├── media.example.com # 影音服务(frp 或映射,确需对外时启用)
└── home.example.com # 通用入口(端口映射的服务)
规划的三个原则:管理入口与对外服务分开(管理域名永不指向公网,只在组网内解析);子域按服务划分(将来要给某个服务单独换通道、单独加证书都方便);废弃子域及时删解析(解析记录也是暴露面清单的一部分,DDNS 篇与端口篇的纪律一脉相承)。
自动化补强:变更通知
DDNS 脚本方案还能顺手做一件事:IP 变化时推送通知。在脚本更新解析成功后,追加一条通知(群晖的邮件/消息推送、企业微信机器人、或其他你习惯的通道),内容带上新 IP 与时间。
价值在于「知道自己被断线重连了」:频繁变化可能是线路故障的征兆;深夜突然变化而你没有操作,则值得查一下光猫是否被人重置。家庭运维的精髓之一就是让系统在你需要知道的时候主动说话,而不是每次都靠你去查。
快问快答
Q:免费域名(如 DuckDNS 一类)能用吗? 能用,个人使用没问题;缺点是域名是二级域、服务商稳定性参差。严肃使用建议买个自己的顶级域名,一年十几元买个「长期资产」。
Q:域名商和 DNS 服务商是一回事吗? 不是。域名在注册商买,解析可以托管在任何 DNS 服务商(如 DNSPod、Cloudflare)。DDNS 更新的是 DNS 服务商的记录,所以 API 凭据来自 DNS 服务商,别搞混对象。
Q:群晖 DDNS 更新失败一直报错怎么办? 三个常见原因:凭据错误(注意服务商要的是 API Token 不是登录密码)、域名填错(要填完整子域)、服务商接口变更(内置服务商清单可能滞后)。排不出来就换脚本方案。
Q:路由器和 NAS 都支持 DDNS,用哪个? 用一个就行,且只开一个。习惯上「谁常开用谁」:NAS 24 小时开着就用 NAS;若 NAS 会定期关机(如宿舍场景)就用路由器。
新手常见误区
- 「配了 DDNS 就能访问 NAS 了。」 DDNS 只解决「域名 → 我家 IP」,进门还要靠端口映射、穿透或组网,它只是门牌,不是门。
- 「没有公网 IP 也能用 DDNS。」 探测到的只是运营商出口 IP,改解析毫无意义。先按第一章方法确认公网 IP,再谈 DDNS。
- 「在 NAS 和路由器上同时开 DDNS。」 两边都更新同一条记录,容易出现解析打架。一条记录指定一个更新者。
- 「把管理后台的域名随便发给别人。」 域名解析是公开可查的,任何拿到域名的人都可能尝试扫描你的端口。暴露面管理见下一篇与安全加固篇。
域名与解析就绪,下一篇谈真正开门的动作:端口映射,以及哪些端口绝对不能开。
本章由 WorkBuddy 原创整理,关键参数以官方文档为准。
