阿里云IPv6动态域名解析配置指南

2026-09-02 18:45:49 154阅读
本配置区域主要介绍了在阿里云实现IPv6动态域名解析(DDNS)的完整方案,核心内容涵盖阿里云解析API调用、AccessKey权限配置,以及通过自动化脚本实时检测本地公网IPv6地址并更新至DNS记录的流程,该方案有效解决了网络中IPv6地址动态变化导致无法稳定访问内网服务的问题,确保域名始终指向最新地址,实现服务的稳定访问。,*(注:您仅提供了标题,以上为基于该标题生成的标准摘要,如需针对具体配置代码或步骤进行总结,请提供详细内容。)*

拥抱IPv6时代:基于阿里云的IPv6动态域名解析(DDNS)保姆级实战指南 **

随着国家对IPv6部署的全面推进,如今大多数家庭宽带都已经分配了公网IPv6地址,这意味着,我们终于可以摆脱内网穿透的繁琐,直接通过IPv6地址从外部网络访问家里的NAS、软路由或家庭服务器了。

阿里云IPv6动态域名解析配置指南

新的问题随之而来:运营商分配的IPv6地址通常是动态的,重启路由器或每隔一段时间就会发生变化,难道每次出门前都要先记下一长串的IPv6地址吗?这时候,阿里云IPv6动态域名解析(DDNS)就成了最完美的解决方案,它能将随时变化的IPv6地址自动绑定到一个固定的域名上,让你随时随地轻松访问家庭网络。

下面,本文将手把手教你如何利用阿里云DNS和Python脚本,打造一个属于自己的IPv6 DDNS服务。

准备工作

在开始之前,你需要准备以下几样东西:

  1. 一个域名:如果你还没有域名,可以在阿里云万网购买一个,或者使用其他支持阿里云DNS解析的域名。
  2. 阿里云账号:用于管理域名和获取API密钥。
  3. 一台开机的设备:比如软路由、群晖NAS、树莓派或一台常开的Linux服务器,用于运行定时脚本。
  4. 家庭网络已开启IPv6:确保你的主路由器已获取IPv6前缀,且局域网设备能获取到公网IPv6地址。

配置阿里云DNS与获取AccessKey

  1. 设置域名解析 登录阿里云控制台,进入“云解析 DNS”,找到你的域名,添加一条解析记录:

    • 记录类型:选择 AAAA(这是IPv6专用的解析记录)。
    • 主机记录:填写你想要的子域名,home
    • 解析线路:默认。
    • 记录值:暂时随便填写一个合法的IPv6地址,2400:3200::1
    • TTL:建议设置短一些,如 600(10分钟),以便IP变化时能快速生效。
  2. 创建AccessKey 为了让脚本能自动修改解析记录,我们需要创建API密钥。

    • 鼠标悬停在控制台右上角头像上,点击 AccessKey 管理
    • 强烈建议:不要直接使用主账号创建AccessKey,而是点击“开始使用子用户AccessKey”创建一个RAM子用户。
    • 给子用户起个名字(如 ddns-bot),创建后记下 AccessKey IDAccessKey Secret注意:Secret只显示一次,请务必保存好)。
    • 给该子用户授权:在权限管理中,添加权限 AliyunDNSFullAccess(管理云解析DNS的权限)。

编写IPv6 DDNS脚本

我们使用Python和阿里云官方SDK来实现动态解析。

  1. 安装依赖 在你的运行设备上,确保安装了Python3,并执行以下命令安装阿里云SDK:

    pip3 install aliyun-python-sdk-core aliyun-python-sdk-alidns
  2. DDNS脚本代码 创建一个名为 aliyun_ddns_ipv6.py 的文件,填入以下代码:

import requests
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
AccessKeyId = '你的AccessKeyId'
AccessKeySecret = '你的AccessKeySecret'
DomainName = 'yourdomain.com'  # 你的主域名
SubDomain = 'home'            # 你的主机记录,home.yourdomain.com 中的 home
# ============================================
def get_local_ipv6():
    """获取当前设备的公网IPv6地址"""
    try:
        # 使用公共接口获取出口IPv6
        # 也可以通过 ifconfig 或 ip addr 命令解析本地网卡IP
        response = requests.get('https://api6.ipify.org?format=json', timeout=5)
        if response.status_code == 200:
            return response.json()['ip']
    except Exception as e:
        print(f"获取IPv6地址失败: {e}")
    return None
def update_dns_record(ipv6_addr):
    client = AcsClient(AccessKeyId, AccessKeySecret, 'cn-hangzhou')
    # 1. 查询现有记录
    describe_request = DescribeDomainRecordsRequest()
    describe_request.set_DomainName(DomainName)
    try:
        response = client.do_action_with_exception(describe_request)
        records = json.loads(response)['DomainRecords']['Record']
        for record in records:
            if record['Type'] == 'AAAA' and record['RR'] == SubDomain:
                current_ip = record['Value']
                record_id = record['RecordId']
                # 2. 如果IP没变,则不更新
                if current_ip == ipv6_addr:
                    print(f"IPv6地址未变化,仍为 {current_ip},无需更新。")
                    return
                # 3. IP变化了,更新记录
                update_request = UpdateDomainRecordRequest()
                update_request.set_RecordId(record_id)
                update_request.set_RR(SubDomain)
                update_request.set_Type('AAAA')
                update_request.set_Value(ipv6_addr)
                update_request.set_TTL(600)
                client.do_action_with_exception(update_request)
                print(f"更新成功!旧IP: {current_ip} -> 新IP: {ipv6_addr}")
                return
        print(f"未在域名 {DomainName} 下找到主机记录为 {SubDomain} 的AAAA记录,请先在控制台手动添加。")
    except ServerException as e:
        print(f"阿里云API请求出错: {e.get_error_msg()}")
if __name__ == '__main__':
    my_ipv6 = get_local_ipv6()
    if my_ipv6:
        print(f"当前获取到的公网IPv6地址: {my_ipv6}")
        update_dns_record(my_ipv6)
    else:
        print("未能获取IPv6地址,请检查网络是否已开启IPv6。")

设置定时任务

为了让脚本自动运行,我们需要利用Linux的 crontab 设置定时任务,比如每5分钟检查一次IP并更新。

  1. 赋予脚本执行权限:

    chmod +x /path/to/aliyun_ddns_ipv6.py
  2. 编辑定时任务:

    crontab -e
  3. 在文件末尾添加以下内容(注意替换为你的实际脚本路径):

    */5 * * * * /usr/bin/python3 /path/to/aliyun_ddns_ipv6.py >> /var/log/aliyun_ddns.log 2>&1

    这行代码的意思是:每5分钟执行一次脚本,并将输出日志记录到 /var/log/aliyun_ddns.log 中。

进阶注意事项

  1. 获取本地IP而非出口IP:上面脚本使用的是公共API获取IP,如果你的设备有多个网卡,或者你想指定获取特定网卡的IPv6(比如网桥或虚拟网卡的地址),可以使用Python的 netifaces 库来精准提取本地网卡的公网IPv6(通常以 2402408240e2409 开头,且不包含 fe80 等内网前缀)。
  2. 防火墙放行:即使有了IPv6公网IP,如果家庭路由器的防火墙没有放行相应的端口(如NAS的5000端口、SSH的22端口),外部依然无法访问,请在主路由器设置中,将对应IPv6主机的端口放行。
  3. 客户端兼容性:确保你访问家庭网络的设备(如手机、外网电脑)也处于IPv6网络环境中,如果外网只有IPv4环境,是无法直接访问IPv6地址的。

通过阿里云IPv6动态域名解析,我们以极低的成本(仅需一个域名的费用)和几行简单的代码,就彻底解决了家庭宽带动态IP的痛点,IPv6的普及让每个人都能拥有海量的公网IP,借助阿里云稳定高效的DNS服务,无论你身在何处,管理家庭数据中心都变得如同在局域网一般丝滑,赶快动手试试吧!

文章版权声明:除非注明,否则均为亚朵原创文章,转载或复制请以超链接形式并注明出处。