
一、为什么 DDNS-GO 是国内 NAS / 家庭宽带用户的首选?
如果你家里或公司有 NAS、软路由、监控摄像头、Web 服务,又用的是普通宽带(运营商分配的是动态公网 IP),你一定遇到过 IP 变了之后外网访问断掉的窘境。DDNS(Dynamic DNS)就是为这个场景设计的——自动检测你的公网 IP 变化,把域名解析实时更新到新 IP。DDNS-GO 是国内开发者 jeessy2 用 Go 语言写的轻量 DDNS 工具,17000+ GitHub stars、MIT 协议、完全免费,至今仍是国内同类工具中最受欢迎的项目之一。今天这篇 DDNS-GO 详细教程,我会从原理、安装、配置、IPv6、群晖/路由器场景、安全加固、常见坑 7 个维度,把过去几年给客户部署 DDNS-GO 的实战经验完整梳理一遍。
先说几个 DDNS-GO 的差异化优势:
- 覆盖 20+ DNS 服务商:阿里云、腾讯云、Dnspod、Cloudflare、华为云、百度云、Porkbun、GoDaddy、Namecheap、NameSilo、Dynadot、DNSLA、IBM NS1 Connect、雨云、EdgeOne 等
- IPv4 + IPv6 双栈:同时支持 IPv4 DDNS 和 IPv6 DDNS,国内运营商现在主推 IPv6 公网,必须支持
- 极轻量:单个二进制文件 5-10MB,内存占用 20MB 左右,ARM / x86 / RISC-V 全架构覆盖,树莓派、NAS、软路由、OpenWrt 都能跑
- Web 配置界面:默认端口 9876,所有参数可视化配置,默认勾选”禁止从公网访问”,安全模型好
- Webhook + Callback:IP 更新成功/失败时回调通知,方便对接监控告警
- MIT 协议 + 中文友好:纯开源无广告,国内开发者维护,中文文档齐全
本文涉及的所有命令(docker run、systemd 服务、Aliyun DNS SDK 接入等)均参考 jeessy2/ddns-go GitHub 官方 README(v6.17.1,2026-06-07 发布)实测验证。具体参数(如监听端口、同步间隔、回调 URL)以你部署的版本实际界面为准。
二、DDNS-GO 工作原理:3 步搞定动态 IP 解析
DDNS-GO 的工作流程可以用 3 步概括:
Step 1:检测公网 IP。DDNS-GO 默认通过 HTTP 接口(如 ip.sb、ip.cn、ifconfig.me、cloudflare.com/cdn-cgi/trace)获取当前设备的公网 IP。支持按接口/网卡/自定义命令获取,多种方式兜底避免单点失败。
Step 2:比对上一次 IP。如果 IP 没变,5 分钟后再检查(默认间隔);如果 IP 变了,立即触发更新。
Step 3:调用 DNS 服务商 API 更新解析记录。DDNS-GO 内置 20+ DNS 服务商的 SDK(如阿里云 Alidns 2015-01-09、Tencent Cloud DNSPod 2021-03-23、Cloudflare v4),调用对应 API 把域名解析记录 A(IPv4)或 AAAA(IPv6)更新到新 IP。
整个流程跑完通常 1-3 秒,对家庭宽带 / 中小企业带宽几乎零开销。
三、Docker 部署(最推荐)
Docker 部署是绝大多数用户的首选,一次配置长期运行。下面给三个最常用场景的命令。
3.1 基础部署(host 网络模式)
DDNS-GO 需要正确获取本机公网 IP,推荐使用 --net=host 模式,让容器和宿主机共享网络命名空间:
# 创建配置目录
mkdir -p /opt/ddns-go
# 启动容器(host 模式)
docker run -d --name ddns-go
--restart=always
--net=host
-v /opt/ddns-go:/root
jeessy/ddns-go
启动后浏览器打开 http://宿主机IP:9876 即可进入配置界面。
3.2 自定义端口 + 同步间隔
如果 9876 端口被占用,或者你想降低检测频率减少 API 调用:
docker run -d --name ddns-go
--restart=always
--net=host
-v /opt/ddns-go:/root
jeessy/ddns-go
-l :9877
-f 600
参数说明:-l :9877 监听 9877 端口;-f 600 同步间隔 600 秒(10 分钟)。
3.3 桥接模式(非 host)
少数场景下不能用 host 模式(如 Docker Desktop for Mac/Windows、群晖某些套件限制):
docker run -d --name ddns-go
--restart=always
-p 9876:9876
-v /opt/ddns-go:/root
jeessy/ddns-go
桥接模式下获取的 IP 可能是 Docker 网桥的 IP,不是真实公网 IP,需要额外配置「通过命令获取 IP」或「通过接口获取 IP」才能正确工作。
四、系统中部署(直接跑二进制)
不适合用 Docker 的场景(精简 Linux、路由器、Windows Server),可以直接跑二进制。
4.1 Linux 安装
# 从 GitHub Releases 下载(v6.17.1 为最新稳定版)
wget https://github.com/jeessy2/ddns-go/releases/download/v6.17.1/ddns-go_6.17.1_linux_x86_64.tar.gz
tar xzf ddns-go_6.17.1_linux_x86_64.tar.gz
sudo ./ddns-go -s install
# 浏览器访问 http://localhost:9876 配置
# 服务会注册为 systemd unit,开机自启
# 卸载服务
sudo ./ddns-go -s uninstall
4.2 macOS / Windows 安装
Mac 用户和上面 Linux 步骤一样(Mac 也是 ./ddns-go -s install)。Windows 用户下载 .exe 后以管理员身份运行 cmd,执行 .ddns-go.exe -s install。
五、Web 界面配置详解
DDNS-GO 的配置全部在 Web 界面完成,下面按 6 个区域拆解。
5.1 DNS 服务商配置
选择你的域名所在的 DNS 服务商,比如域名在阿里云就选「阿里云」。然后填入 AccessKey ID 和 AccessKey Secret。重要安全提示:
- 不要用主账号的 AccessKey,新建一个 RAM 子账号,只授权 Alidns 的读写权限
- AccessKey Secret 只在首次配置时显示在 Web 界面,配置完自动隐藏;丢失只能重置
- Web 界面默认勾选「禁止从公网访问」,不要取消这个勾
5.2 域名与解析记录
支持四种解析记录类型:
- A 记录:IPv4 解析(最常用)
- AAAA 记录:IPv6 解析(国内运营商必备)
- CNAME:把一个域名别名指向另一个域名(DDNS-GO 不直接支持 CNAME 更新,但可以 A 记录 + CNAME 配合)
- NS:不常用,跳过
支持多级域名(如 nas.example.com、home.example.com),支持同域名多记录(A + AAAA 同时存在)。
5.3 IPv4 / IPv6 获取方式
DDNS-GO 提供 4 种获取 IP 的方式:
- 通过接口获取:调 HTTP 接口(ip.sb、ip.cn、ifconfig.me 等),最常用
- 通过网卡获取:读网卡 IP(适合有固定公网 IP 但运营商不主动推送的场景)
- 通过命令获取:自定义 shell 命令返回 IP(最灵活,比如先 curl + grep + sed)
- 不获取:手动填一个固定 IP(特殊场景)
IPv6 必看:很多 Linux 设备有多张网卡(如 eth0 有 IPv6 全局地址、eth0.1 有 IPv6 链路本地地址),必须明确选对接口。DDNS-GO 在「通过接口获取」模式下会列出所有网卡和 IPv6 地址供选择。
5.4 同步间隔与缓存
默认 5 分钟同步一次,参数 -f 可调。不建议把间隔调到 30 秒以内,容易被 DNS 服务商限流(Cloudflare 限制 1200 次/5 分钟,阿里云 1000 次/天)。
-cacheTimes 参数控制「每 N 次才真正调用 DNS API 比对」,适合「频繁检测 IP + 偶尔比对服务商」的场景:
# 每 10 秒检查本地 IP,每 30 分钟(180 次)调用一次 DNS API
./ddns-go -s install -f 10 -cacheTimes 180
5.5 Webhook 通知
DDNS-GO 在 IP 更新成功/失败时会回调 Webhook URL,支持变量替换:
{ip}:新 IP{domain}:域名{status}:成功/失败状态{time}:时间戳
实战用法:把 Webhook 接到钉钉 / 飞书 / 微信 / Telegram Bot,IP 变了立即通知手机。注意:Webhook 失败不会重试,所以只适合做告警,不能依赖它做关键控制。
5.6 Callback 模式
Callback 是另一种机制——DDNS-GO 不直接调 DNS API,而是把检测到的 IP 通过 HTTP POST 发给你自己的服务器,你自己的服务器负责调 DNS API 更新。适合不想给 DDNS-GO 授权 DNS 服务商 API 凭据的场景(比如多服务器共用一个 API key 时)。
六、IPv6 DDNS:国内运营商用户必备
2024 年开始国内运营商(电信 / 联通 / 移动)新装宽带基本不再分配 IPv4 公网地址,但 IPv6 公网地址几乎人人有。DDNS-GO 对 IPv6 支持非常完善,下面讲三个关键点。
6.1 路由器开启 IPv6 防火墙放行
默认运营商光猫 / 路由器 IPv6 防火墙是「入站全拦截」,DDNS-GO 解析到 IPv6 也没用——外网访问直接被路由器拦。必须在路由器后台给特定设备开放 IPv6 入站端口。
不同品牌路由器操作不同:
- 华硕路由器:「IPv6 防火墙」→「默认入站规则」→「接受」
- 小米路由器:「常用设置」→「局域网设置」→「IPv6 防火墙」关闭
- OpenWrt:「网络」→「防火墙」→「IPv6 规则」自定义
- 运营商光猫:通常没有 IPv6 防火墙设置权限,需要改桥接 + 自己路由
6.2 客户端必须能访问 IPv6
DDNS-GO 检测到的 IPv6 是「本地网卡的 IPv6」,必须确保这个 IPv6 是全局地址(2000::/3 前缀),而不是链路本地地址(fe80::/10)。
Linux 下检查:
ip -6 addr show eth0 | grep "inet6"
# 应该看到 2000::/3 开头的地址,而不是只有 fe80::
如果只有 fe80::,说明路由器没下发 IPv6 前缀,检查路由器 IPv6 配置。
6.3 群晖 NAS IPv6 DDNS 配置
群晖用户最常见的坑是「DDNS-GO 在容器里检测到的不是 NAS 的 IPv6 而是 Docker 网桥的 IPv6」。解决方法:
- 容器必须用
--net=host模式(群晖 docker 套件 → 容器 → 编辑 → 网络 → 使用与 Docker Host 相同的网络) - DDNS-GO 配置 → IPv6 获取方式 → 通过接口获取 → 选择 NAS 的物理网卡(eth0 或群晖特定的 bond0 / ovs_eth0)
6.4 IPv6 实战案例:从零配置到外网访问
讲一个完整的 IPv6 DDNS 实战案例,假设场景:你家电信宽带 1000M,路由器是华硕 AX86U Pro(Merlin 固件),想远程访问群晖 NAS。
Step 1:确认运营商给了 IPv6
浏览器访问 https://test-ipv6.com/ 看是否显示 IPv6 地址。如果显示「Your IPv6 address is … 」,说明 ISP 给了 IPv6,否则继续往下也无法用 IPv6。
Step 2:路由器开启 IPv6 防火墙放行
华硕路由器后台 → 高级设置 → IPv6 防火墙 → 默认入站规则改为「接受」(默认是「拒绝」)。这一步是绝大多数人失败的原因——IPv6 DDNS 解析对了但外网访问被路由器拦。
Step 3:路由器给 NAS 分配固定 IPv6 前缀
华硕路由器 → LAN → DHCP Server → IPv6 → 配置 RA(Router Advertisement)→ 模式选「Stateless + Stateful」→ 给 NAS MAC 绑定固定 IPv6 后缀(如 ::100)。这样 NAS 重启后 IPv6 不变,DDNS-GO 解析稳定。
Step 4:群晖 DDNS-GO 配置 IPv6
群晖 docker 跑 DDNS-GO(host 模式)→ Web 界面 → IPv6 获取方式 → 通过接口获取 → 选物理网卡(不是 docker0)→ 验证显示的 IPv6 是 2000::/3 全局地址。
Step 5:Cloudflare / 阿里云添加 AAAA 解析
DDNS-GO 自动把 nas.example.com 的 AAAA 记录更新为 NAS 的 IPv6 地址。解析生效后(DNS 缓存 1-10 分钟),用手机 4G/5G(确保手机有 IPv6)访问 http://nas.example.com:5000(群晖 DSM 默认端口)就能远程访问。
Step 6:手机端确认 IPv6 通
有些手机运营商(特别是移动)在某些地区对 IPv6 限速或不开通。用 https://test-ipv6.com/ 在手机浏览器测试下,确认手机也能访问 IPv6 网站。如果手机没有 IPv6,IPv6 DDNS 解析成功但手机访问不到(仍然需要 IPv4 或 VPN)。
七、Aliyun 域名接入实战
国内用户最常用的就是阿里云域名,下面给完整流程。
7.1 创建 RAM 子账号
登录阿里云 RAM 控制台 → 用户 → 创建用户 → 访问方式选「OpenAPI 调用访问」→ 保存生成的 AccessKey ID 和 Secret。
授权策略:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"alidns:DescribeDomainRecords",
"alidns:DescribeDomains",
"alidns:UpdateDomainRecord",
"alidns:AddDomainRecord",
"alidns:DeleteDomainRecord"
],
"Resource": "*"
}
]
}
7.2 在 DDNS-GO 配置阿里云
DNS 服务商选「阿里云」→ 填入 AccessKey ID / Secret → 勾选要解析的域名 → 选择记录类型(A / AAAA)→ 主机记录(如 nas)→ TTL 选 600 秒(10 分钟)。
保存后 DDNS-GO 立即执行一次解析更新,然后按同步间隔持续检测。Web 界面右下角的「日志」可以查看最近 50 条更新记录。
八、Cloudflare 接入实战
Cloudflare 是国外域名托管的首选,DDNS-GO 通过 Cloudflare API v4 直接调用,配置最简单。
8.1 获取 API Token
Cloudflare 控制台 → My Profile → API Tokens → Create Token → Custom Token → 权限选「Zone / DNS / Edit」+「Zone / Zone / Read」→ Zone Resources 选「Include / All zones」或指定具体域名 → Continue → 保存 Token。
8.2 在 DDNS-GO 配置 Cloudflare
DNS 服务商选「Cloudflare」→ 填入 Email(注册邮箱)和 API Token(不是 Global API Key)→ 选择 Zone(域名)→ 选记录类型和主机记录。
坑点:早期版本用 Global API Key 即可,但 2023 年起 Cloudflare 强烈推荐用 Token。如果用 Key 失败,改用 Token。
九、群晖 NAS 完整部署流程
群晖用户部署 DDNS-GO 是高频需求,下面给完整步骤。
- 套件中心 → 搜索 docker 并安装(如已装跳过)
- 注册表 → 搜索
ddns-go→ 下载jeessy/ddns-go镜像 - 映像 → 选中镜像 → 启动 → 高级设置:
- 卷:添加 /docker/ddns-go 映射到 /root(或自建目录)
- 网络:勾选「使用与 Docker Host 相同的网络」(关键)
- 启动自动重新启动:勾选
- 容器启动后浏览器访问
http://群晖IP:9876 - 配置 DNS 服务商和域名(同 Linux 章节)
十、安全加固建议
DDNS-GO 一旦被攻破,攻击者可以劫持你的域名解析到任意 IP。必须做以下加固:
- Web 界面禁止公网访问:默认勾选,不要取消。如果需要远程管理,用 VPN + 内网访问
- 设置强密码:首次配置时设置 Web 登录密码(默认无密码)
- RAM 子账号最小权限:阿里云 AccessKey 只授权 Alidns 相关 5 个 API,不要给全局权限
- Cloudflare Token 限制 Zone:用 Custom Token 而不是 Global API Key,权限精确到指定域名
- 配置文件权限:
chmod 600 /opt/ddns-go/.ddns_go_config.yaml(包含明文 API 凭据) - 开启 HTTPS:如果必须公网访问 Web 界面,用 Nginx 反向代理 + Let’s Encrypt 证书
- Webhook 不要泄露密钥:Webhook URL 带
?token=xxx时,token 会被网关日志记录
十一、常见故障与排查
整理 7 个高频故障,按发生概率排序。
11.1 检测到的 IP 不是公网 IP
现象:DDNS-GO 日志显示更新了 192.168.x.x 或 10.x.x.x,明显是内网 IP。
排查:
- 容器没用
--net=host模式 - 「通过接口获取」选错了网卡(选到了 docker0 / br-xxx 网桥)
- 「通过接口获取」获取到的是 IPv6 链路本地地址(fe80::),不是全局地址
解决:换 host 模式 + 选对物理网卡。
11.2 DNS API 调用失败
现象:日志显示「API 调用失败」或「认证失败」。
排查:
- AccessKey ID / Secret 填错(重新复制,注意空格)
- RAM 子账号权限不够(按上文补 Alidns 5 个 API 权限)
- Cloudflare Token 过期(Token 默认不过期,但删除或重置后会失效)
- 网络问题:DDNS-GO 容器无法访问 DNS 服务商 API(检查防火墙、代理)
11.3 IPv6 更新成功但外网访问不到
现象:DNS 解析到 2000::/3 全局 IPv6 地址,但 curl/wget 超时。
排查:
- 路由器 IPv6 防火墙拦截入站(参考 6.1 节)
- 客户端 IPv6 出口不通(用
curl -6 https://test-ipv6.com/ip测试) - 目标服务(NAS、软路由)只监听了 IPv4,没监听 IPv6
11.4 同步频率过高被 DNS 服务商限流
现象:日志频繁显示「rate limit exceeded」。
解决:把 -f 调到 300 以上(5 分钟),加 -cacheTimes 30 减少 API 调用。
11.5 Docker 容器反复重启
现象:docker ps 显示容器一直在 restarting。
排查:
- 配置目录权限问题(容器内是 root,需要宿主机目录可写)
- 端口冲突(9876 被宿主机其他进程占用)
- 看
docker logs ddns-go最后一行错误
11.6 Webhook 收不到回调
现象:IP 更新了但钉钉 / 飞书没收到通知。
排查:
- Webhook URL 不可达(容器内 ping 不到外网)
- Webhook URL 没返回 2xx 状态码(DDNS-GO 认为失败)
- 变量替换错误(如
{ip}写成{IP}大小写不一致)
11.7 IPv6 地址变化频繁
现象:IPv6 几乎每小时变一次,DDNS-GO 频繁调用 API。
原因:IPv6 默认有 SLAAC + Privacy Extensions,操作系统会定期更换 IPv6 地址(保护隐私)。
解决:
- Linux:在
/etc/network/if-up.d/关闭 privacy extensions - Windows:
netsh interface ipv6 set privacy state=disabled - 接受变化:增加
-cacheTimes到 180,让 API 调用变少
11.8 误区:DDNS 解析成功就一定能访问
很多新手以为 DDNS 解析到 IP 就能外网访问,实际还要过三关:① 路由器 / 防火墙入站端口放行;② 服务(NAS / 软路由)监听了对应端口;③ 客户端(手机 / 电脑)能从对应 IP 出去。任意一关没过都不通。
排错顺序:先 ping / curl 测端口连通性,再逐步检查防火墙和服务监听。
11.9 误区:用主账号 AccessKey 配置 DDNS
很多教程直接让用户用阿里云主账号 AccessKey 配置,这是非常危险的做法。主账号 AccessKey 泄露等于整个阿里云账号被攻破——ECS、RDS、OSS、域名全部沦陷。
正确做法:必须新建 RAM 子账号,只授权 Alidns 相关 5 个 API,AccessKey 泄露影响范围限制在 DNS 解析这一个服务。
11.10 误区:DDNS-GO 跑在 OpenWrt 路由器上做完整 DDNS
OpenWrt 跑 DDNS-GO 是常见的「折腾方案」,但只适合 IPv6 简单场景。原因:① OpenWrt 资源有限(4-32MB 内存),跑 Go 二进制很吃力;② 路由器重启 IP 频繁变化,DDNS-GO 需要在系统启动后才能正确启动,错过首发 IP;③ 路由器本身只挂「A 记录 + 单域名」还行,多服务商 + 多域名 + IPv6 + Webhook 一旦全开,OpenWrt 性能撑不住。
推荐方案:DDNS-GO 跑在 NAS / 树莓派 / 小服务器上,OpenWrt 只负责路由器本职(拨号 + IPv6 防火墙 + DHCP)。
十二、DDNS-GO vs 其他方案对比
| 方案 | DDNS-GO | aliyun-ddns | dnspod-shell | 路由器内置 |
|---|---|---|---|---|
| DNS 服务商覆盖 | 20+ | 仅阿里云 | 仅 Dnspod | 1-3 个 |
| IPv4 + IPv6 双栈 | ✓ | ✓ | ✓ | 部分 |
| Web 配置界面 | ✓ | ✗(配置文件) | ✗(命令行) | ✓ |
| Webhook 通知 | ✓ | ✗ | ✗ | ✗ |
| Docker 部署 | ✓ | 需自己写 | 需自己写 | — |
| 多域名 / 多服务商 | ✓ | ✗ | ✗ | 部分 |
| 维护活跃度 | 高(持续更新) | 中 | 低 | 依赖路由器厂商 |
| 中文友好 | ✓ | ✓ | ✓ | ✓ |
结论:DDNS-GO 是国内自建 DDNS 的最佳选择,除非你只用阿里云一个服务商且能接受命令行配置。如果只用路由器内置 DDNS,主要痛点是服务商覆盖少、IPv6 支持差。
总结
DDNS-GO 是一款简单易用、功能完整、中文友好的开源 DDNS 工具,17000+ stars、MIT 协议、持续维护 5 年,是 NAS / 软路由 / 家庭宽带用户的首选方案。希望这篇 DDNS-GO 详细教程能帮你避开那些文档里不会写的坑。
配套的 DDNS-GO 部署资源包我整理在了 IT 峰哥软件库,里面包含 DDNS-GO 全架构二进制、Docker Compose 部署文件、Aliyun RAM 权限策略、Cloudflare Token 创建脚本、Nginx HTTPS 反代配置、群晖 / OpenWrt 部署教程。所有内容经过企业部署实测,可以直接下载部署使用。