DDNS 动态域名
家庭宽带大多没有固定公网 IP,运营商隔三差五换一次地址。想从外面稳定访问家里的 NAS 或监控,就需要动态域名(DDNS):一个客户端程序时刻盯着当前公网 IP,变了就自动更新域名解析。本篇讲清 OpenWrt 上 ddns-scripts 的完整配置,以最常见的两家服务商为例。
DDNS 的构成与前提
DDNS 由三部分组成:你拥有的一个域名、提供解析的服务商、以及路由器上负责更新记录的客户端程序。三者缺一不可——没有域名就没法挂 IP,没有服务商 API 客户端就没地方更新。
动手之前必须先确认一件最关键的事:你家宽带到底有没有公网 IPv4。判断方法很直接:登录路由器看 WAN 口地址,再对比用百度搜 IP 显示的地址,两者一致就是公网;如果 WAN 显示的是 100 开头或 10 开头的内网段,说明运营商给你的是大内网,DDNS 对 IPv4 白搭,只能走 IPv6 方案或找运营商申请。确认后还要检查光猫是不是桥接模式——光猫代拨号的话公网 IP 在光猫上,路由器拿到的还是内网地址。
软路由 NAT 类型不熟悉的,先读 公网与内网 相关章节补补课。这些前置条件没弄清就开配,是 DDNS 失败的最大原因。
服务商的选择上多说两句。Cloudflare 适合已有域名并把解析托管过去的用户,DNSPod 适合国内域名场景。还有一些服务商提供免费二级域名,适合零成本入门:注册账号拿到专属子域名,路由器里选对应服务商填令牌即可。免费与付费的核心差别不在功能而在稳定性承诺,长期依赖的关键服务还是建议自有域名加大厂解析。
安装 ddns-scripts
opkg update
opkg install ddns-scripts luci-app-ddns ddns-scripts-services
如果用的是 Cloudflare,再装 ddns-scripts-cloudflare;DNSPod 用户装对应的 dnspod 脚本。安装后 LuCI 里出现 Services → Dynamic DNS 页面。
配置 ddns-scripts 说不难也不难,关键是每个字段含义清楚。以 Cloudflare 为例,官方推荐使用 API Token 而不是 Global API Key——后者意味着完整的账号权限,风险不可控。先在服务商后台创建一个只给该域名 DNS 编辑权限的 Token,然后按下面翻译对照填写。DNSPod 等国内服务商的字段类似,把 Bearer 换成服务商给的 ID、密码换成 Token 即可。

| 界面字段 | 填什么 | 说明 |
|---|---|---|
| 服务提供商 | cloudflare.com-v4 | 脚本名称 |
| 查询主机名 | home.example.com | 要更新的完整域名 |
| 域名 | home@example.com | 用 @ 分隔子域与主域 |
| 用户名 | Bearer | 固定写法 |
| 密码 | 你的 API Token | 只给 DNS 编辑权限 |
| 接口 | wan(IPv6 选 wan6) | IP 来源接口 |
| 使用 HTTPS | 打勾 | 传输加密 |
| CA 证书路径 | /etc/ssl/certs | 校验证书 |
命令行写法完全等价:
uci set ddns.cloudflare=service
uci set ddns.cloudflare.service_name='cloudflare.com-v4'
uci set ddns.cloudflare.domain='home@example.com'
uci set ddns.cloudflare.username='Bearer'
uci set ddns.cloudflare.password='你的Token'
uci set ddns.cloudflare.interface='wan'
uci set ddns.cloudflare.use_https='1'
uci set ddns.cloudflare.cacert='/etc/ssl/certs'
uci set ddns.cloudflare.enabled='1'
uci commit ddns
/etc/init.d/ddns enable
/etc/init.d/ddns restart
注意域名格式是服务商约定的特殊写法:@ 符号前面是主机名、后面是主域名,根域名直接写 example.com 即可。另外更新前必须先在服务商后台手动建好这条 A 记录,DDNS 只会更新已有记录,不能凭空创建。
运行验证与排障
启用后等一两分钟,然后在设备上验证:
nslookup home.example.com
解析出的 IP 和你路由器 WAN 口当前地址一致,DDNS 链路就通了。实际使用中你会发现,IP 换了一般不用等太久——ddns-scripts 有定时检查机制,配置里的 检查间隔 默认合理即可,改太频繁只会增加服务商 API 调用负担。
常见问题按这张表对照排查。
日志永远是第一信息源:LuCI 里点进对应 DDNS 配置的 日志 标签,或者命令行 logread | grep ddns,绝大多数失败原因都写得明明白白。养成先看日志再改配置的习惯,比猜着试快得多。日志里如果出现大量超时重试,先检查路由器到服务商 API 的连通性,而不是急着改配置。
验证解析正常只是第一步,长期运行还要纳入日常巡检:定期看一眼日志里有没有持续的更新失败记录,确认域名始终指向正确 IP。路由器重启后 DDNS 服务会随之自启,极少数情况下进程没起来,手动执行一次 restart 即可。远程修复的前提是你还能连进路由器,远程访问通道本身的可靠性规划见 远程运维通道 一篇。

| 现象 | 原因 |
|---|---|
| 日志显示 token 鉴权失败 | Token 权限不够或用户名没写 Bearer |
| 解析 IP 是旧地址 | 检查间隔未到,或 IP 未变化未触发更新 |
| 域名更新失败记录不存在 | 后台没先建好该 A 记录 |
| IPv6 地址不更新 | 没选 wan6 或没开 use_ipv6 |
| 解析正常但外网访问不了 | 防火墙或端口转发没配 |
最后一行是最容易被忽略的环节:DDNS 只解决找到你家的问题,数据包能不能进门还要看防火墙放行。家中的具体服务(NAS 管理界面、监控画面)还要配置端口转发或 IPv6 放行规则,见《防火墙进阶与端口转发》。另外 IPv6 环境下可以给每台设备单独配 AAAA 记录,配合 DDNS 泛域名实践,一套规则覆盖全家设备。
安全加固清单
DDNS 把你家暴露在了公网上,配套安全措施一个都不能少。第一,API Token 权限最小化——只给目标域名的 DNS 编辑权限,绝不用 Global Key,Token 泄漏的损失可控。第二,管理界面加额外防护:NAS、路由器后台这类对外服务,务必改默认端口、设强密码、限制登录失败次数。第三,端口转发的规则逐条审查:能不给的权限一律不给,用不上的服务宁可关掉。第四,HTTPS 一定开:ddns-scripts 的通信全程加密,Token 不会在传输中泄漏——同时 CA 证书路径要填对,否则校验失败会报很迷惑的错误。
这套清单和 公网服务安全实践 讲的外网暴露面管理是一回事,DDNS 只是入口暴露的第一步,后面每一层服务都要自己负责安全。发布前过一遍清单的习惯,比出事后救火省力太多。
IPv6 与多服务商进阶
IPv6 是家庭 DDNS 的另一片战场,甚至比 IPv4 更值得投入:只要运营商下发了前缀,每台内网设备都有公网地址,不用端口转发就能直接被外网访问。给 wan6 接口单独建一条 DDNS 配置更新 AAAA 记录,填好 use_ipv6 选项即可。注意 IPv4 和 IPv6 必须拆成两条服务分别配置,接口一个选 wan、一个选 wan6。
如果你的域名同时被多台设备使用,还可以研究泛域名解析:只更新 *.example.com 这一条记录,所有子域名都指向当前 IP,比给每台设备各配一条 DDNS 管理起来省事得多。IPv6 前缀变化后所有子域名跟着变,客户端配合本地直连即可。
少数场景会用到多家服务商同时更新(比如一个域名解析、一个备用),ddns-scripts 支持定义多个服务段,各自独立运行互不干扰。服务商脚本的实现细节可以去 ddns-scripts 的 GitHub 仓库查 sample_config,每个服务商的字段写法都标准透明。选购域名时留意:有些域名注册商的续费价格和首次价格差很多,长期持有的成本要提前算清。

延伸阅读
- 《IPv6 通与内网访问》:IPv6 前 DDNS 的替代方案,配合使用效果更好。
- 《防火墙进阶与端口转发》:DDNS 之后的另一半工作,让外网请求真正到达内网设备。
- 《AdGuard Home 广告过滤》:DNS 体系的另一块拼图。
