自动化ddns更新需脚本定期获取公网ip并比对缓存,变化时调用dns服务商api更新;推荐dnspod、cloudflare或阿里云,避免rfc 2136;shell脚本轻量实现,支持ipv4/ipv6双栈及多记录。

自动化更新DNS解析记录,核心是让脚本定期获取当前公网IP,比对缓存值,有变化就调用DNS服务商API提交更新。不依赖图形界面、不上传隐私数据、本地闭环执行,才是稳定可靠的方案。
选对DNS服务商并获取认证凭据
主流云厂商都提供HTTP API,无需自建DNS服务器:
- 腾讯云DNSPod:需在控制台「安全设置」中创建SecretId + SecretKey,权限最小化勾选「DNS 解析读写」
- Cloudflare:在「My Profile → API Tokens」生成Token,模板选「Edit zone DNS」,绑定具体域名Zone
-
阿里云云解析DNS:RAM子用户授权
Alidns:UpdateDomainRecord,获取AccessKey ID/Secret
避免使用需TSIG密钥的RFC 2136协议——公共DNS普遍禁用,dnspython发UPDATE请求大概率返回REFUSED。
用Shell脚本实现轻量级DDNS更新
以DNSPod为例,一个无依赖(仅需curl、grep、sed)的脚本结构如下:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 从
http://ifconfig.me/ip或https://api.ipify.org取IPv4;IPv6用ip -6 addr show scope global | grep inet6 | head -n1 | awk '{print $2}' | cut -d'/' -f1 - 读取本地缓存文件(如
./last_ip.txt),与当前IP比对 - 若不同,构造含时间戳、签名、JSON参数的POST请求,调用
https://dnsapi.cn/Record.Modify - 成功则更新缓存文件,写入日志;失败则记录错误码,不覆盖旧IP
Windows用户可用Git Bash或WSL直接运行,无需额外安装Python或jq。
配置定时执行与异常防护
避免高频请求触发限流,也防止IP未变时无效调用:
- 用
crontab -e设为每5分钟执行一次:*/5 * * * * cd /path/to && bash ddns.sh >/dev/null 2>&1 - 脚本开头加
set -e确保任一命令失败即退出,防止脏状态残留 - 所有API请求必须带
User-Agent头(如"User-Agent: ddns-script/1.0"),部分厂商校验此字段 - 记录详细日志,包含时间、旧IP、新IP、API返回状态码,便于排查
400 Bad Request或403 Forbidden
进阶:支持多记录与双栈(IPv4+IPv6)
家庭宽带常同时获得IPv4和IPv6地址,且需分别更新A记录和AAAA记录:
- 脚本内定义两组变量:
RECORD_ID_A="123"和RECORD_ID_AAAA="456" - 分别获取两类IP,调用两次Modify接口(注意DNSPod要求每次只改一条记录)
- IPv6地址提取务必过滤
fe80::/10(链路本地)和fd00::/8(ULA),只留全球单播地址 - 可扩展支持CNAME记录更新(如指向NAS的
nas.example.com),只需把record_type=A改为CNAME并传value=xxx.ddns.net
不复杂但容易忽略。










