ddns-go怎么用?NAS上一个Docker容器搞定动态域名,IPv6前缀换了也能追上

出门想连家里NAS,客户端转了半天圈,登上路由器一看,公网IP又换了。域名解析里躺着的还是三天前的旧地址。这事儿我家去年就折腾过一轮,当时靠路由器自带的DDNS顶了下去,详情在路由器DDNS那篇里写过。但今年我把域名换成了自己在阿里云买的,路由器那点家底就不够使了,最后是NAS上的一个Docker容器把这事儿包圆的,叫ddns-go。
路由器自带的DDNS,卡住我的三道坎
我家AX3000T的31.1后台里,高级设置下面确实有个DDNS页面,能选的服务商就四家:花生壳、公云3322、DynDNS、No-IP。第一道坎在这——我的域名是在阿里云注册的,想把它解析到家里IP,这四家一家都不认。路由器自带的DDNS走的基本是「送你一个二级域名」的路数,比如xxx.oray.com这种,自己的域名插不进去。
第二道坎是No-IP的规矩。免费版每30天得手动登一次网页点确认,漏了一次域名就给你删了。我有回出差四十天回来,解析早没了,愣是重新配了一遍。第三道坎在表弟家的群晖上。群晖控制面板里那套自带DDNS,配IPv4没问题,但域名服务商列表里压根没有AAAA记录的完整支持,他家的IPv6直连方案就卡在这——这个坑我在IPv6直连那篇里提过一嘴,当时就是ddns-go给填上的,这次展开说透。
先把话放在这:家里宽带没公网IPv4也没有IPv6的,先别往下看,DDNS这路走不通,去走中继或者内网穿透,frp那篇和FN Connect那篇是干这个的。怎么判断自己有没有公网IP,看WAN口那篇讲过,100.64开头的就是没有。
ddns-go是个啥:11MB的单文件,管二十来家服务商
ddns-go是个开源的动态域名工具,GitHub上jeessy2维护的,Go写的。我从release下了个linux-amd64的包,压缩后4.7MB,解压出来就一个11.4MB的单文件,不带任何依赖,网页配置界面都打包在这一颗里。跑起来默认监听9876端口,浏览器打开就是一个配置页。
它比路由器自带的强在两处。一是服务商名单长:阿里云、腾讯云、DNSPod、Cloudflare、华为云、百度云、GoDaddy、Namecheap这些加起来二十来家,我那颗阿里云的域名直接就对上了号。二是获取IP的路子有三条:走接口查(访问公网上那些「你自己的IP是啥」的网页)、走本机网卡读(读NAS自己网卡上的地址,IPv6就靠这条)、走自定义命令。IPv4和IPv6两套配置完全独立,可以只开一个也可以都开。
顺带一个我实测的小细节。它内置的IPv4检测接口不止一个,我这台网络环境下myip.ipip.net是秒回,还会顺嘴报个归属地;api.ipify.org就干等没动静。多个接口轮着试,哪个通用哪个,这点比很多单一接口的脚本稳。
装进NAS:host网络这一步别选错
在飞牛上装,打开Docker,镜像名填jeessy/ddns-go,拉取之后建容器,就三个地方要盯。
| 配置项 | 怎么填 | 为什么 |
| 网络模式 | host(使用主机网络) | bridge模式下容器看不到NAS网卡上的IPv6地址,v6解析直接抓瞎 |
| 挂载 | 主机目录挂到 /root | 配置文件是/root下的隐藏文件.ddns_go_config.yaml,不挂出来容器一删配置全没 |
| 重启策略 | always | NAS重启后容器自己爬起来,不然域名更新就断档了 |
网络模式这行是全流程最容易翻的地方。Docker默认给容器分的是bridge网络,相当于让容器住楼中楼,它只能看见自己那间屋的虚拟网卡——IPv4靠接口查公网IP还凑合能用,IPv6靠网卡读地址这条路在bridge底下就是黑的。为什么host和bridge差这么多,我在Docker两种网络模式那篇里掰开讲过。群晖用户也一样,Container Manager里建容器时勾上「使用与Docker Host相同的网络」,道理相同。另外Windows和Mac桌面版Docker不支持host模式,想玩v6就别挂在这两类机器上。
命令行党一条就够:
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go
配置页里三件事:密钥、域名、获取方式
浏览器打开 http://NAS的IP:9876,第一次进它让你设用户名和密码。这步别学我手快——设完就忘,回头容器重建想进配置页进不去,只能进去敲命令重置。重置的法子是现成的:docker exec ddns-go ./ddns-go -resetPassword 新密码,敲完restart一下容器,但能不走到这步最好。
进了配置页先选服务商。以阿里云为例,要的是一对AccessKey ID和AccessKey Secret。别直接拿主账号的AK往里填——去阿里云的RAM访问控制建个子账号,只授权云解析DNS这一项,再把子账号的AK填进来。万一这对密钥哪天漏了,别人顶多改你两条DNS记录,动不了你账上的其他东西。腾讯云的密钥在访问管理的API密钥管理页,SecretId和SecretKey一对,填法同理。
域名那栏直接填 home.你的域名.com 这种三级域名就行,多个域名写多行,它一块儿解析。获取方式这边,IPv4选接口获取最省心;IPv6选网卡获取,读的就是NAS自己网卡上的全局地址。这里有个进阶玩法:IPv6获取方式下面有个正则框,填一段正则只匹配特定后缀的地址。配合系统侧把地址后缀钉死,前缀怎么换你解析到的永远是那台机器,跟IPv6直连那篇里netsh钉后缀是同一个思路,一个在系统层一个在应用层。不想动系统的,光靠ddns-go默认五分钟一次的检测频率,前缀换了也就多等几分钟的事。
三个坑和一笔白送的告警
第一个坑就是前面说的密码,忘了只能命令行重置。第二个坑是配完不更新:先看日志,配置页里能直接翻最近五十条,常见报错就两类——密钥不对(服务商那边401)和获取不到IP(v6没配host网络,或者网卡选错了机器上好几块网卡时容易选岔)。第三个坑安全向:配置页里「禁止从公网访问」默认是勾着的,别手贱取消。这个9876端口里躺着你域名的AK密钥,暴露到公网上等于把家门钥匙挂门外。要远程改配置,走VPN回家再开,别图省事直接端口转发。
白送的一笔是Webhook。配置页底下有Webhook栏,域名更新成功或失败都会回调你填的URL,支持的变量有#{ipv4Addr}、#{ipv6Addr}、#{ipv4Result}这几个。我把它接到了Bark上,家里的IP一变,手机弹一条「IPv4变了,新地址xxx」。这跟我在NAS告警那篇里搭的推送是同一个通道,等于DDNS的运行状态也顺手进了告警体系,域名解析停摆这种事不会再后知后觉。
容器日后的升级没什么特殊,抄参数重建一遍的事,流程在容器升级那篇里。唯一要记得的还是那个/root挂载——配置在外面,容器随你怎么折腾。
谁用得上,谁用不着
| 你的情况 | 要不要上 |
| 有自己的域名,宽带给公网IPv4或IPv6 | 正合适,这是ddns-go的靶心用户 |
| 没域名但想远程,嫌麻烦 | 别折腾,群晖QuickConnect、飞牛FN Connect直接用,慢点但零配置 |
| 没公网IP没IPv6 | DDNS治不了这病,去走frp或者VPN |
| 用路由器自带DDNS且够使 | 不用换,能跑就别动 |
我自己的账是这么算的:域名一年几十块,容器一个,电费忽略不计,换来的是自己的域名、自己挑的服务商、IP变了五分钟内跟上外加手机有通知。顺序上给个收尾——先按那篇确认家里IP是真能从外面进的,再买域名建子账号,然后host网络起容器,再配上Webhook。四步走完,动态域名这事儿就算钉死了。

发表评论