• pip install dnspython
  • dnspython版本:2.1.0
  • python版本:3.9.4
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 主要API
    def resolve(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
    tcp=False, source=None, raise_on_no_answer=True,
    source_port=0, lifetime=None, search=None):
    # rdclass:网络类型;
    # tcp:指定査询是否启用TCP协议;
    # source:査询源的地址;
    # source_port:査询源的端口 ;
    # raise_on_no_answer:指定査询无应答时是否触发异常,默认为True
  • 其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种
    • A记录,将主机名装换成IP地址
    • MX记录,邮件交换记录,定义邮件服务器的域名
    • CNAME记录,指别名记录,实现域名间的映射
    • NS记录,标记区域的域名服务器及授权子域
    • PTR记录,反向解析,与A记录相反,将IP装换成主机名;
    • SOA记录,SOA标记,一个起始授权区的定义

1
2
3
4
5
6
# A记录
import dns.resolver
domain = "baidu.com"
A = dns.resolver.resolve(domain,'A')
for i in A:
    print(i)

1
2
3
4
5
6
# MX记录
import dns.resolver
domain = "qq.com"
MX = dns.resolver.resolve(domain,'MX')
for i in MX:
    print(i)

1
2
3
4
5
6
# NS记录
import dns.resolver
domain = "qq.com"
NS = dns.resolver.resolve(domain,'NS')
for i in NS:
    print(i)

1
2
3
4
5
6
# CNAME记录
import dns.resolver
domain = "baidu.com"
CNAME = dns.resolver.resolve(domain,'CNAME')
for i in CNAME:
    print(i)

  • 将其封装一下
    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
    import dns.resolver

    def get_dns(domain, option):
        """
        DNS相关类型的数据解析成列表
        param:
            domain: 域名
            option: rdtype类型
        ret:
            data_list: rdtype对应的结果列表
        """
        data_list = []
        try:
            data = dns.resolver.resolve(domain,option)
            for i in data:
                data_list.append(str(i))
        except Exception as e:
            print(e)
        return data_list

    def parse_dns(domain):
        """
        解析域名,返回解析的相关数据
        param:
            damain:
        ret:
            DNS_dict: {'A': ['220.181.38.xxx'], 'MX': [], 'NS': [], 'CNAME': []}
        """
        DNS_dict = {}
        A_list = get_dns(domain,"A")
        DNS_dict["A"] = A_list
        MX_list = get_dns(domain,"MX")
        DNS_dict["MX"] = MX_list
        NS_list = get_dns(domain,"NS")
        DNS_dict["NS"] = NS_list
        CNAME_list = get_dns(domain,"CNAME")
        DNS_dict["CNAME"] = CNAME_list
        return DNS_dict

    def main():
        domain = "xxx.com"
        DNS_dict = parse_dns(domain)
        print(DNS_dict)

    if __name__ == "__main__":
        main()

dns监控

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

import dns.resolver
import http.client
 
def get_ipList(domain):
    """
    解析A记录
    param:
        domain: 域名
    ret:
        ip_list: A记录,解析的IP列表
    """
    ip_list = []
    try:
        A = dns.resolver.resolve(domain, 'A')
    except Exception as e:
        print('dns resolver error'+str(e))
        return
    for i in A:
        ip_list.append(str(i))
    return ip_list
 
def check_ip(ip):
    """
    检查IP能否正常访问
    param:
        ip:
    ret:
        None
    """
    check_url = ip +':80'
    get_content = ''
    # 定义http连接超时5秒
    http.client.socket.setdefaulttimeout(5
    # 创建连接对象
    conn = http.client.HTTPConnection(check_url)
    try:
        # 发起url请求 添加host主机头部
        conn.request('GET''/', headers={'Host':domain_app})
        r = conn.getresponse()
        # 获取url页面前15字符
        get_content = r.read(15).decode("utf-8")
        print("get--->",get_content)
    finally:
        if get_content.find("!DOCTYPE") != -1:
            print(str(ip) + '[OK]')
        else:
            print(str(ip) + '[error]')
 
if __name__ == '__main__':
    domain_app ='www.baidu.com'
    ip_list = get_ipList(domain_app)
    if len(ip_list)>0:
        for ip in ip_list:
            check_ip(ip)
    else:
        print('dns resolver error')