Python 实现动态解析阿里云DNS记录

这篇具有很好参考价值的文章主要介绍了Python 实现动态解析阿里云DNS记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

最近有一个需求,公司内网的IP地址会发生变化,导致阿里云域名不能解析到新的IP地址,此时我们需要对阿里云的域名进行更新

二、实现

2.1 获取本地出口的公网IP

2.1.1 通过命令或网页 - 获取本地出口的公网IP**

获取本地IP的方式有很多,可以通过访问一些网站来获取本地的公网IP地址

1. curl ifconfig.me
2. curl -L ip.tool.lu
3. 以及一些在线查询网页然后解析内容来获取我们的公网IP地址

2.1.2 通过Nginx 获取我们的公网IP

我们通过在云端创建一个主机地址,然后通过nginx来获取访问者的公网IP,这样的好处是我们自己搭建的服务比较稳定可靠

  • 1. 创建阿里云主机记录
    在域名服务中通过访问域名列表点击解析Python 实现动态解析阿里云DNS记录

  • 2. 新增获取访问者IP的主机记录
    设置主机地址,记录值这里填写自己阿里云的IP地址,这是为了访问这个域名地址时,nginx返回访问者的IP地址。
    Python 实现动态解析阿里云DNS记录

  • 3. 新增测试的主机记录
    我们可以自己在新建一个记录,主机记录随意填写一个如dev,IP地址也可以随意填写一个。

  • 4. Nginx 返回对应的域名时返回访问者的IP
    新建一个nginx的配置文件,指定域名返回的内容

    root@rion:/etc/nginx/conf.d# pwd
    /etc/nginx/conf.d
    root@rion:/etc/nginx/conf.d# ls
    remote_ip.conf
    root@rion:/etc/nginx/conf.d# cat remote_ip.conf
    real_ip_recursive on;
    server {
            listen 80;			# 指定访问端口,如果不想用80端口,需要在阿里云开启对应的端口
            server_name ip.xxx.xx;
            # 省略其他配置....
            # nginx直接返回客户端IP到body
            location /ip {
                default_type text/plain;
                return 200 "$remote_addr";
            }
    }
    root@rion:/etc/nginx/conf.d# nginx -s reload	
    

    访问对应的域名查看结果是否正确,返回的结果时正确的。
    Python 实现动态解析阿里云DNS记录

2.2 实现动态更新阿里云IP地址

2.2.1 获取AccessKey ID和AccessKey Secret

我们使用SDK时,需要使用到AccessKey ID和AccessKey Secret 。

参考链接: https://help.aliyun.com/document_detail/38738.html

2.2.2 代码实现

  • 下载python包

    aliyun-python-sdk-core-v3
    aliyun-python-sdk-alidns
    
  • 代码

import requests
import traceback
import time
from datetime import datetime
import json
import sys
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest


class DNSRecord:
    json_data = None        # json 配置文件内容
    client = None           # 阿里云client
    public_dic = {"time":None,"ip":None}     
    dns_record_dic = {"time":None,"ip":None,"record_id":None}

    @classmethod
    def init(cls):
        """初始化阿里云 client"""
        try:
            cls.client = AcsClient(cls.json_data['id'], cls.json_data['secret'], cls.json_data['region'])
            print("Aliyun key 认证成功")
            return True
        except Exception as e:
            print("Aliyun key 认证失败")
            return False
    
    @classmethod     
    def reload_config(cls):
        """加载配置文件"""
        with open('./config.json',mode='r',encoding='utf-8') as fp:
            cls.json_data = json.load(fp)
    
    @classmethod
    def get_dns_record(cls):
        """获取dns记录"""
        try:
            request = DescribeDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(cls.json_data['domain_name'])
            response = cls.client.do_action_with_exception(request)
            data = json.loads(str(response, encoding='utf-8'))
            for record in data['DomainRecords']['Record']:
                if cls.json_data['RR'] == record['RR']:
                    cls.dns_record_dic['time'] = datetime.now()
                    cls.dns_record_dic['ip'] = record['Value']
                    cls.dns_record_dic['record_id'] = record['RecordId']
                    return True
        except:
            traceback.print_exc()
            return False

    @classmethod
    def get_public_ip(cls):
        """获取公网IP"""
        for url in cls.json_data['public_url']:
            try:
                request_obj = requests.get(url,timeout=5)
                if request_obj.status_code == 200:
                    cls.public_dic['time'] = datetime.now()
                    cls.public_dic['ip'] = request_obj.text
                    return True
            except:
                traceback.print_exc()
        return False

    @classmethod
    def update_dns_record(cls,public_ip):
        update_time = datetime.now()
        update_time_str = update_time.strftime("%Y-%m-%d %H:%M:%S")
        try:
            request = UpdateDomainRecordRequest()
            request.set_accept_format('json')
            request.set_Value(public_ip)
            request.set_Type(cls.json_data['type'])
            request.set_RR(cls.json_data['RR'])
            request.set_RecordId(cls.dns_record_dic['record_id'])
            response = cls.client.do_action_with_exception(request)

            cls.public_dic['time'] = update_time
            cls.dns_record_dic['time'] = update_time
            print(f"[更新成功 {update_time_str}] 域名:{cls.json_data['domain_name']}  + \
                主机:{cls.json_data['RR']}   记录类型:{cls.json_data['type']} + \
                IP地址:{cls.dns_record_dic['ip']}")
            return True
        except Exception as e:
            print(f"域名:{cls.json_data['domain_name']} 主机:{cls.json_data['RR']} 解析失败,错误:",e)
            return False

    @classmethod
    def main(cls):
        cls.reload_config()
        cls.init()
        while True:
            public_time = cls.public_dic['time']
            dns_time = cls.dns_record_dic['time']

            if not dns_time:                
                ret = cls.get_dns_record()              # 更新云端的IP、时间、record_id
                if not ret:
                    time.sleep(10)
                    continue
                dns_time = cls.dns_record_dic['time']
            if not public_time:             
                ret = cls.get_public_ip()               # 更新本地公网的IP、时间
                if not ret:
                    time.sleep(10)
                    continue
                public_time = cls.public_dic['time']
            if (public_time - dns_time).total_seconds() < 300:  # 本地时间和云端时间小于5分钟
                print("本地更新时间与云端更新时间差小于5分钟")
                time.sleep(10)
                continue
            else:
                public_ret = cls.get_public_ip()               # 更新本地公网的IP、时间
                if not public_ret:
                    time.sleep(10)
                    continue
                dns_ret = cls.get_dns_record()                 # 获取阿里云dns记录
                if not dns_ret:
                    time.sleep(10)
                    continue
                public_ip = cls.public_dic['ip']
                dns_ip = cls.dns_record_dic['ip']
                if public_ip != dns_ip:                     # 本地公网IP和云端IP不相等
                    ret = cls.update_dns_record(public_ip)
                    if not ret:
                        time.sleep(10)
                else:
                    time.sleep(10)
            

if __name__ == "__main__":
    dns_r = DNSRecord
    dns_r.main()
  • Json配置文件
{
    "id":"xxxxxxxxxxxxxxxxxx",
    "secret":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "region":"cn-hangzhou",
    "RR":"dev",
    "type":"A",
    "domain_name":"xxxxx.xx",
    "public_url":["http://ip.xx.xx/ip","http://xx.xxx.xx:8899/ip"]
}

这里获取本地公网IP的对象为列表,若一个获取地址的URL挂掉了,我们还可以从另一个地址获取本地公网的IP,保证了一定的稳定性。

参考链接: https://help.aliyun.com/document_detail/124923.html

以上是python实现动态更新阿里云DNS解析记录的代码,除了更新记录之外还可以增加记录,删除记录等。文章来源地址https://www.toymoban.com/news/detail-455348.html

到了这里,关于Python 实现动态解析阿里云DNS记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 国际版腾讯云/阿里云:云解析DNS是什么

    云解析DNS是什么 ​ 问答 云解析DNS是一种安全、快速、安稳、牢靠的威望DNS解析处理服务。 云解析DNS为企业和开发者将易于处理辨认的域名转换为计算机用于互连通讯的数字IP地址,然后将用户的拜访路由到相应的网站或应用服务器。 云解析 DNS(Domain Name System,简称 DNS)

    2024年02月08日
    浏览(38)
  • Linux动态分配IP与正向解析DNS

    目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置  1.3 修改客户端dhcp,重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取,查看网卡信息 二、时间同步 1. 手动同步 2. 自动同步 3. 搭建本地时间同步服务器 3.1 图示 3

    2024年02月01日
    浏览(27)
  • 记录--一个纯样式花里胡哨的动态渐变背景块

    闲来无事写了个有意思的东西,鼠标放在小方块上会放大并挤压周围方块,背景颜色会动态改变。这里没有用一行 js 代码,纯样式(Sass)实现。 下面只展示核心代码,完整代码请参照上方代码片段。 先画一个 6 x 6 的正方形,利用 v-for 循环出 dom 元素。当然也可以不用 Vue

    2024年02月05日
    浏览(61)
  • Centos7搭建DNS(bind)服务器,配置域名泛解析记录

    前言就是没钱买域名,学习成本较大 (穷批哭死) ,再加上windows个人版的上的hosts文件不支持域名泛解析和多租户的域名解析,windows server环境又需要秘钥提供不支持长期学习,所以出一篇文章记录一下。 客户机:windows个人环境即可 服务器:两台nginx服务器(centos7)、一台

    2024年02月04日
    浏览(50)
  • DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等

    域名注册完成后首先需要做域名解析,域名解析就是把域名指向网站所在服务器的IP,让人们通过注册的域名可以访问到网站。IP地址是网络上标识服务器的数字地址,为了方便记忆,使用域名来代替IP地址。域名解析就是域名到IP地址的转换过程,域名的解析工作由DNS服务器

    2024年02月11日
    浏览(32)
  • dig命令理解DNS域名解析中的A记录,AAAA记录,CNAME记录,MX记录,NS记录,/etc/hosts本地域名IP映射

    参考博文:https://blog.csdn.net/zxl1990_ok/article/details/125432123 http://ruanyifeng.com/blog/2016/06/dns.html https://blog.csdn.net/a583929112/article/details/66499771 https://www.jianshu.com/p/813918846788 DNS(Domain Name System) 即域名系统。 作用就是根据域名查出 IP 地址。 所谓本地域名IP映射,是指在本地建立域名

    2024年02月02日
    浏览(33)
  • Linux设备配置DNS服务器,实现正向解析和反向解析,实现DNS主从服务器同步,实现批量域名正/反向解析

    本文基于Linux上CentOS 7版本配合bind(named)服务进行演示 目录 一.DNS域名服务器原理及作用等介绍 1.DNS简介:  2.原理简单介绍 3.常见域名后缀 4.DNS域名服务器类型 5.DNS服务器的对应关系查询方式 6.具体解析过程 二.bind(named)服务配置文件介绍 1.主配置文件在/etc/named.conf 2.数

    2024年02月08日
    浏览(33)
  • Qt如何实现动态背景-视频背景

    需求:加载视频作为视频背景,在上层可以进行图片的动画化,或是进行其他操作。 几种方法: 1、直接将视频弄成一个QDialog, 然后再上层在弄一个QDialog,背景透明即可。但遇到一个问题,QDialog没办法局部透明。 2、使用QOpenGLWidget: 这个方案没有使用。 3、使用QGraphicsVide

    2024年02月04日
    浏览(27)
  • dig命令DNS域名解析中的A/AAAA/CNAME/MX/NS记录,/etc/hosts本地域名IP映射,traceroute命令

    参考博文:https://blog.csdn.net/zxl1990_ok/article/details/125432123 http://ruanyifeng.com/blog/2016/06/dns.html https://blog.csdn.net/a583929112/article/details/66499771 https://www.jianshu.com/p/813918846788 DNS(Domain Name System) 即域名系统。 作用就是根据域名查出 IP 地址。 所谓本地域名IP映射,是指在本地建立域名

    2024年02月17日
    浏览(31)
  • 配置dns主从服务器,实现正反向解析

    一、安装bind服务 二、修改主配置文件/etc/named.conf 三、配置数据配置文件/var/named/baidu 四、重启服务,进行测试

    2024年01月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包