• python3实现阿里云DDNS域名动态解析


    一. 前言

    • 家里部署了一台NAS服务器,在公司平时都是通过IP访问的,现在想更改为用域名去访问,但是家里的宽带都是动态的公网IP,每次IP变了都需要手动解析一次域名,这样就比较麻烦,那怎么办了?这个时候我们就可以用到阿里云DDSN来实现自动进行域名解析, 通过阿里云的SDK来添加修改域名解析,检查本机公网IP与解析的IP是否一致,若不同则自动修改解析,达到动态解析的目的。

    二.准备工作

    1. 准备一个公网IP(如何检查家里的IP是否是公网IP,我们可以通过查看路由器wan口IP和通过百度获取IP,查看两个IP是否一致,如一致者是公网IP,反之者不是)
    2. 阿里云域名
    3. 获取阿里云的accessKeyId和accessSecret(可以在阿里云控制台个人中心直接获取。建议使用RAM角色来进行权限控制,这样的话安全风险较小)
    4. python3环境

    三.详细步骤

    1.安装依赖包

    pip3 install aliyun-python-sdk-core-v3 
    pip3 install aliyun-python-sdk-domain 
    pip3 install aliyun-python-sdk-alidns 
    pip3 install requests  
    pip3 install beautifulsoup4
    pip3 install lxml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.单独写一个获取公网IP的脚本(以下演示脚本网站为:ip.tool.chinaz.com,各位可自行通过其他地址获取IP信息)

    • GetpublicIP.py
    import requests
    from bs4 import BeautifulSoup
    import re
    
    
    def getip():
        '''通过ip.tool.chinaz.com地址获取当前公网ip'''
    
        url = "https://ip.tool.chinaz.com/"
        headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
                }
        res = requests.get(url, headers=headers)
        soup = BeautifulSoup(res.text, "lxml")
        label = soup.find('div', attrs={'class': 'WhwtdWrap bor-b1s col-gray03'})
        label_1 = label.find("span")
        regular = re.findall(r'">(.+?)</span>', str(label_1))
        print(f"当前IP地址为:{regular[0]}")
    
        return regular[0]
    
    
    if __name__ == "__main__":
        getip()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.编写阿里云ddns动态域名解析

    • alyddns.py
    import json
    # from GetpublicIP import getip
    from urllib.request import urlopen
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
    
    
    class Dnscontroller:
        # 阿里云个人中心获取Access_Key_Id和Access_Key_Secret
        access_key_id = ""
        access_key_secret = ""
    
        # 填写你的主域名
        domain = ""
        # 要进行ipv4 ddns解析的子域名(主机记录)
        name_ipv4 = "@"
    
        # 解析记录类型,一般为A记录
        record_type = "A"
    
        # 区域
        region = "cn-shenzhen"
    
        def __init__(self):
            self.client = AcsClient(
                self.access_key_id,
                self.access_key_secret,
                self.region
            )
    
        # 添加新的域名解析记录
        def add(self, DomainName, RR, Type, Value):
            from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest
            request = AddDomainRecordRequest()
            request.set_accept_format('json')
            request.set_DomainName(DomainName)
            request.set_RR(RR)
            request.set_Type(Type)
            request.set_Value(Value)
            response = self.client.do_action_with_exception(request)
    
        # 修改域名解析记录
        def update(self, RecordId, RR, Type, Value):
            from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
            request = UpdateDomainRecordRequest()
            request.set_accept_format('json')
            request.set_RecordId(RecordId)
            request.set_RR(RR)
            request.set_Type(Type)
            request.set_Value(Value)
            response = self.client.do_action_with_exception(request)
    
        # 获取公网IP并进行修改
        def Get_IPv4(self):
            request = DescribeSubDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(self.domain)
            request.set_SubDomain(self.name_ipv4 + '.' + self.domain)
            response = self.client.do_action_with_exception(request)  # 获取域名解析记录列表
            domain_list = json.loads(response)  # 将返回的JSON数据转化为Python能识别的
    
            # 获取IP方法一
            ipv4 = json.load(urlopen('http://jsonip.com'))['ip']
            print("获取到IPv4地址:%s" % ipv4)
    
            # 获取IP方法二,爬取IP地址
            # ipv4 = getip()
    
            if domain_list['TotalCount'] == 0:
                self.add(self.domain, self.name_ipv4, self.record_type, ipv4)
                print("新建域名解析成功")
    
            elif domain_list['TotalCount'] == 1:
                if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv4.strip():
                    self.update(domain_list['DomainRecords']['Record'][0]['RecordId'], self.name_ipv4, self.record_type, ipv4)
                    print("修改域名解析成功")
                else:
                    print("IPv4地址没变")
    
            elif domain_list['TotalCount'] > 1:
                # 删除所有解析过的记录,并重新添加新的解析记录
                from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest
                request = DeleteSubDomainRecordsRequest()
                request.set_accept_format('json')
                request.set_DomainName(self.domain)
                request.set_RR(self.name_ipv4)
                response = self.client.do_action_with_exception(request)
                self.add(self.domain, self.name_ipv4, self.record_type, ipv4)
                print("修改域名解析成功")
    
    
    if __name__ == "__main__":
        Dnscontroller().Get_IPv4()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    三.部署脚本到centos7系统

    1.centos7 安装python3,链接: link

    2.把alyddns.py文件上传到服务器“/dns”目录下,并赋予权限

    cd /dns
    chmod +x alyddns.py
    
    • 1
    • 2

    3.centos7下安装python3 阿里云依赖库

    sudo pip3 install aliyun-python-sdk-core-v3==2.13.10
    pip3 install aliyun-python-sdk-alidns
    pip3 install aliyun-python-sdk-domain 
    
    • 1
    • 2
    • 3

    四.脚本设置定时运行

    • CentOS内置有强大的计划任务工具Crontab,如果系统里没有则先使用yum安装

    1.安装Crontab

    yum install crontabs
    
    • 1

    2.查看Crontab状态

    service crond status
    ntsysv #查看crontab服务是否已设置为开机启动,如未设置开机自启,就勾选“crond.service”并确定
    
    • 1
    • 2

    在这里插入图片描述

    3.添加定时任务

    crontab -e #编辑cron任务模式
    i #默认文字编辑器为vim,按i字母键即可添加cron任务
    */10 * * * * /usr/bin/python3 /dns/alyddns.py #将命令代码放入,此命令意义为间隔10分组检查一次IP是否有变动
    ESC #按ESC键退出编辑模式
    :wq #键入:wq保存
    service crond restart #重启crontab服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.查看任务列表

    crontab -l
    
    • 1

    5.Crontab命令在线验证工具
    链接: link

  • 相关阅读:
    【8. 调度算法】
    众和策略:尾盘5分钟拉升意味着什么?
    Linux static_key原理与应用
    AI推介-大语言模型LLMs论文速览(arXiv方向):2024.03.10-2024.03.15
    Vscode禁止插件自动更新
    深入探索Android Service:多线程环境最佳实践与系统级操作
    java暴力回朔法解数独
    鲲鹏devkit & boostkit
    Git之路
    压缩算法---以golang/snappy为例
  • 原文地址:https://blog.csdn.net/qq_45664055/article/details/125600345