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()
原文地址:https://www.cnblogs.com/yangmingxianshen/p/7954338.html