以下是阿里云DDNS(动态域名解析)的设置与域名解析详细教程,帮助你将动态公网IP绑定到域名:
一、前期准备
- 阿里云账号
- 注册阿里云账号并完成实名认证。
- 域名
- 在阿里云域名服务中购买一个域名(如
example.com
),或使用已有域名。
- 在阿里云域名服务中购买一个域名(如
- AccessKey
- 获取阿里云API的AccessKey(用于DDNS脚本鉴权):
- 登录阿里云控制台 → 鼠标悬停右上角头像 → AccessKey管理 → 创建AccessKey(保存
AccessKey ID
和AccessKey Secret
)。
- 登录阿里云控制台 → 鼠标悬停右上角头像 → AccessKey管理 → 创建AccessKey(保存
- 获取阿里云API的AccessKey(用于DDNS脚本鉴权):
二、域名解析设置
- 添加解析记录
- 进入 阿里云控制台 → 域名 → 域名列表 → 点击域名进入解析设置。
- 添加一条记录:
- 主机记录:如
ddns
(最终域名为ddns.example.com
) - 记录类型:
A
- 记录值:随意填写(如
1.1.1.1
,后续DDNS脚本会自动更新) - TTL:建议
10分钟
(根据需求调整)
- 主机记录:如
三、配置DDNS脚本
方案1:使用阿里云SDK(推荐)
-
安装Python环境
- 确保设备已安装Python 3.x(如树莓派、NAS等)。
-
安装阿里云SDK
pip install aliyun-python-sdk-alidns
-
编写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()
-
运行脚本
python3 aliyun_ddns.py
方案2:使用Shell脚本(curl调用API)
-
创建脚本
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
-
赋予执行权限并运行:
chmod +x aliyun_ddns.sh ./aliyun_ddns.sh
四、自动化定时执行
-
Linux系统(Crontab)
每30分钟运行一次脚本:crontab -e
添加以下行:
*/30 * * * * /usr/bin/python3 /path/to/aliyun_ddns.py >/dev/null 2>&1
-
Windows系统(任务计划程序)
- 创建定时任务,配置为定期运行Python脚本。
五、验证与调试
-
检查解析记录
ping ddns.example.com
或使用在线工具(如 ping.chinaz.com)查看解析是否生效。
-
日志排查
- 如果失败,检查脚本输出的错误信息或阿里云API返回的JSON响应。
注意事项
- 安全建议
- 保护AccessKey,避免泄露(可设置RAM子账号权限)。
- IPv6支持
- 如需IPv6,将记录类型改为
AAAA
,并修改脚本中的IP获取逻辑。
- 如需IPv6,将记录类型改为
- 多级子域名
- 如需要
home.ddns.example.com
,主机记录填写home.ddns
。
- 如需要
通过以上步骤,你的动态公网IP即可自动绑定到域名,实现稳定的远程访问。
// 来源:https://www.nzw6.com