ddns-go:零配置动态 DNS 客户端
概述
ddns-go 是一款开源的动态 DNS(DDNS)客户端,由 jeessy2 用 Go 语言开发。它解决了家庭宽带或服务器公网 IP 经常变化的问题 —— 将域名自动解析到最新的公网 IP 上。
你不需要懂 DDNS 协议,不需要写脚本,也不需要理解 DNS 记录的 API。配置界面是 Web 页面,勾勾选选就能跑起来。
- ✅ 支持主流 DNS 服务商 — 阿里云 DNS、腾讯云 DNSPod、华为云 DNS、Cloudflare、DuckDNS、Google Domains、自定义回调等
- ✅ 支持 IPv4 和 IPv6 — 可同时更新
- ✅ Web 管理界面 — 浏览器配置,所见即所得
- ✅ 多平台 — Windows、Linux、macOS、群晖、OpenWrt、RouterOS
- ✅ Docker 部署 — 一条命令启动
- ✅ 后台运行 — 守护进程模式,变化时自动更新
- ✅ Webhook 通知 — 更新后通过飞书、钉钉、企业微信、Server 酱等通知
- ✅ 每分钟轮询 — IP 变化后最快 1 分钟内生效(默认 5 分钟)
安装方式
方式一:Docker 部署(推荐)
docker run -d \
--name ddns-go \
--restart=always \
-p 9876:9876 \
-v /opt/ddns-go:/root \
jeessy/ddns-go:latest
参数说明:
| 参数 | 说明 |
|---|---|
-p 9876:9876 |
Web 管理端口,左侧可按需修改 |
-v /opt/ddns-go:/root |
持久化配置数据 |
--restart=always |
容器退出自动重启 |
访问 http://你的IP:9876 进入配置界面。
Docker Compose 方式:
version: '3.8'
services:
ddns-go:
image: jeessy/ddns-go:latest
container_name: ddns-go
restart: always
ports:
- "9876:9876"
volumes:
- ./ddns-go-data:/root
docker compose up -d
方式二:群晖 DSM(套件中心)
群晖用户可以直接在 套件中心 → 设置 → 添加第三方源 安装:
套件来源:
https://spk.lihz.cn/
也可以手动下载 .spk 安装包从 GitHub Releases 安装。
安装后通过 套件中心 → ddns-go → 打开 访问 Web UI。
方式三:OpenWrt / 路由器
# 下载对应架构的二进制文件
wget https://github.com/jeessy2/ddns-go/releases/latest/download/ddns-go_linux_amd64.tar.gz
tar -zxvf ddns-go_linux_amd64.tar.gz
./ddns-go -l 0.0.0.0:9876
或者直接在 OpenWrt 的 系统 → 软件包 中搜索 ddns-go 安装:
opkg update
opkg install ddns-go
OpenWrt 版本会自动注册为系统服务,开机自启。
方式四:直接安装(Windows / Linux / macOS)
从 GitHub Releases 下载对应系统架构的二进制文件。
Linux:
# 下载
wget https://github.com/jeessy2/ddns-go/releases/latest/download/ddns-go_linux_amd64.tar.gz
tar -zxvf ddns-go_linux_amd64.tar.gz
# 启动(后台运行)
sudo ./ddns-go -l 0.0.0.0:9876 -f 300
# 注册为系统服务(systemd)
sudo ./ddns-go -s install
Windows:
- 下载
ddns-go_windows_x86_64.exe - 双击运行(或从命令行启动)
- 访问
http://localhost:9876 - 注册为 Windows 服务:以管理员身份运行
ddns-go.exe -s install
macOS:
# Homebrew 安装(如果已收录)
brew install ddns-go
# 或手动下载
wget https://github.com/jeessy2/ddns-go/releases/latest/download/ddns-go_darwin_amd64.tar.gz
tar -zxvf ddns-go_darwin_amd64.tar.gz
./ddns-go -l 0.0.0.0:9876
安装后的系统服务命令
# 使用 -s 参数管理服务
./ddns-go -s install # 安装为系统服务(systemd / Windows Service)
./ddns-go -s uninstall # 卸载服务
./ddns-go -s status # 查看服务状态
./ddns-go -s restart # 重启服务
配置说明
首次配置
访问 http://IP:9876,进入配置页面:
![配置页面:左侧基础设置,右侧 DNS 服务商设置]
整个配置分为四个区域:
| 区域 | 说明 |
|---|---|
| DNS 服务商 | 选择你的域名托管商,填入 API 凭据 |
| IPv4 / IPv6 | 配置 IP 获取方式和要解析的域名 |
| Webhook | IP 更新时发送通知 |
| 设置 | 登录密码、轮询间隔等 |
第一步:选择 DNS 服务商
支持以下主流服务商:
| 服务商 | 需要的信息 | 说明 |
|---|---|---|
| 阿里云 DNS | AccessKey ID + Secret | RAM 用户需授权 AliyunDNSFullAccess |
| 腾讯云 DNSPod | SecretId + SecretKey | 在 API 密钥管理页面创建 |
| Cloudflare | API Token 或 Global API Key | 推荐使用 API Token,仅给 DNS:Edit 权限 |
| 华为云 DNS | AccessKey + SecretKey | IAM 用户授权 DNS 管理 |
| DuckDNS | Token | 免费域名服务,配置最简单 |
| Google Domains | 用户名 + 密码 | 自动同步 |
| 自定义回调 | URL 模板 | 自建 DNS 服务或支持 API 的任意服务商 |
💡 Cloudflare 用户注意事项:
- API Token 访问:需创建 Token,权限为
Zone:DNS:Edit,指定具体域名- Global API Key:路径
My Profile → API Tokens → Global API Key- 推荐使用 API Token,更安全
第二步:配置 IP 获取方式
IPv4 获取方式:
| 方式 | 说明 | 推荐场景 |
|---|---|---|
| 通过接口获取 | 自动从 ipv4.ip.sb 等接口获取公网 IP |
家庭宽带,最简单 |
| 通过网卡获取 | 获取指定网卡上的 IP(需设备有公网 IP) | 服务器直连公网 |
| 通过命令获取 | 执行自定义命令获取 IP | 特殊网络环境 |
| 禁用 IPv4 | 不更新 IPv4 解析 | 纯 IPv6 环境 |
IPv6 获取方式类似,同样支持接口、网卡、命令三种来源。
⚠️ 如果路由器或服务器直接有公网 IP,推荐使用 「通过网卡获取」,不依赖外部接口更可靠。
第三步:添加域名解析
在 「Domains」 输入框中填写要解析的域名,每行一个:
example.com
www.example.com
api.example.com
ddns-go 会自动创建或更新指定域名的 A 记录(IPv4)和 AAAA 记录(IPv6)。
第四步:设置 Webhook(可选)
IP 更新时可以通过 Webhook 发送通知:
{
"url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx",
"requestBody": "{\"msgtype\":\"text\",\"text\":{\"content\":\"IP 已更新为 {{ipv4}}\"}}"
}
内置的 {{ipv4}} 和 {{ipv6}} 占位符会替换为最新的 IP 地址。
支持的 Webhook 类型:
- 企业微信机器人
- 钉钉机器人
- 飞书机器人
- Server 酱
- PushPlus
- 自定义 URL
第五步:设置密码(安全)
配置完成后,建议立即设置登录密码:设置 → 开启登录验证。
不设置密码意味着局域网内任何知道地址的人都可以修改你的 DDNS 配置。
命令行参数
ddns-go 常用参数:
-l ":9876" # Web 监听地址和端口
-f 300 # 轮询间隔(秒),默认 300 秒
-c "/path/config" # 指定配置文件路径
-s install # 安装为系统服务
-s uninstall # 卸载系统服务
-s status # 查看服务状态
-s restart # 重启服务
-delay 60 # 启动后延迟 60 秒再开始检查(等网络就绪)
-dns cloudflare # 通过命令行指定 DNS 服务商(非交互模式)
-secret 123456 # Web 界面登录密码
示例:自定义端口和轮询间隔
# Docker 方式
docker run -d --name ddns-go --restart=always \
-p 8080:8080 \
-v /opt/ddns-go:/root \
jeessy/ddns-go:latest \
-l :8080 -f 60
# 直接运行
./ddns-go -l :8080 -f 60
实际部署场景
场景 1:家庭 NAS + 阿里云 DDNS
宽带拨号 → 公网 IP(动态)
↓
ddns-go(Docker 跑在 NAS 上)
↓
阿里云 DNS A 记录自动更新
↓
通过域名随时访问 NAS
配置要点:
- DNS 服务商:阿里云
- IPv4 获取方式:通过接口获取(
ipv4.ip.sb) - 域名:
nas.example.com - 轮询间隔:5 分钟(默认即可)
- 建议配合 端口转发 或 frp 使用
场景 2:软路由 OpenWrt
# 安装
opkg install ddns-go
# 配置
# OpenWrt 版本安装后自带 LuCI 界面
# 或通过 http://192.168.1.1:9876 配置
# 利用 OpenWrt 的稳定性,24 小时在线
# 路由器重启后 ddns-go 自动启动
场景 3:公司内网穿透
公司内网服务器(无公网 IP)
↓
frp / Tailscale / ZeroTier
↓
ddns-go 更新公网入口 IP
↓
员工通过域名访问内部服务
场景 4:IPv6 纯环境
很多家庭宽带虽然不给 IPv4 公网地址,但 IPv6 是公网的:
配置:
IPv4:禁用
IPv6:通过网卡获取(或通过接口获取)
域名解析:只更新 AAAA 记录
客户端:需要支持 IPv6 才能访问
常见问题
Q:ddns-go 多久检查一次 IP 变化?
默认 300 秒(5 分钟)。可以用 -f 参数调整:
# 每分钟检查一次
./ddns-go -f 60
不建议低于 60 秒,容易被 DNS 服务商的 API 频率限制。
Q:如何确认配置生效了?
查看日志 —— Web 界面底部就有实时日志输出,或者通过 docker logs 查看:
docker logs -f ddns-go
正常日志类似:
[2025-01-15 10:30:00] 当前 IP: 1.2.3.4
[2025-01-15 10:30:00] 域名 example.com 已更新为 1.2.3.4
Q:多个域名共用同一个 IP,需要重复配置吗?
不需要。在 「Domains」 输入框中每行写一个域名即可,一次配置全量更新:
example.com
www.example.com
blog.example.com
Q:公网 IP 怎么确认?
登录路由器查看 WAN 口 IP,然后用手机 4G/5G 网络 ping 一下试试:
# 查看你的公网 IP
curl ip.sb
# 测试是否能从外网 ping 通
ping your-domain.com
如果路由器 WAN 口 IP 和 ip.sb 返回的不一致,说明你在大内网(NAT 级联),DDNS 也无法从外网访问。
Q:支持哪些 DNS 服务商?
| 服务商 | 支持情况 |
|---|---|
| 阿里云 DNS | ✅ 完整支持 |
| 腾讯云 DNSPod | ✅ 完整支持 |
| Cloudflare | ✅ 完整支持 |
| 华为云 DNS | ✅ 完整支持 |
| DuckDNS | ✅ 支持 |
| Google Domains | ✅ 支持 |
| Porkbun | ✅ 支持 |
| Namecheap | ✅ 支持 |
| NameSilo | ✅ 支持 |
| 自定义回调 | ✅ 任意 HTTP API |
查看 完整列表。
Q:群晖里装了 ddns-go,和群晖自带的 DDNS 冲突吗?
不冲突。群晖自带 DDNS 只支持 Synology 自家的域名或少数服务商。ddns-go 是独立的服务,可以同时运行。
Q:配置存在哪里?
配置文件保存在:
- Docker:映射目录
/root下(即宿主机的/opt/ddns-go) - 直接安装:与二进制同目录,或
-c参数指定路径
核心文件:
/root/ddns-go.yaml— 配置文件(账号密码、域名列表、DNS 服务商凭据)
⚠️ DNS 服务商的 API 密钥明文存储在此文件中,注意文件权限。
与同类工具对比
| 特性 | ddns-go | ddclient | inadyn | nsupdate |
|---|---|---|---|---|
| 配置方式 | Web 界面 | 配置文件 | 配置文件 | 命令行 |
| 安装难度 | ⭐ 极低 | ⭐⭐⭐ 中等 | ⭐⭐ 低 | ⭐⭐⭐⭐ 高 |
| Docker 支持 | ✅ 官方 | ❌ 需自制 | ❌ 需自制 | ❌ |
| 多服务商 | 15+ 家 | 30+ 家 | 20+ 家 | 仅 Bind |
| IPv6 支持 | ✅ | ✅ | ✅ | ✅ |
| Webhook | ✅ 内置 | ❌ | ❌ | ❌ |
| 界面语言 | 中文 + 英文 | 英文 | 英文 | 英文 |
| 资源占用 | ~10MB | ~20MB | ~10MB | ~5MB |
| 更新频率 | 活跃 | 较慢 | 较慢 | 随系统 |
一句话:ddns-go 是目前对中文用户最友好的 DDNS 工具,Web 配置 + 中文界面 + 国内 DNS 服务商直连。
总结
| 维度 | 评价 |
|---|---|
| 上手难度 | ⭐ 极低,Docker 或二进制运行后 Web 配置 |
| 功能完整度 | ⭐⭐⭐⭐ 主流服务商全覆盖,IPv4/IPv6 双栈 |
| 界面体验 | ⭐⭐⭐⭐ 中文界面,清清爽爽 |
| 资源占用 | ⭐⭐⭐⭐⭐ Go 编译的单二进制 ~10MB |
| 社区活跃度 | ⭐⭐⭐⭐ GitHub 10k+ Star |
| 适合人群 | 家庭 NAS 用户 → 软路由玩家 → 中小企业服务器 |
一句话总结:如果你需要一个免费的 DDNS 客户端,要求配置简单、中文界面、支持国内云厂商 —— ddns-go 是最佳选择,没有之一。