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