阿里云DDNS设置与域名解析教程_详细步骤与配置指南

2025-05-02 41

Image

以下是阿里云DDNS(动态域名解析)的设置与域名解析详细教程,帮助你将动态公网IP绑定到域名:


一、前期准备

  1. 阿里云账号
    • 注册阿里云账号并完成实名认证。
  2. 域名
    • 在阿里云域名服务中购买一个域名(如example.com),或使用已有域名。
  3. AccessKey
    • 获取阿里云API的AccessKey(用于DDNS脚本鉴权):
      • 登录阿里云控制台 → 鼠标悬停右上角头像 → AccessKey管理 → 创建AccessKey(保存AccessKey IDAccessKey Secret)。

二、域名解析设置

  1. 添加解析记录
    • 进入 阿里云控制台 → 域名 → 域名列表 → 点击域名进入解析设置
    • 添加一条记录:
      • 主机记录:如 ddns(最终域名为 ddns.example.com
      • 记录类型A
      • 记录值:随意填写(如 1.1.1.1,后续DDNS脚本会自动更新)
      • TTL:建议 10分钟(根据需求调整)

三、配置DDNS脚本

方案1:使用阿里云SDK(推荐)

  1. 安装Python环境

    • 确保设备已安装Python 3.x(如树莓派、NAS等)。
  2. 安装阿里云SDK

    pip install aliyun-python-sdk-alidns
    
  3. 编写DDNS脚本
    创建文件 aliyun_ddns.py,填入以下内容(需替换你的配置):

    #!/usr/bin/env python3
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest
    import requests
    import json
    
    # 配置项
    ACCESS_KEY_ID = "你的AccessKey ID"
    ACCESS_KEY_SECRET = "你的AccessKey Secret"
    DOMAIN = "example.com"  # 主域名
    SUB_DOMAIN = "ddns"     # 子域名(如ddns.example.com)
    TTL = 600               # TTL时间(秒)
    
    # 获取当前公网IP
    def get_public_ip():
        try:
            return requests.get('https://api.ipify.org').text
        except:
            return None
    
    # 更新阿里云解析记录
    def update_dns_record(client, ip, record_id):
        request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
        request.set_RecordId(record_id)
        request.set_RR(SUB_DOMAIN)
        request.set_Type("A")
        request.set_Value(ip)
        request.set_TTL(TTL)
        client.do_action_with_exception(request)
        print(f"更新成功: {SUB_DOMAIN}.{DOMAIN} → {ip}")
    
    # 主逻辑
    def main():
        client = AcsClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, 'cn-hangzhou')
        current_ip = get_public_ip()
        if not current_ip:
            print("获取公网IP失败!")
            return
    
        # 查询现有解析记录
        request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
        request.set_DomainName(DOMAIN)
        response = client.do_action_with_exception(request)
        records = json.loads(response.decode('utf-8'))['DomainRecords']['Record']
        record = next((r for r in records if r['RR'] == SUB_DOMAIN and r['Type'] == 'A'), None)
    
        if record and record['Value'] != current_ip:
            update_dns_record(client, current_ip, record['RecordId'])
        else:
            print("IP未变化,无需更新。")
    
    if __name__ == '__main__':
        main()
    
  4. 运行脚本

    python3 aliyun_ddns.py
    

方案2:使用Shell脚本(curl调用API)

  1. 创建脚本 aliyun_ddns.sh

    #!/bin/bash
    # 配置信息
    ACCESS_KEY_ID="你的AccessKey ID"
    ACCESS_KEY_SECRET="你的AccessKey Secret"
    DOMAIN="example.com"
    SUB_DOMAIN="ddns"
    TTL="600"
    
    # 获取当前公网IP
    CURRENT_IP=$(curl -s https://api.ipify.org)
    if [ -z "$CURRENT_IP" ]; then
        echo "获取IP失败"
        exit 1
    fi
    
    # 获取解析记录ID
    TIMESTAMP=$(date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ")
    SIGNATURE="$(echo -n "GET&%2F&AccessKeyId%3D${ACCESS_KEY_ID}%26Action%3DDescribeDomainRecords%26DomainName%3D${DOMAIN}%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D${TIMESTAMP}%26SignatureVersion%3D1.0%26Timestamp%3D${TIMESTAMP}%26Version%3D2015-01-09" | openssl dgst -sha1 -hmac "${ACCESS_KEY_SECRET}&" -binary | base64)"
    
    RESPONSE=$(curl -s "http://alidns.aliyuncs.com/?Action=DescribeDomainRecords&DomainName=${DOMAIN}&SignatureMethod=HMAC-SHA1&SignatureNonce=${TIMESTAMP}&SignatureVersion=1.0&Timestamp=${TIMESTAMP}&Version=2015-01-09&AccessKeyId=${ACCESS_KEY_ID}&Format=JSON&Signature=${SIGNATURE}")
    RECORD_ID=$(echo $RESPONSE | jq -r ".DomainRecords.Record[] | select(.RR == \"${SUB_DOMAIN}\" and .Type == \"A\") | .RecordId")
    OLD_IP=$(echo $RESPONSE | jq -r ".DomainRecords.Record[] | select(.RR == \"${SUB_DOMAIN}\" and .Type == \"A\") | .Value")
    
    # 更新记录
    if [ "$OLD_IP" != "$CURRENT_IP" ]; then
        SIGNATURE=$(echo -n "GET&%2F&AccessKeyId%3D${ACCESS_KEY_ID}%26Action%3DUpdateDomainRecord%26Format%3DJSON%26RR%3D${SUB_DOMAIN}%26RecordId%3D${RECORD_ID}%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D${TIMESTAMP}%26SignatureVersion%3D1.0%26TTL%3D${TTL}%26Timestamp%3D${TIMESTAMP}%26Type%3DA%26Value%3D${CURRENT_IP}%26Version%3D2015-01-09" | openssl dgst -sha1 -hmac "${ACCESS_KEY_SECRET}&" -binary | base64)
        curl -s "http://alidns.aliyuncs.com/?Action=UpdateDomainRecord&RecordId=${RECORD_ID}&RR=${SUB_DOMAIN}&Type=A&Value=${CURRENT_IP}&TTL=${TTL}&SignatureMethod=HMAC-SHA1&SignatureNonce=${TIMESTAMP}&SignatureVersion=1.0&Timestamp=${TIMESTAMP}&Version=2015-01-09&AccessKeyId=${ACCESS_KEY_ID}&Format=JSON&Signature=${SIGNATURE}"
        echo "记录已更新: ${SUB_DOMAIN}.${DOMAIN} → ${CURRENT_IP}"
    else
        echo "IP未变化,无需更新。"
    fi
    
  2. 赋予执行权限并运行:

    chmod +x aliyun_ddns.sh
    ./aliyun_ddns.sh
    

四、自动化定时执行

  1. Linux系统(Crontab)
    每30分钟运行一次脚本:

    crontab -e
    

    添加以下行:

    */30 * * * * /usr/bin/python3 /path/to/aliyun_ddns.py >/dev/null 2>&1
    
  2. Windows系统(任务计划程序)

    • 创建定时任务,配置为定期运行Python脚本。

五、验证与调试

  1. 检查解析记录

    ping ddns.example.com
    

    或使用在线工具(如 ping.chinaz.com)查看解析是否生效。

  2. 日志排查

    • 如果失败,检查脚本输出的错误信息或阿里云API返回的JSON响应。

注意事项

  1. 安全建议
    • 保护AccessKey,避免泄露(可设置RAM子账号权限)。
  2. IPv6支持
    • 如需IPv6,将记录类型改为AAAA,并修改脚本中的IP获取逻辑。
  3. 多级子域名
    • 如需要 home.ddns.example.com,主机记录填写 home.ddns

通过以上步骤,你的动态公网IP即可自动绑定到域名,实现稳定的远程访问。

// 来源:https://www.nzw6.com

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关