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 等功能
开源地址
- GitHub:jeessy2/ddns-go
Docker 中使用
前置条件
- 已安装 Docker
- 拥有一台具有公网 IP 的设备(或路由器已做端口映射)
推荐:使用 host 模式部署
挂载主机目录,使用 Docker host 模式。可把 /opt/ddns-go 替换为主机任意目录,配置文件为隐藏文件:
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 镜像:
docker run -d \ --name ddns-go \ --restart=always \ --net=host \ -v /opt/ddns-go:/root \ ghcr.io/jeessy2/ddns-go可选:自定义监听地址和同步间隔
通过 -l 指定监听地址,-f 指定同步间隔(单位:秒):
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 地址:
docker run -d \ --name ddns-go \ --restart=always \ -p 9876:9876 \ -v /opt/ddns-go:/root \ jeessy/ddns-go可选:重置密码
若忘记管理页面密码,可通过以下命令重置:
docker exec ddns-go ./ddns-go -resetPassword 123456docker 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 地址。
部署命令:
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 配置
- 套件中心下载 Docker 并打开
- 注册表中搜索
ddns-go并下载 - 映像 -> 选择
jeessy/ddns-go-> 启动 -> 高级设置 -> 网络中勾选使用与 Docker Host 相同的网络 - 高级设置中勾选
启动自动重新启动 - 在浏览器中打开
http://群晖IP:9876,修改配置
IPv6 地址匹配
设备通常有多个 IPv6 地址(如链路本地地址 fe80::、临时隐私地址等),可通过以下方式精确匹配:
@1:指定第一个 IPv6 地址@2:指定第二个 IPv6 地址- 正则表达式:匹配特定格式的 IPv6 地址
- 留空:不启用匹配,使用默认地址
配置参数详解
登录成功后,进入 DDNS-GO 的配置页面。页面分为以下几个配置区域:
DNS 服务商
用于指定域名所在的 DNS 服务商,DDNS-GO 通过调用服务商提供的 API 来更新 DNS 解析记录。
支持的服务商包括:
| 服务商 | 说明 |
|---|---|
| 阿里云 | 阿里云 DNS 解析服务 |
| 阿里云 ESA | 阿里云边缘安全加速 |
| 腾讯云 | 腾讯云 DNS 解析服务 |
| DnsPod | DNSPod(已被腾讯云收购,使用腾讯云 API) |
| Cloudflare | 国际主流 DNS 服务商,提供免费 CDN |
| 华为云 | 华为云 DNS 解析服务 |
| Callback | 自定义回调方式,通过 HTTP 请求触发更新 |
| 百度云 | 百度云 DNS 解析服务 |
| Porkbun | 域名注册商,提供免费 DNS |
| GoDaddy | 国际知名域名注册商 |
| Namecheap | 域名注册及 DNS 服务商 |
| NameSilo | 低价域名注册商 |
| Vercel | 前端部署平台,附带 DNS 管理 |
| Dynadot | 域名注册商 |
| 火山引擎 | 字节跳动旗下云服务 |
| Dynv6 | 免费动态 DNS 服务 |
| Spaceship | 域名注册商 |
| Dnsla | 国内 DNS 服务商 |
| 时代互联 | 国内域名注册及 DNS 服务商 |
| Eranet | 域名注册商 |
| Tnethk | DNS 服务商 |
| Gcore | 全球 CDN 及 DNS 服务商 |
| Edgeone | 腾讯云边缘安全加速平台 |
| IBM NS1 Connect | IBM 旗下 DNS 服务 |
| name.com | 域名注册商 |
| 雨云 | 国内云服务商 |
| HiPM DNSMgr | DNS 管理工具 |
| ClouDNS | DNS 托管服务商 |
选择服务商后,需要填写对应的 AccessKey 信息:
| 参数 | 说明 |
|---|---|
| AccessKey ID | 服务商提供的 API 访问密钥 ID |
| AccessKey Secret | 服务商提供的 API 访问密钥密文 |
| TTL | DNS 记录的生存时间。选择”自动”时由服务商默认决定;如账号支持更小的 TTL,可手动修改。仅在 IP 发生变化时才会更新 TTL |
HTTP 请求网卡
| 参数 | 说明 |
|---|---|
| 默认 | 使用系统默认网卡发送 HTTP 请求 |
| 指定网卡 | 类似 curl --interface,绑定特定网卡发送请求。留空则使用默认网卡 |
此选项用于多网卡环境下,指定通过哪个网卡发起获取 IP 的 HTTP 请求。大多数情况下保持默认即可。
IPv4 配置
用于启用和配置 IPv4 地址的动态解析。
| 参数 | 说明 |
|---|---|
| 是否启用 | 开启或关闭 IPv4 DDNS 功能 |
| 获取 IP 方式 | 见下方说明 |
| Domains | 需要绑定的域名列表 |
获取 IP 方式
提供三种方式获取当前公网 IPv4 地址:
| 方式 | 说明 |
|---|---|
| 通过接口获取 | 调用第三方 IP 查询接口(如 https://ddns.oray.com/checkip、https://ip.3322.net、https://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 配置示例
钉钉
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义
- 安全设置只勾选
自定义关键词,输入的关键字必须包含在 RequestBody 中,如:你的公网IP变了 - URL 中输入钉钉给你的 Webhook 地址
- RequestBody 中输入:
{ "msgtype": "markdown", "markdown": { "title": "你的公网IP变了", "text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n" }}飞书
- 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
- 安全设置只勾选
自定义关键词,输入的关键字必须包含在 RequestBody 中,如:你的公网IP变了 - URL 中输入飞书给你的 Webhook 地址
- 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/jsonAuthorizationType: ilink_bot_tokenAuthorization: Bearer $your_bot_tokeniLink-App-Id: botiLink-App-ClientVersion: 131335更多 Webhook 配置
DDNS-GO 还支持 Server酱、Bark、Telegram、pushplus 推送加、Discord 等多种通知方式。完整配置参考:Webhook 配置参考
Callback 配置
通过自定义回调可支持更多第三方 DNS 服务商。配置的域名有几行,就会回调几次。
支持的变量:
| 变量名 | 说明 |
|---|---|
#{ip} | 新的 IPv4/IPv6 地址 |
#{domain} | 当前域名 |
#{recordType} | 记录类型 A 或 AAAA |
#{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。







