ddns动态域名解析
引言:为什么你需要动态 DNS?
你是否曾经想在外面访问家里的电脑、NAS 或摄像头,却因为家庭宽带的公网 IP 地址总是在变化而烦恼?对于我们这些喜欢自托管(Self-Hosting)和远程办公的人来说,这是一个常见的痛点。
家庭宽带通常提供的是“动态 IP”,每次路由器重启或网络波动后,运营商都可能给你分配一个新的 IP 地址。这就好比你朋友家的门牌号天天换,你永远不知道该去哪找他。
为了解决这个问题,动态 DNS (Dynamic DNS, 简称 DDNS) 应运而生。就像一个自动化的地址簿,当你的家庭 IP 地址变化时,会自动通知 DNS 服务商,将你的专属域名(比如 myhome.cool)更新到这个新的 IP 地址上。这样,无论 IP 怎么变,你只需要记住这个固定的域名就能随时回家。
什么是 ddns-go?为什么选择?
ddns-go 是一个使用 Go 语言编写的、开源的 DDNS 客户端。的核心任务就是检测你本地网络的公网 IP 地址,并在发生变化时,自动更新你在云服务商(如 Cloudflare, 阿里云等)那里的 DNS 记录。
选择 ddns-go 的理由非常充分:
- 简单易用:拥有一个美观且直观的 Web UI 界面,点几下鼠标就能完成所有配置。
- 跨平台:单个二进制文件,无需额外依赖,可以在 Windows, macOS, Linux, 路由器,树莓派等各种设备上运行。
- Docker 支持:官方提供 Docker 镜像,一条命令即可轻松部署。
- 功能强大:
- 同时支持 IPv4 和 IPv6。
- 支持国内外主流的 DNS 服务商(Cloudflare, 阿里云, 腾讯云, GoDaddy 等)。
- 支持 Webhook 通知,IP 地址变化时可以自动发送消息到钉钉、飞书、Discord 等。
- 支持多个域名、多张网卡的灵活配置。
安装与配置实战
通过 Systemd 部署
下载地址:ddns-go
1 | # 替换成你想部署版本的链接 |
移动到系统路径:
1 | sudo mv ddns-go /usr/local/bin/ |
创建服务文件:
1 | sudo vim /etc/systemd/system/ddns-go.service |
1 | [Unit] |
启动并管理服务:
重载 Systemd 配置:让
systemd读取我们刚刚创建的新服务文件。1
sudo systemctl daemon-reload
启动 ddns-go 服务:
1
sudo systemctl start ddns-go
设置开机自启:
1
sudo systemctl enable ddns-go
检查服务状态:确认服务是否正常运行。
1
sudo systemctl status ddns-go
通过 Docker Compose 部署
在您的服务器上安装 Docker 和 Docker Compose。
创建一个新的文件夹,例如
mkdir /opt/ddns-go。在该文件夹下创建一个
docker-compose.yml文件,并粘贴以下内容:1
2
3
4
5
6
7
8services:
ddns-go:
image: jeessy/ddns-go
container_name: ddns-go
restart: always
network_mode: "host" # 关键:使用 host 网络模式,让容器能直接获取宿主机的真实 IP
volumes:
- ./config:/root/.ddns-go # 将配置文件挂载到当前目录的 config 文件夹下在
docker-compose.yml文件所在的目录,运行启动命令:1
docker-compose up -d
稍等片刻,
ddns-go服务就成功运行了!
通过 Web UI 进行配置
- 打开浏览器,访问
http://<你的服务器IP地址>:9876。 - 您会看到
ddns-go的配置界面。我们以 Cloudflare 为例进行说明。 - 选择 DNS 服务商:在下拉列表中选择
Cloudflare。 - 获取 API Token:
- 登录您的 Cloudflare 账号。
- 进入
我的个人资料->API 令牌->创建令牌。 - 选择
编辑区域 DNS这个模板。 - 在“区域资源”中,选择您想要操作的那个主域名。
- 创建令牌后,复制生成的 Token。
- 填写配置:
- 将复制的 Token 粘贴到
ddns-go界面的Token输入框中。 - IPv4:
- 勾选
启用。 - 在
Domains框中填写您想设置的完整域名,例如home.yourdomain.com。
- 勾选
- IPv6:
- 勾选
启用。 - 在
Domains框中填写同一个域名,或者另一个域名,例如ipv6.yourdomain.com。
- 勾选
- 将复制的 Token 粘贴到
- 保存:点击页面底部的
Save按钮。
搞定!ddns-go 现在会开始自动检测您的 IP 地址,一旦发生变化,就会立即更新 Cloudflare 上的 DNS 记录。
通过命令获取ipv6地址
获取本设备ipv6:
1 | ip -6 a | grep /64 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' |
各部分功能:
ip -6 a- 显示所有IPv6地址信息grep /64- 过滤出包含”/64”的行(IPv6子网掩码)awk处理:-F '[ \t]+|/'- 设置字段分隔符为空格、制表符或斜杠$3 == "::1" { next;}- 跳过IPv6回环地址(::1)$3 ~ /^fe80::/ { next;}- 跳过链路本地地址(fe80::开头)/inet6/ {print $3}- 打印符合条件的IPv6地址(第3个字段)
通过拼接得到其他设备的ipv6地址:
1 | ip -6 route | awk '/2409:[0-9a-f:]*\// {split($1, a, "/"); sub(/:+$/, ":", a[1]); print a[1] "any other suffix of other mac"}' |