动态域名解析,刚开始接触觉得比较难懂。家里宽带每次重启公网IP都会变动,远程访问家里电脑或者NAS,每次都要询问当前公网IP,操作很麻烦。用上DDNS之后解决了这个问题。简单来说DDNS是小程序或者路由器自带功能,每隔一段时间检测当前公网IP,一旦IP发生变更,自动修改DNS服务商域名解析记录。只需要记住固定域名,IP变化之后域名始终指向最新地址。
部署之前先要确认一件事,家里宽带是否分配公网IP。电信、联通不少地区默认分配内网IP,100.64开头属于运营商级NAT,这种情况就算配置DDNS,外网依旧无法访问。拨打运营商客服,说明需要监控设备远程访问,大多可以申请更换为公网IP。移动宽带基本不提供公网IP,不用尝试配置。确认拥有公网IP之后继续下一步。

DDNS服务商分为免费、付费两类,差异不算巨大,重点看支持域名后缀和更新接口稳定性。花生壳国内使用量最高,注册赠送二级域名,客户端安装登录自动运行,不用手动调用API。缺点是免费版解析延迟偏高,可能十几分钟完成更新,经常弹出广告引导升级付费版本。No-IP是老牌海外服务商,免费账户每月需要手动确认一次,不确认域名会被回收,忘记操作会导致远程无法访问,误以为配置故障。Dynu和DuckDNS界面简洁没有广告,DuckDNS操作简单,登录获取token,一条URL就完成IP更新,适合自行编写脚本。如果你自有域名托管在Cloudflare或者阿里云DNS,直接调用服务商API更新解析,不用额外注册DDNS服务商,域名也更美观。
路由器内配置DDNS操作最简单。华硕、网件、群晖这类中高端路由器固件内置DDNS客户端,登录后台找到动态DNS或者DDNS菜单,选定服务商,填写账号密码或者token,保存设置即可。部分路由器支持自定义更新URL,填入DuckDNS、Cloudflare更新地址也能正常工作。配置完成在路由器状态页面查看解析IP,对比真实公网IP,两者一致代表配置生效。TP-Link和运营商赠送光猫大多没有这个功能,只能选择软件方案。
软件方案分不同系统。Windows系统安装花生壳客户端或者Dynu客户端,登录后后台常驻,定时检测更新IP。Linux环境ddclient是主流工具,Ubuntu、Debian直接apt安装,配置文件路径/etc/ddclient.conf,填写服务商、域名、账号密码,启动systemd服务。DuckDNS配置更简便,配置crontab定时任务,每五分钟调用一次更新URL,日志记录返回结果,出问题查看日志判断是token错误还是网络故障。群晖NAS自带DDNS配置入口,控制面板找到外部访问,填写服务商信息保存,自动更新解析。群晖绑定自有域名,使用Cloudflare API脚本,网上现成docker镜像,填写环境变量直接运行。
Cloudflare DDNS配置单独说明,使用人数较多。先进入Cloudflare后台创建API Token,权限只分配Zone:DNS:Edit,限定目标域名,不要使用Global API Key,权限范围过大泄露风险高。获取Zone ID,在域名概览页面右下角查看。更新调用PATCH请求,URL拼接Zone ID和记录ID,请求头Authorization Bearer附带token,body写入JSON{"type":"A","name":"sub.example.com","content":"当前IP","ttl":120,"proxied":false}。记录ID可以先调用接口查询获取,也可以用PUT覆盖整条解析记录。脚本逻辑,先获取本机公网IP,和上一次记录比对,IP变化才调用API,不要循环频繁请求,API存在调用频率限制。TTL设置短一些,120秒或者自动,IP变更外网可以更快获取新地址。
更新间隔和TTL很容易混淆。更新间隔代表本地多久检测一次IP变化;TTL是DNS记录在全网缓存保存时长。更新间隔设置太短,例如一分钟一次,服务商判定滥用接口,DuckDNS明确要求最低间隔五分钟。TTL设置过长,例如一小时,IP变更之后,外部缓存没过期,依旧访问旧IP。折中方案更新间隔五分钟,TTL设置两到五分钟,极端情况最多十分钟外网就能访问新IP。
最后讲几个实际部署容易碰到的问题。路由器重启DDNS客户端没有自动启动,IP变更域名依旧指向旧地址,远程访问失败误以为服务故障。处理方案开启DDNS开机自启,路由器确认DDNS功能加入启动项。还有运营商封禁80、443端口,家里搭建Web服务,域名解析正常外网无法访问,不属于DDNS故障,更换端口或者使用内网穿透。IPv6同样支持DDNS,原理一致,只是更新AAAA记录。不少地区IPv6前缀也会变动,和IPv4一样需要动态更新。Cloudflare更新AAAA记录,type修改成AAAA即可。需要留意很多路由器防火墙默认拦截IPv6入站流量,需要手动放行。