家庭网络
家庭网络动态域名解析 DDNS 实战:用 Cloudflare/DNSPod API 自动同步公网 IP 与 IPv6 地址
2026年11月6日
用 Cloudflare/DNSPod API 编写动态解析脚本,让家用服务域名随 IP 自动更新。
家庭网络动态域名解析 DDNS 实战:用 Cloudflare/DNSPod API 自动同步公网 IP 与 IPv6 地址
摘要:家庭宽带的公网 IPv4 每隔几天就会变一次,IPv6 前缀更是随重拨刷新。本文手把手教你用 Cloudflare 与 DNSPod 的官方 API 编写动态解析脚本,让家里的 NAS、摄像头和管理后台始终有一个稳定可达的域名。
一、为什么家庭宽带离不开 DDNS
绝大多数家庭宽带分配的是动态公网 IP:电信/联通的 IPv4 通常在 24–72 小时内重拨一次,地址便会被回收重分;即便开通了 IPv6,运营商下发的 PD(前缀委托)也会随会话刷新,导致设备的 AAAA 记录失效。如果你用 frp、IPv6 直连或反向代理把内网服务暴露到公网,IP 一变,域名就打不开了。
动态域名解析(DDNS)的核心思路是:让家里的一台常驻设备周期性地把"当前公网地址"推送给域名服务商,服务商再更新 DNS 记录。相比 frp 隧道,DDNS 不占用中转带宽,访问延迟更低;相比纯 IPv6 直连,它解决了"地址会变"的根本问题。
二、方案选型:Cloudflare 还是 DNSPod
- Cloudflare:免费、API 完善、支持 IPv4(A) 与 IPv6(AAAA) 同域名双栈,且自带 CDN/SSL,适合想顺手做 HTTPS 和防护的用户。缺点是国内解析速度一般。
- DNSPod(腾讯云):国内解析快、延迟低,对腾讯云服务器和微信生态友好,适合主要面向国内访客的场景。
本文两个都给,你按域名所在平台二选一即可。关键前提:域名要已托管到对应平台(Cloudflare 改 NS、DNSPod 在腾讯云解析),并提前建好一条主机记录(如 home.example.com)留作更新目标。
三、实战一:Cloudflare 自动更新脚本
先在 Cloudflare 后台「My Profile → API Tokens」创建一个仅含 Zone:DNS:Edit 权限的令牌,记下 CF_TOKEN;再拿到区域 ID CF_ZONE_ID 与记录 ID CF_RECORD_ID(调用 Zone DNS Records 列表接口可见)。
#!/usr/bin/env bash
# cloudflare_ddns.sh —— 同时刷新 A 与 AAAA
CF_TOKEN="你的API令牌"
CF_ZONE_ID="你的区域ID"
CF_RECORD_NAME="home.example.com"
IP_V4=$(curl -s https://api.ipify.org)
IP_V6=$(curl -s https://api64.ipify.org)
update() {
local type=$1 rec=$2 ip=$3
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$rec" \
-H "Authorization: Bearer $CF_TOKEN" -H "Content-Type: application/json" \
--data "{\"type\":\"$type\",\"name\":\"$CF_RECORD_NAME\",\"content\":\"$ip\",\"ttl\":60,\"proxied\":false}"
}
# rec_v4 / rec_v6 分别为 A / AAAA 记录 ID
update A "$REC_V4" "$IP_V4"
update AAAA "$REC_V6" "$IP_V6"
注意 proxied:false:穿透回家要走真实 IP,不能开启橙色云代理,否则流量被 CF 挡在门外。
四、实战二:DNSPod(腾讯云)动态解析
DNSPod 使用 Token(SecretId+SecretKey)调用 Record.Modify 接口。下面用官方 tccli 思路简化:
#!/usr/bin/env bash
# dnspod_ddns.sh
DOMAIN="example.com"
SUB="home"
REC_ID="12345678" # 记录ID
NEW_IP=$(curl -s https://api.ipify.org)
tccli dnspod RecordModify --Domain "$DOMAIN" --SubDomain "$SUB" \
--RecordId "$REC_ID" --RecordType "A" --RecordLine "默认" --Value "$NEW_IP"
若不想装 tccli,也可用 curl 直接 POST 到 dnspod api v3 端点,按文档拼 Signature 签名。
五、在 OpenWrt 上定时执行与自愈
把脚本放到软路由 /usr/bin/,赋予执行权限,再用 crontab 每 5 分钟跑一次:
*/5 * * * * /usr/bin/cloudflare_ddns.sh >> /var/log/ddns.log 2>&1
进阶做法:监听 WAN 口 ifup 事件(OpenWrt 的 hotplug),重拨一拿到新 IP 立刻更新,不必死等 5 分钟。同时在脚本里加"IP 未发生变更则跳过请求"的判断,避免无谓地刷 API 触发限流。
六、常见坑与排查清单
- IPv6 前缀半夜变:光猫或路由器重拨会让整段 /64 失效,务必更新 AAAA,而不能只管 A 记录。
- API 令牌权限过大/过小:Cloudflare 令牌只给 DNS:Edit,DNSPod 用子账号密钥,别用全局 Key。
- TTL 设太高:建议 60–300 秒,否则旧 IP 缓存迟迟不刷新。
- HTTPS 证书:穿透回家后用 Let's Encrypt 签证书,CF 上把记录设为
proxied:false否则证书校验失败。 - 双栈不一致:部分网络 IPv4 有公网、IPv6 无,脚本要做好单栈降级,别因取不到 v6 而整段报错。
小结
DDNS 是家庭网络对外暴露服务的地基:一条稳定域名 + 自动同步脚本,配合 IPv6 或端口映射,就能让 NAS、监控、后台随时可达。优先选自己域名所在的平台,脚本务必加"变更才更新"与"重拨即触发"两道保险,再配上短 TTL 与正确权限的 API 令牌,基本可以做到无感切换、永不失联。