dnspython(http://www.dnspython.org/)是Python实现的DNS工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。在系统管理方面,可以利用其查询功能来实现DNS服务监控以及解析结果的校验,可以代替nslookup及dig等工具,轻松做到与现有平台的整合。

源码安装

# http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz
# tar -zxvf dnspython-1.9.4.tar.gz
# cd dnspython-1.9.4
# python setup.py install

模块域名解析方法详解

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资源的类型,常用的有以下几种:

Python入门之——DNS处理模块dnspython_ip地址


rdclass参数用于指定网络类型,可选的值有IN、CH与HS,其中IN为默认,使用最广泛。tcp参数用于指定查询是否启用TCP协议,默认为False(不启用)。source与source_port参数作为指定查询源地址与端口,默认值为查询设备IP地址和0。raise_on_no_answer参数用于指定当查询无应答时是否触发异常,默认为True。

常用解析类型示例说明

利用dnspython的dns.resolver.query方法可以简单实现这些DNS类型(A、MX、NS、CNAME等)的查询。

Python入门之——DNS处理模块dnspython_ip地址_02


Python入门之——DNS处理模块dnspython_python_03


Python入门之——DNS处理模块dnspython_域名解析_04


Python入门之——DNS处理模块dnspython_ip地址_05


Python入门之——DNS处理模块dnspython_python_06


Python入门之——DNS处理模块dnspython_ip地址_07

DNS域名轮询业务监控

大部分的DNS解析都是一个域名对应一个IP地址,但是通过DNS轮询技术可以做到一个域名对应多个IP,从而实现最简单且高效的负载平衡,不过此方案最大的弊端是目标主机不可用时无法自动剔除,因此做好业务主机的服务可用监控至关重要。本实例通过分析当前域名的解析IP,再结合服务端口探测来实现自动监控,在域名解析中添加、删除IP时,无须对监控脚本进行更改。

Python入门之——DNS处理模块dnspython_ip地址_08

1 实现域名解析,获取域名所有的A记录解析IP列表;对IP列表进行HTTP级别的探测。

2 第一步通过dns.resolver.query()方法获取业务域名A记录信息,查询出所有IP地址列表,再使用httplib模块的request()方法以GET方式请求监控页面,监控业务所有服务的IP是否服务正常。

Python入门之——DNS处理模块dnspython_域名解析_09