news 2025/12/18 15:55:09

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/16 6:47:56

ComfyUI与社交平台头像生成结合:个性化IP打造工具

ComfyUI与社交平台头像生成结合:个性化IP打造工具 在数字身份日益重要的今天,一个独特的头像早已不只是社交平台上的小图示——它可能是你在 Twitter 上被记住的第一印象,是你在微信朋友圈中传递气质的视觉符号,甚至是你个人品牌的…

作者头像 李华
网站建设 2025/12/16 6:47:55

ComfyUI中使用Style Transfer节点的艺术化处理

ComfyUI中使用Style Transfer节点的艺术化处理 在数字艺术创作的前沿,越来越多设计师和AI开发者不再满足于“输入提示词、点击生成”这种黑箱式操作。他们渴望对图像生成过程拥有真正的控制权——从风格强度到细节保留,从结构引导到多阶段融合。正是在这…

作者头像 李华
网站建设 2025/12/16 6:47:53

27、基于地理关联数据的用户与位置建模剖析

基于地理关联数据的用户与位置建模剖析 在地理信息分析与用户行为研究领域,利用地理关联数据进行位置与用户的建模分析具有重要意义。下面将详细介绍相关的建模方法、数据处理流程以及核心算法。 地理关联数据可视化与基础建模 地理关联数据的可视化是初步了解地理信息分布…

作者头像 李华
网站建设 2025/12/17 1:38:35

2.1 Cursor进阶技巧:Rules设置与文档集成全攻略

2.1 Cursor进阶技巧:Rules设置与文档集成全攻略 在掌握了Cursor的基本使用之后,我们需要深入了解其高级功能,以充分发挥AI编程工具的潜力。本节将重点介绍Cursor的Rules设置和文档集成功能,这些功能能够显著提升你的开发效率和代码质量。 Cursor Rules系统详解 Cursor R…

作者头像 李华
网站建设 2025/12/17 1:38:33

英伟达数学推理新突破:15亿参数模型性能媲美完整版DeepSeek-R1

英伟达数学推理新突破:15亿参数模型性能媲美完整版DeepSeek-R1 【免费下载链接】OpenReasoning-Nemotron-32B 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/OpenReasoning-Nemotron-32B 在人工智能数学推理领域,一场静悄悄的革命正在上演…

作者头像 李华
网站建设 2025/12/17 1:38:32

10、网络传输与会话管理工具:lftp 与 screen 实用指南

网络传输与会话管理工具:lftp 与 screen 实用指南 在当今网络环境中,数据传输的安全性和会话管理的便捷性至关重要。本文将介绍两个实用工具:lftp 和 screen,它们分别在数据传输和会话管理方面提供了强大的功能。 lftp:安全高效的数据传输工具 在网络数据传输中,加密是…

作者头像 李华