news 2026/6/1 12:00:02

DDNS动态域名解析方案对比与实战配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DDNS动态域名解析方案对比与实战配置

本文详解DDNS工作原理、主流方案对比,以及在各种场景下的实战配置。

前言

家里的宽带IP是动态的,每次重启光猫IP就变了。想从外面访问家里的服务器,怎么办?

DDNS(Dynamic DNS)就是解决这个问题的:自动检测IP变化,自动更新域名解析。

今天来聊聊各种DDNS方案的选择和配置。


一、DDNS原理

1.1 动态IP的问题

运营商给家庭宽带分配的通常是动态公网IP:

  • IP地址会变化(重启、租期到期)
  • 无法用固定IP访问

1.2 DDNS如何解决

┌─────────────┐ IP变化 ┌─────────────┐ │ 家庭路由 │ ──检测到──→ │ DDNS客户端 │ │ IP:1.2.3.4 │ │ │ └─────────────┘ └──────┬──────┘ │ 调用API更新 ↓ ┌─────────────┐ │ DNS服务商 │ │ example.com │ │ → 1.2.3.4 │ └─────────────┘

工作流程:

  1. DDNS客户端定期检测本机公网IP
  2. 发现IP变化后,调用DNS服务商API
  3. 更新域名的A记录
  4. 域名始终指向当前IP

二、DDNS方案对比

2.1 免费DDNS服务

服务域名优点缺点
No-IPxxx.ddns.net免费、客户端多需每月确认
DuckDNSxxx.duckdns.org完全免费域名不好看
Dynuxxx.dynu.net免费、功能全速度一般
FreeDNS多种子域名选择多稳定性一般

2.2 国内DNS服务商

服务商支持DDNSAPI调用适合场景
阿里云DNS有官方API有自己域名
腾讯云DNS有官方API有自己域名
Cloudflare有API海外访问
华为云DNS有API华为云用户

2.3 路由器内置

很多路由器/光猫内置DDNS功能:

  • 花生壳
  • No-IP
  • 自定义

三、阿里云DDNS配置

3.1 前置条件

  1. 有一个域名(托管在阿里云)
  2. 创建AccessKey

3.2 获取AccessKey

  1. 登录阿里云控制台
  2. 右上角头像 → AccessKey管理
  3. 创建AccessKey,保存好ID和Secret

3.3 使用Shell脚本

#!/bin/bash# aliyun-ddns.sh# 配置区ACCESS_KEY_ID="your_access_key_id"ACCESS_KEY_SECRET="your_access_key_secret"DOMAIN="example.com"SUBDOMAIN="home"# 完整域名是 home.example.com# 获取当前公网IPget_current_ip(){curl-s http://ip.3322.net||\curl-s http://ifconfig.me||\curl-s http://ipinfo.io/ip}# 获取当前DNS记录get_dns_ip(){aliyun alidns DescribeDomainRecords\--DomainName"$DOMAIN"\--RRKeyWord"$SUBDOMAIN"\--Type"A"2>/dev/null|\jq -r'.DomainRecords.Record[0].Value'}# 更新DNS记录update_dns(){localrecord_id=$1localip=$2aliyun alidns UpdateDomainRecord\--RecordId"$record_id"\--RR"$SUBDOMAIN"\--Type"A"\--Value"$ip"}# 主逻辑current_ip=$(get_current_ip)dns_ip=$(get_dns_ip)if["$current_ip"!="$dns_ip"];thenecho"$(date): IP changed from$dns_ipto$current_ip"record_id=$(aliyun alidns DescribeDomainRecords\--DomainName"$DOMAIN"\--RRKeyWord"$SUBDOMAIN"|\jq -r'.DomainRecords.Record[0].RecordId')update_dns"$record_id""$current_ip"echo"DNS updated successfully"elseecho"$(date): IP unchanged ($current_ip)"fi

3.4 使用第三方工具(推荐)

ddns-go是一个优秀的开源DDNS工具:

# 下载wgethttps://github.com/jeessy2/ddns-go/releases/download/v5.6.0/ddns-go_5.6.0_linux_x86_64.tar.gztarxf ddns-go*.tar.gz# 运行./ddns-go# 访问 http://localhost:9876 配置

ddns-go优点:

  • Web界面配置
  • 支持多种DNS服务商
  • 支持IPv6
  • 支持Webhook通知

四、腾讯云DDNS配置

4.1 获取密钥

  1. 登录腾讯云控制台
  2. 访问密钥管理
  3. 创建API密钥

4.2 Python脚本

#!/usr/bin/env python3# tencent_ddns.pyimportjsonimportrequestsfromtencentcloud.commonimportcredentialfromtencentcloud.dnspod.v20210323importdnspod_client,models# 配置SECRET_ID="your_secret_id"SECRET_KEY="your_secret_key"DOMAIN="example.com"SUBDOMAIN="home"defget_current_ip():"""获取当前公网IP"""services=['http://ip.3322.net','http://ifconfig.me','http://ipinfo.io/ip']forserviceinservices:try:resp=requests.get(service,timeout=5)returnresp.text.strip()except:continuereturnNonedefget_dns_record():"""获取DNS记录"""cred=credential.Credential(SECRET_ID,SECRET_KEY)client=dnspod_client.DnspodClient(cred,"")req=models.DescribeRecordListRequest()req.Domain=DOMAIN req.Subdomain=SUBDOMAIN resp=client.DescribeRecordList(req)ifresp.RecordList:returnresp.RecordList[0]returnNonedefupdate_dns_record(record_id,ip):"""更新DNS记录"""cred=credential.Credential(SECRET_ID,SECRET_KEY)client=dnspod_client.DnspodClient(cred,"")req=models.ModifyRecordRequest()req.Domain=DOMAIN req.RecordId=record_id req.SubDomain=SUBDOMAIN req.RecordType="A"req.RecordLine="默认"req.Value=ip client.ModifyRecord(req)print(f"Updated{SUBDOMAIN}.{DOMAIN}to{ip}")if__name__=="__main__":current_ip=get_current_ip()record=get_dns_record()ifrecordandrecord.Value!=current_ip:update_dns_record(record.RecordId,current_ip)else:print(f"IP unchanged:{current_ip}")

4.3 安装依赖

pipinstalltencentcloud-sdk-python requests

五、Cloudflare DDNS配置

5.1 获取API Token

  1. 登录Cloudflare
  2. My Profile → API Tokens
  3. Create Token → Edit zone DNS

5.2 使用Shell脚本

#!/bin/bash# cloudflare-ddns.sh# 配置CF_API_TOKEN="your_api_token"CF_ZONE_ID="your_zone_id"CF_RECORD_NAME="home.example.com"# 获取当前IPCURRENT_IP=$(curl-s http://ipinfo.io/ip)# 获取DNS记录IDRECORD_ID=$(curl-s -X GET"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records?name=$CF_RECORD_NAME"\-H"Authorization: Bearer$CF_API_TOKEN"\-H"Content-Type: application/json"|jq -r'.result[0].id')# 获取当前DNS记录的IPDNS_IP=$(curl-s -X GET"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID"\-H"Authorization: Bearer$CF_API_TOKEN"\-H"Content-Type: application/json"|jq -r'.result.content')# 更新DNSif["$CURRENT_IP"!="$DNS_IP"];thenecho"Updating DNS:$DNS_IP->$CURRENT_IP"curl-s -X PUT"https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID"\-H"Authorization: Bearer$CF_API_TOKEN"\-H"Content-Type: application/json"\--data"{\"type\":\"A\",\"name\":\"$CF_RECORD_NAME\",\"content\":\"$CURRENT_IP\",\"ttl\":120,\"proxied\":false}"echo"DNS updated"elseecho"IP unchanged:$CURRENT_IP"fi

六、定时任务配置

6.1 Cron定时执行

# 编辑crontabcrontab-e# 每5分钟检查一次*/5 * * * * /path/to/ddns-script.sh>>/var/log/ddns.log2>&1

6.2 Systemd Timer

# /etc/systemd/system/ddns.service[Unit]Description=DDNS Update Service[Service]Type=oneshotExecStart=/path/to/ddns-script.sh# /etc/systemd/system/ddns.timer[Unit]Description=DDNS Update Timer[Timer]OnBootSec=1minOnUnitActiveSec=5min[Install]WantedBy=timers.target
systemctlenableddns.timer systemctl start ddns.timer

七、路由器DDNS配置

7.1 OpenWrt内置DDNS

# 安装ddns脚本opkg update opkginstallddns-scripts luci-app-ddns# Web界面配置# Services → Dynamic DNS

7.2 常见路由器

华硕路由器:

  • 外部网络 → DDNS → 选择服务商配置

小米路由器:

  • 高级设置 → DDNS → 配置账号

TP-Link:

  • 应用管理 → DDNS → 配置

八、没有公网IP怎么办

8.1 检测是否有公网IP

# 方法1:比较内外网IP# 路由器WAN口IProute -n|grepUG# 公网IPcurlip.3322.net# 如果两个IP不一样,说明没有公网IP

8.2 替代方案

如果运营商没有给公网IP(大内网),DDNS就没用了。替代方案:

  1. 向运营商申请公网IP:打客服电话,说要监控/远程办公

  2. 使用组网软件:如星空组网,不需要公网IP也能远程访问

    • 安装客户端
    • 登录同一账号
    • 通过虚拟IP访问
  3. 内网穿透:frp、ngrok等


九、DDNS + 端口映射

有了DDNS域名,还需要配置端口映射才能访问内网服务:

互联网 → home.example.com:8080 → 路由器:8080 → 内网服务器:80

路由器端口映射配置:

  • 外部端口:8080
  • 内部IP:192.168.1.100
  • 内部端口:80
  • 协议:TCP

安全建议:

  • 不要映射22端口到公网
  • 使用非标准端口
  • 配合fail2ban等安全措施
  • 或者用组网软件替代端口映射,更安全

十、总结

DDNS方案选择建议:

场景推荐方案
快速体验DuckDNS(完全免费)
有自己域名ddns-go + 阿里云/腾讯云
海外访问Cloudflare
路由器方案OpenWrt ddns-scripts
无公网IP组网软件(如星空组网)

DDNS虽然能解决动态IP问题,但还要配合端口映射使用,有一定安全风险。如果不想折腾,直接用组网软件可能是更简单的选择。


参考资料

  1. ddns-go: https://github.com/jeessy2/ddns-go
  2. 阿里云DNS API: https://help.aliyun.com/document_detail/29739.html
  3. Cloudflare API: https://api.cloudflare.com/

💡提示:DDNS更新有延迟(取决于TTL设置),建议TTL设置短一些(如120秒)。但太短会增加DNS查询次数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 10:20:24

ComfyUI与玻璃艺术结合:光影效果AI模拟实验

ComfyUI与玻璃艺术结合:光影效果AI模拟实验 在数字艺术创作的前沿,一个日益凸显的挑战是:如何让AI不仅“画得像”,还能“理解材质”?尤其是在表现玻璃这种兼具透明、折射、反射和辉光特性的复杂介质时,传统…

作者头像 李华
网站建设 2026/5/29 10:52:32

ComfyUI工作流依赖管理机制设计:确保可复现性

ComfyUI工作流依赖管理机制设计:确保可复现性 在生成式AI迅速渗透内容创作领域的今天,一个看似简单的问题却困扰着无数开发者与创作者:为什么同样的提示词,在不同时间或不同电脑上生成的图像却不一致?更令人头疼的是&a…

作者头像 李华
网站建设 2026/6/1 8:08:05

腾讯Hunyuan-1.8B-Instruct-AWQ-Int4开源:轻量化大模型引领边缘智能革命

2025年,中国人工智能市场迎来爆发式增长,整体规模突破7470亿元大关,其中生成式AI业务贡献了41%的同比增幅。然而,繁荣背后隐藏着行业痛点:企业级AI应用落地仍面临"三重壁垒"——动辄千万级的部署成本、专业技…

作者头像 李华
网站建设 2026/5/31 21:47:38

1.4 实战项目:用AI从零构建项目管理工具原型

1.4 实战项目:用AI从零构建项目管理工具原型 经过前三节课的学习,我们已经掌握了AI编程工具的基本概念、主流大语言模型的特点以及开发环境的搭建。现在是时候将这些知识付诸实践了!本节课我们将使用AI工具从零开始构建一个项目管理工具原型,亲身体验AI如何显著提升我们的…

作者头像 李华
网站建设 2026/5/29 20:27:18

1.4 首个AI项目实战:打造智能项目管理工具原型

1.4 首个AI项目实战:打造智能项目管理工具原型 在前面几节中,我们学习了AI编程的基本概念、主流大模型的特点以及开发环境的搭建。现在,让我们动手实践,使用AI编程工具来构建第一个项目——一个智能项目管理工具原型。这将帮助你将理论知识转化为实际技能。 项目概述 我…

作者头像 李华
网站建设 2026/5/31 2:01:47

2.4 实战项目:构建智能数据库查询工具

2.4 实战项目:构建智能数据库查询工具 在前几节课中,我们学习了Cursor的核心功能、四步开发法以及高级技巧。现在,让我们通过一个完整的实战项目来巩固所学知识。本节课将带领大家构建一个智能数据库查询工具,该工具能够通过自然语言与用户交互,自动生成并执行SQL查询语句…

作者头像 李华