3338 字
17 分钟
【笔记】DDNS-GO 动态域名解析

DDNS-GO 是什么?#

DDNS-GO 是一款开源的动态域名解析(Dynamic DNS)工具,用于将动态变化的公网 IP 地址自动绑定到固定域名上。

核心功能#

  • 自动检测 IP 变化:定时检测本机的公网 IPv4 / IPv6 地址
  • 自动更新 DNS 记录:当 IP 发生变化时,自动调用 DNS 服务商 API 更新解析记录
  • 多服务商支持:阿里云、腾讯云、Cloudflare、华为云等 20+ DNS 服务商
  • Webhook 通知:IP 变化时可触发 Webhook 回调(如发送通知到企业微信、钉钉等)
  • Web 管理界面:提供可视化的配置和状态查看页面

适用场景#

家庭宽带或企业网络的公网 IP 通常是动态分配的,每次拨号或重启路由器后 IP 会变化。如果需要通过域名稳定访问内网服务(如 NAS、远程桌面、自建网站等),就需要 DDNS 来保持域名与 IP 的同步。

特性#

  • 支持 Mac、Windows、Linux 系统,支持 ARM、x86、RISC-V 架构
  • 支持接口/网卡/命令获取 IP
  • 支持以服务的方式运行
  • 默认间隔 5 分钟同步一次
  • 支持同时配置多个 DNS 服务商
  • 支持多个域名同时解析
  • 支持多级域名
  • 网页中配置,简单方便,默认勾选”禁止从公网访问”
  • 网页中可快速查看最近 50 条日志
  • 支持 Webhook 通知
  • 支持 TTL
  • 支持部分 DNS 服务商传递自定义参数,实现地域解析/多 IP 等功能

开源地址#

Docker 中使用#

前置条件#

  • 已安装 Docker
  • 拥有一台具有公网 IP 的设备(或路由器已做端口映射)

推荐:使用 host 模式部署#

挂载主机目录,使用 Docker host 模式。可把 /opt/ddns-go 替换为主机任意目录,配置文件为隐藏文件:

Terminal window
docker run -d \
--name ddns-go \
--restart=always \
--net=host \
-v /opt/ddns-go:/root \
jeessy/ddns-go

参数说明#

参数说明
-d后台运行容器
--name ddns-go容器命名为 ddns-go
--restart=always容器异常退出后自动重启
--net=host使用宿主机网络,DDNS-GO 可直接获取宿主机的真实网卡 IP(IPv6 必需)
-v /opt/ddns-go:/root将宿主机 /opt/ddns-go 目录挂载到容器 /root,用于持久化配置
jeessy/ddns-go官方 Docker Hub 镜像

访问管理页面#

容器启动后,通过浏览器访问: Linux:ifconfig Windows:ipconfig

http://<服务器IP>:9876

首次登录需要自定义用户名&密码

可选:使用 ghcr.io 镜像#

如无法访问 Docker Hub,可使用 GitHub Container Registry 镜像:

Terminal window
docker run -d \
--name ddns-go \
--restart=always \
--net=host \
-v /opt/ddns-go:/root \
ghcr.io/jeessy2/ddns-go

可选:自定义监听地址和同步间隔#

通过 -l 指定监听地址,-f 指定同步间隔(单位:秒):

Terminal window
docker run -d \
--name ddns-go \
--restart=always \
--net=host \
-v /opt/ddns-go:/root \
jeessy/ddns-go -l :9877 -f 600

以上命令将监听端口改为 9877,同步间隔改为 600 秒(10 分钟)。

可选:不使用 host 模式#

在不使用 host 模式时,需要手动映射端口。注意:此模式下无法通过网卡获取 IPv6 地址

Terminal window
docker run -d \
--name ddns-go \
--restart=always \
-p 9876:9876 \
-v /opt/ddns-go:/root \
jeessy/ddns-go

可选:重置密码#

若忘记管理页面密码,可通过以下命令重置:

Terminal window
docker exec ddns-go ./ddns-go -resetPassword 123456
docker restart ddns-go

使用 IPv6#

前提条件#

  • 你的设备能正常获取 IPv6 地址,并能通过 IPv6 正常访问外网
  • 虚拟机中使用有可能正常获取 IPv6,但不能正常访问 IPv6

各平台推荐方式#

平台推荐方式
Windows / Mac推荐使用系统方式运行(桌面版 Docker 不支持 --net=host
Linux推荐使用 Docker 的 --net=host 模式
群晖Docker 套件中勾选”使用与 Docker Host 相同的网络”

Linux 中使用 Docker 的 --net=host 模式(推荐)#

在 Linux 服务器上,DDNS-GO 需要通过 --net=host 模式直接访问宿主机的网卡,才能正确获取 IPv6 全局地址。

原因:Docker 的桥接网络(bridge)默认不支持 IPv6 的 SLAAC 地址获取,容器内部无法拿到宿主机的真实 IPv6 地址。使用 --net=host 后,容器与宿主机共享网络栈,DDNS-GO 可以直接读取宿主机网卡上的 IPv6 地址。

部署命令:

Terminal window
docker run -d \
--name ddns-go \
--restart=always \
--net=host \
-v /opt/ddns-go:/root \
jeessy/ddns-go

部署完成后,在配置页面的 IPv6 区域,获取 IP 方式选择”通过网卡获取”,即可自动读取宿主机的 IPv6 地址。

当前ddns-go使用Windows桌面版Docker部署的,不支持--net=host无法拿到网卡:

群晖 NAS 配置#

  1. 套件中心下载 Docker 并打开
  2. 注册表中搜索 ddns-go 并下载
  3. 映像 -> 选择 jeessy/ddns-go -> 启动 -> 高级设置 -> 网络中勾选 使用与 Docker Host 相同的网络
  4. 高级设置中勾选 启动自动重新启动
  5. 在浏览器中打开 http://群晖IP:9876,修改配置

IPv6 地址匹配#

设备通常有多个 IPv6 地址(如链路本地地址 fe80::、临时隐私地址等),可通过以下方式精确匹配:

  • @1:指定第一个 IPv6 地址
  • @2:指定第二个 IPv6 地址
  • 正则表达式:匹配特定格式的 IPv6 地址
  • 留空:不启用匹配,使用默认地址

配置参数详解#

登录成功后,进入 DDNS-GO 的配置页面。页面分为以下几个配置区域:

DNS 服务商#

用于指定域名所在的 DNS 服务商,DDNS-GO 通过调用服务商提供的 API 来更新 DNS 解析记录。

支持的服务商包括:

服务商说明
阿里云阿里云 DNS 解析服务
阿里云 ESA阿里云边缘安全加速
腾讯云腾讯云 DNS 解析服务
DnsPodDNSPod(已被腾讯云收购,使用腾讯云 API)
Cloudflare国际主流 DNS 服务商,提供免费 CDN
华为云华为云 DNS 解析服务
Callback自定义回调方式,通过 HTTP 请求触发更新
百度云百度云 DNS 解析服务
Porkbun域名注册商,提供免费 DNS
GoDaddy国际知名域名注册商
Namecheap域名注册及 DNS 服务商
NameSilo低价域名注册商
Vercel前端部署平台,附带 DNS 管理
Dynadot域名注册商
火山引擎字节跳动旗下云服务
Dynv6免费动态 DNS 服务
Spaceship域名注册商
Dnsla国内 DNS 服务商
时代互联国内域名注册及 DNS 服务商
Eranet域名注册商
TnethkDNS 服务商
Gcore全球 CDN 及 DNS 服务商
Edgeone腾讯云边缘安全加速平台
IBM NS1 ConnectIBM 旗下 DNS 服务
name.com域名注册商
雨云国内云服务商
HiPM DNSMgrDNS 管理工具
ClouDNSDNS 托管服务商

选择服务商后,需要填写对应的 AccessKey 信息:

参数说明
AccessKey ID服务商提供的 API 访问密钥 ID
AccessKey Secret服务商提供的 API 访问密钥密文
TTLDNS 记录的生存时间。选择”自动”时由服务商默认决定;如账号支持更小的 TTL,可手动修改。仅在 IP 发生变化时才会更新 TTL

HTTP 请求网卡#

参数说明
默认使用系统默认网卡发送 HTTP 请求
指定网卡类似 curl --interface,绑定特定网卡发送请求。留空则使用默认网卡

此选项用于多网卡环境下,指定通过哪个网卡发起获取 IP 的 HTTP 请求。大多数情况下保持默认即可。

IPv4 配置#

用于启用和配置 IPv4 地址的动态解析。

参数说明
是否启用开启或关闭 IPv4 DDNS 功能
获取 IP 方式见下方说明
Domains需要绑定的域名列表

获取 IP 方式#

提供三种方式获取当前公网 IPv4 地址:

方式说明
通过接口获取调用第三方 IP 查询接口(如 https://ddns.oray.com/checkiphttps://ip.3322.nethttps://4.ipw.cn 等)获取公网 IP
通过网卡获取直接读取本机网卡上的 IPv4 地址(适用于服务器直接拥有公网 IP 的场景)
通过命令获取执行自定义命令获取 IP(适用于特殊网络环境)

Domains 域名配置#

每行填写一个域名。格式说明:

  • 普通域名直接填写,如:example.com
  • 如域名不可注册,使用冒号分隔子域名和根域名,如:www:domain.example.com
  • 支持自定义参数

IPv6 配置#

用于启用和配置 IPv6 地址的动态解析。

参数说明
是否启用开启或关闭 IPv6 DDNS 功能
获取 IP 方式与 IPv4 类似,提供接口、网卡、命令三种方式
匹配正则表达式用于精确匹配指定的 IPv6 地址(见下方说明)
Domains需要绑定的域名列表

匹配正则表达式#

IPv6 设备通常有多个地址,可通过正则表达式精确匹配:

  • 使用 @1 指定第一个 IPv6 地址,@2 指定第二个,以此类推
  • 也可使用正则表达式匹配特定格式的 IPv6 地址
  • 留空则不启用正则匹配

Domains 域名配置#

格式与 IPv4 相同,每行一个域名。

其他设置#

用于配置 DDNS-GO 管理页面的访问安全。

参数说明
禁止公网访问启用后,仅允许局域网访问管理页面,禁止从公网直接访问
用户名管理页面的登录用户名,默认为 admin
密码管理页面的登录密码。如需修改,在此处输入新密码即可

安全建议:建议设置强密码,并启用”禁止公网访问”以提高安全性。若需远程管理,可通过 VPN 或反向代理访问。

Webhook 配置#

IP 地址发生变化时,DDNS-GO 可以通过 Webhook 发送通知或触发自定义操作。

URL#

填写 Webhook 的回调地址。支持以下变量:

变量名说明
#{ipv4Addr}新的 IPv4 地址
#{ipv4Result}IPv4 更新结果:未改变 失败 成功
#{ipv4Domains}IPv4 的域名,多个以 , 分割
#{ipv6Addr}新的 IPv6 地址
#{ipv6Result}IPv6 更新结果:未改变 失败 成功
#{ipv6Domains}IPv6 的域名,多个以 , 分割
#{timestamp}当前 UTC+0 时间戳(秒)

RequestBody#

  • 若为空,则发送 GET 请求
  • 若不为空,则发送 POST 请求,内容为 RequestBody 的值
  • 支持上述所有变量

Headers#

每行填写一个 Header,格式为 Key: Value。例如:

Authorization: Bearer API_KEY

常用 Webhook 配置示例#

钉钉#

  1. 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义
  2. 安全设置只勾选 自定义关键词,输入的关键字必须包含在 RequestBody 中,如:你的公网IP变了
  3. URL 中输入钉钉给你的 Webhook 地址
  4. RequestBody 中输入:
{
"msgtype": "markdown",
"markdown": {
"title": "你的公网IP变了",
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
}
}

飞书#

  1. 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
  2. 安全设置只勾选 自定义关键词,输入的关键字必须包含在 RequestBody 中,如:你的公网IP变了
  3. URL 中输入飞书给你的 Webhook 地址
  4. RequestBody 中输入:
{
"msg_type": "post",
"content": {
"post": {
"zh_cn": {
"title": "你的公网IP变了",
"content": [
[
{
"tag": "text",
"text": "IPv4地址:#{ipv4Addr}"
}
],
[
{
"tag": "text",
"text": "域名更新结果:#{ipv4Result}"
}
]
]
}
}
}
}

微信#

通过微信 ClawBot 协议推送消息到微信,需要先通过协议获取 $your_bot_token$your_user_id

  • URL 中输入:https://ilinkai.weixin.qq.com/ilink/bot/sendmessage
  • RequestBody 中输入:
{
"msg": {
"from_user_id": "",
"to_user_id": "$your_user_id@im.wechat",
"client_id": "ddns-#{timestamp}",
"message_type": 2,
"message_state": 2,
"item_list": [
{
"type": 1,
"text_item": {
"text": "📡 IPv4: #{ipv4Result}\n 新地址: #{ipv4Addr}\n 已绑定域名: #{ipv4Domains}\n\n📡 IPv6: #{ipv6Result}\n 新地址: #{ipv6Addr}\n 已绑定域名: #{ipv6Domains}"
}
}
]
},
"base_info": {
"channel_version": "2.1.7"
}
}
  • Headers 中输入:
Content-Type: application/json
AuthorizationType: ilink_bot_token
Authorization: Bearer $your_bot_token
iLink-App-Id: bot
iLink-App-ClientVersion: 131335

更多 Webhook 配置#

DDNS-GO 还支持 Server酱、Bark、Telegram、pushplus 推送加、Discord 等多种通知方式。完整配置参考:Webhook 配置参考

Callback 配置#

通过自定义回调可支持更多第三方 DNS 服务商。配置的域名有几行,就会回调几次。

支持的变量:

变量名说明
#{ip}新的 IPv4/IPv6 地址
#{domain}当前域名
#{recordType}记录类型 AAAAA
#{ttl}TTL
  • 若 RequestBody 为空则为 GET 请求,否则为 POST 请求
  • 完整配置参考:Callback 配置参考

配置完成后的验证#

完成所有配置后,点击保存。DDNS-GO 会立即检测当前 IP 并尝试更新 DNS 记录。

在管理页面可以查看:

  • 当前检测到的 IPv4 / IPv6 地址
  • DNS 更新状态及结果
  • 最近的更新日志(支持查看最近 50 条)

若更新成功,域名解析将指向当前的公网 IP,通过域名即可正常访问对应的服务。

常见问题#

Q:DDNS-GO 获取的 IP 与实际公网 IP 不一致?

A:检查是否处于 NAT 网络环境(如运营商级 NAT),此时获取到的可能是内网 IP。需联系运营商申请公网 IP,或使用”通过接口获取”方式获取真实出口 IP。

Q:DNS 更新失败,提示权限不足?

A:检查 AccessKey 是否正确,以及该密钥是否具有 DNS 解析的读写权限。

Q:IPv6 地址获取不到?

A:确认设备已获取 IPv6 全局地址(非链路本地地址 fe80: 开头),并确认运营商已分配 IPv6 前缀。Docker 环境下请确认使用了 --net=host 模式。

Q:如何保证管理页面的安全性?

A:建议启用”禁止公网访问”选项,并通过 Nginx 等反向代理启用 HTTPS 访问。详见 FAQ

【笔记】DDNS-GO 动态域名解析
https://jzzt.cc.cd/posts/随笔思辨/笔记-260611ddns-go学习笔记/
作者
局子粥头
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0