引言:为什么你需要动态 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
2
3
4
5
# 替换成你想部署版本的链接
wget https://github.com/jeessy2/ddns-go/releases/download/v6.2.3/ddns-go_6.2.3_linux_x86_64.tar.gz

# 解压
tar -zxvf ddns-go_6.2.3_linux_x86_64.tar.gz

移动到系统路径:

1
2
sudo mv ddns-go /usr/local/bin/
sudo chmod +x /usr/local/bin/ddns-go

创建服务文件:

1
sudo vim /etc/systemd/system/ddns-go.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Simple and easy to use DDNS. Automatically update domain name resolution to public IP (Support Aliyun, Tencent Cloud, Dnspod, Cloudflare, Callback, Huawei Cloud, Baidu Cloud, Porkbun, GoDaddy...)
ConditionFileIsExecutable=/root/ddns-go

Requires=network.target
After=network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/root/ddns-go "-l" ":9876" "-f" "300" "-cacheTimes" "5" "-c" "/root/.ddns_go_config.yaml"
Restart=always

RestartSec=120
EnvironmentFile=-/etc/sysconfig/ddns-go

[Install]
WantedBy=multi-user.target

启动并管理服务:

  1. 重载 Systemd 配置:让 systemd 读取我们刚刚创建的新服务文件。

    1
    sudo systemctl daemon-reload
  2. 启动 ddns-go 服务

    1
    sudo systemctl start ddns-go
  3. 设置开机自启

    1
    sudo systemctl enable ddns-go
  4. 检查服务状态:确认服务是否正常运行。

    1
    sudo systemctl status ddns-go

通过 Docker Compose 部署

  1. 在您的服务器上安装 Docker 和 Docker Compose。

  2. 创建一个新的文件夹,例如 mkdir /opt/ddns-go

  3. 在该文件夹下创建一个 docker-compose.yml 文件,并粘贴以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    services:
    ddns-go:
    image: jeessy/ddns-go
    container_name: ddns-go
    restart: always
    network_mode: "host" # 关键:使用 host 网络模式,让容器能直接获取宿主机的真实 IP
    volumes:
    - ./config:/root/.ddns-go # 将配置文件挂载到当前目录的 config 文件夹下
  4. docker-compose.yml 文件所在的目录,运行启动命令:

    1
    docker-compose up -d

    稍等片刻,ddns-go 服务就成功运行了!

通过 Web UI 进行配置

  1. 打开浏览器,访问 http://<你的服务器IP地址>:9876
  2. 您会看到 ddns-go 的配置界面。我们以 Cloudflare 为例进行说明。
  3. 选择 DNS 服务商:在下拉列表中选择 Cloudflare
  4. 获取 API Token
    • 登录您的 Cloudflare 账号。
    • 进入 我的个人资料 -> API 令牌 -> 创建令牌
    • 选择 编辑区域 DNS 这个模板。
    • 在“区域资源”中,选择您想要操作的那个主域名。
    • 创建令牌后,复制生成的 Token
  5. 填写配置
    • 将复制的 Token 粘贴到 ddns-go 界面的 Token 输入框中。
    • IPv4
      • 勾选 启用
      • Domains 框中填写您想设置的完整域名,例如 home.yourdomain.com
    • IPv6
      • 勾选 启用
      • Domains 框中填写同一个域名,或者另一个域名,例如 ipv6.yourdomain.com
  6. 保存:点击页面底部的 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}'

各部分功能:

  1. ip -6 a - 显示所有IPv6地址信息
  2. grep /64 - 过滤出包含”/64”的行(IPv6子网掩码)
  3. awk处理
    • -F '[ \t]+|/' - 设置字段分隔符为空格、制表符或斜杠
    • $3 == "::1" { next;} - 跳过IPv6回环地址(::1)
    • $3 ~ /^fe80::/ { next;} - 跳过链路本地地址(fe80::开头)
    • /inet6/ {print $3} - 打印符合条件的IPv6地址(第3个字段)

通过拼接得到其他设备的ipv6地址:

1
2
ip -6 route | awk '/2409:[0-9a-f:]*\// {split($1, a, "/"); sub(/:+$/, ":", a[1]); print a[1] "any other suffix of other mac"}'
# 把any other suffix of other mac改成其设备的IPv6(EUI-64)后缀