DNS处理模块dnspython
dnspython是python实现的一个DNS工具包,它支持几乎所有的记录类型。
可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。
在系统管理方面,我们可以利用其查询功能来实现DNS服务监控以及解析结果的校验。
一、模块域名解析方法
dnspython模块提供了大量的DNS处理方法,最常用的方法是域名查询。
dnspython提供了一个DNS解析器类——resolver,使用它的query方法来实现域名的查询功能。query方法的定义如下:
query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)
其中,qname参数为查询的域名。rdtype参数用来指定RR资源的类型,常用的有以下几种:
(1)A记录:将主机名转换为IP地址;
(2)MX记录:邮件交换记录,定义邮件服务器的域名;
(3)CNAME记录:别名记录,实现域名间的映射;
(4)NS记录:标记区域的授权服务器及授权子域;
(5)PTR记录:反向解析,与A记录相反,将IP转换成主机名;
(6)SOA记录:SOA标记,一个起始授权区的定义;
rdclass参数用于指定网路类型,可选的值有IN、CH与HS,其中IN为默认,使用最广泛。
tcp参数用于指定查询是否启用TCP协议,默认为False(不起用)。
source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP和0。
raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。
二、常见解析类型实例说明
常见的DNS解析类型包括A、MX、NS、CNAME等。
利用dnspython的dns.resolver.query方法可以简单实现这些DNS类型的查询,为后面要实现的功能提供数据来源。
1.A记录
#!/usr/bin/env python2 #coding:utf-8 import dns.resolver domain = raw_input('请输入域名:') A = dns.resolver.query(domain,'A') #指定查询类型 for i in A.response.answer: #获取查询信息 for j in i.items: #遍历回应信息 print j.address
执行结果:
[root@7 ~]# python2 /home/test/dnspython/simple.py
请输入域名:www.google.com
74.86.17.48
2.MX记录
#!/usr/bin/env python2 #coding:utf-8 import dns.resolver domain = raw_input('请输入域名:') MX = dns.resolver.query(domain,'MX') for i in MX: print 'MX preference=',i.preference, 'mail exchanger=',i.exchange
执行结果:
[root@7 ~]# python2 /home/test/dnspython/simple2.py 请输入域名:163.com MX preference= 10 mail exchanger= 163mx01.mxmail.netease.com. MX preference= 10 mail exchanger= 163mx02.mxmail.netease.com. MX preference= 50 mail exchanger= 163mx00.mxmail.netease.com. MX preference= 10 mail exchanger= 163mx03.mxmail.netease.com.
3.NS记录
#!/usr/bin/env python2 #coding:utf-8 import dns.resolver domain = raw_input('请输入域名:') ns = dns.resolver.query(domain,'NS') for i in ns.response.answer: for j in i.items: print j.to_text()
执行结果:
[root@7 ~]# python2 /home/test/dnspython/simple3.py 请输入域名:baidu.com dns.baidu.com. ns2.baidu.com. ns7.baidu.com. ns3.baidu.com. ns4.baidu.com.
4.CNAME记录
[root@7 dnspython]# cat simple4.py #!/usr/bin/env python2 #coding:utf-8 import dns.resolver domain = raw_input('请输入域名:') cname = dns.resolver.query(domain,'CNAME') for i in cname.response.answer: for j in i.items: print j.to_text()