python实现dns查询

dnspython模块中最常用的域名查询,它提供了一个DNS解析器类–resolver,使用resolver的query方法来实现域名的查询功能。
1.模块库安装
pip install dnspython

2.指定DNS服务器

my_resolver = dns.resolver.Resolver()
my_resolver.nameservers = [DNS_Server]

3.query方法的定义

query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True, source_port=0)

参数说明:
qname表示待查询的域名,例如:www.baidu.com;
rdtype用来指定待查询的类型,如A记录、MX记录、NS记录等;
rdclass用来指定网络类型,如IN、CH、HS等,默认为IN;
tcp用来指定查询时是否使用TCP协议,默认为False(即使用UDP);
source和source_port用于指定查询源地址与端口,默认为查询设备IP和0端口raise_on_no_answer用来指定当查询无应答时是否触发异常。

4.代码实现

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#说明1:DNS的模块库是dnspython,在电脑上需要安装pip install dnspython
import dns.resolver

#说明2:指定DNS解析的服务器为192.168.0.1,若不指定,则使用网卡配置的DNS地址
DNS_Server="192.168.0.1"      
my_resolver = dns.resolver.Resolver()
my_resolver.nameservers = [DNS_Server]

#说明3:定义函数,方便重复利用,指定源地址进行指定域名和记录类型的dns解析
def DNS_Query(domain_name,domain_type,source_ip):
    try:
        A= my_resolver.query(domain_name,domain_type,source=source_ip)      
        for i in A.response.answer:
            print(i.to_text())  
            #for j in i.items:
                #print(j.to_text())
    except Exception as e:
        print (domain_name,domain_type,‘Error: unable to start thread‘)

#说明4:指定源IP为192.168.0.2进行www.baidu.com的A记录解析
DNS_Query("www.baidu.com","A","192.168.0.2")

上述代码执行结果

www.baidu.com. 524 IN CNAME www.a.shifen.com.
www.a.shifen.com. 147 IN A 180.101.49.12
www.a.shifen.com. 147 IN A 180.101.49.11

【参考资料】
https://www.cnblogs.com/baishuchao/articles/9128953.html
https://www.cnblogs.com/bmjoker/p/10560027.html