• 03 dnspython模块的应用


    DNS原理

    定义

    讲网站的域名和ip地址相互关联在一起 --DNS
    端口号53
    国家互联网工程中心   -亦庄,天地互连
    

    域名

    一个网站语句其实有自己专有的格式,这个完整的格式叫FQDN(完全限定域名)
    	-- 从逻辑上准确的表示出互联网上的主机在什么地方
    	
    格式:
    	主机名.网站名.二级域.顶级域.(/)
    

    根域服务器获取

    ipv4的根DNS全球服务器一共13台(中国没有)
    ipv6的根服务器一共25台
    

    A记录,将主机名转换成IP地址;

    MX记录,邮件交换记录,定义邮件服务器的域名;

    CNAME记录,指别名记录,实现域名间的映射;

    NS记录,标记区域的域名服务器及授权子域;

    RTP记录,反向解析,与A记录相反,将IP转换成主机名;

    SOA记录,SOA标记,一个起始授权区的定义。

    模块解析

    提供了大量的DNS处理方法,最常用的方法是域名查询,dnspython提供了一个DNS解析类--resolver,使用他的query方法来实现域名的查询

    query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
              tcp=False, source=None, raise_on_no_answer=True,
              source_port=0, lifetime=None): 
    
    qname	指定查询的名称
    rdtype	指定查询的类型,默认是A记录
    rdclass	指定查询的网络类型,默认是IN
    TCP	是否启用tcp查询模式
    source 和 source_port指定 查询用的源地址和端口
    raise_on_no_answer 查询无结果的时候是否要抛出异常
    lifetime 生命周期的配置参数,采用默认值
    

    解析操作

    A记录

    #!/usr/bin/python3.6.7
    import dns.resolver
    
    # 接收数据
    domain=input("请输入一个域名>>>:")
    dns_type='A'
    query_object=dns.resolver.resolve(domain,rdtype=dns_type)
    for i in query_object:
        print("解析记录为>>>:%s"%i)
    
    [root@docker ~]# python3.6.7 yuming.py 
    请输入一个域名>>>:www.baidu.com
    解析记录为>>>:112.80.248.75
    解析记录为>>>:112.80.248.76
    

    MX记录

    #!/usr/bin/python3.6.7
    import dns.resolver
    
    # 接收数据
    domain = input("请输入一个MX>>>:")
    dns_type = 'MX'
    query_object = dns.resolver.resolve(domain, rdtype=dns_type)
    for i in query_object:
        print("解析记录为>>>:%s" % i)
    
    请输入一个MX>>>:qq.com
    解析记录为>>>:30 mx1.qq.com.
    解析记录为>>>:10 mx3.qq.com.
    解析记录为>>>:20 mx2.qq.com.
    

    NS记录

    #!/usr/bin/python3.6.7
    import dns.resolver
    
    # 接收数据
    domain = input("请输入一个NS>>>:")
    dns_type = 'NS'
    query_object = dns.resolver.resolve(domain, rdtype=dns_type)
    for i in query_object:
        print("解析记录为>>>:%s" % i)
    
    [root@docker ~]# ./yuming.py 
    请输入一个NS>>>:baidu.com
    解析记录为>>>:ns2.baidu.com.
    解析记录为>>>:ns3.baidu.com.
    解析记录为>>>:ns7.baidu.com.
    解析记录为>>>:ns4.baidu.com.
    解析记录为>>>:dns.baidu.com.
    

    CNAME记录

    #!/usr/bin/python3.6.7
    import dns.resolver
    
    # 接收数据
    domain = input("请输入一个CNAME>>>:")
    dns_type = 'CNAME'
    query_object = dns.resolver.resolve(domain, rdtype=dns_type)
    for i in query_object:
        print("解析记录为>>>:%s" % i)
    
    [root@docker ~]# ./yuming.py 
    请输入一个CNAME>>>:blog.abck8s.com
    解析记录为>>>:ip.abck8s.com.
    

    实践

    案例分析

    域名对应多ip的时候,服务可用性监控,一旦ip不可用,自动清除
    

    思路

    获取有效的ip列表
    1-1获取记录类型
    1-2将获取的值添加到列表中
    
    对ip列表里面的值进行检测
    2-1创建ip地址
    的连接
    2-2尝试发起请求
    2-3对请求的响应内容进行判断,并输出结果
    
    测试主程序
    先获取ip列表,然后对ip进行测试
    
    #!/usr/bin/python3.6.7
    import dns.resolver
    import os
    import httplib2
    
    # 定义一个ip空列表
    iplist = []
    domain = "www.baim0.xyz"  # 定义业务域名
    
    
    def get_iplist(domain):
        # 接收数据
        try:
            query_object = dns.resolver.resolve(domain, "A")
        except Exception as e:
            print("dns解析失败:{}".format(str(e)))
        else:
            for i in query_object:
                iplist.append(i)
            return True
    
    
    def checkip(ip):
        conn = httplib2.HTTPConnectionWithTimeout(domain)
        try:
            conn.request("GET", "/")
            result = conn.getresponse()
            # print("响应的内容为:{}".format(result))
            getcontent = result.read(15)
            getcontent = str(getcontent, "utf-8")
        except Exception as e:
            print("网络超时或者异常,请重试!")
        else:
            if getcontent == "<!DOCTYPE html>":
                print("{}状态:ok".format(ip))
            else:
                print("{}:error".format(ip))
    
    
    if __name__ == '__main__':
        if get_iplist(domain) and len(iplist) > 0:
            for ip in iplist:
                print("{}正常解析的ip有{}".format(domain, ip))
                checkip(ip)
        else:
            print("解析错误!")
    
  • 相关阅读:
    叉姐的魔法训练(第十课)---- 幽默大师卫冕战
    叉姐的魔法训练(第⑨课)---- 幽默大师职业赛
    叉姐的魔法训练(第八课)---- 幽默术
    叉姐的魔法训练(第七课)---- 在沙漠中的长途旅行
    叉姐的魔法训练(第六课)---- 暴雨术入门
    叉姐的魔法训练(第五课)---- 如何成为一名合格的小学生
    叉姐的魔法训练(第四课)---- 风系魔法的基本要领
    叉姐的魔法训练(第三课)---- 火球术入门
    叉姐的魔法训练(第二课)---- 冰系魔法入门
    叉姐的魔法训练(第一课)---- 初级魔法练习
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/14987356.html
Copyright © 2020-2023  润新知