Python之DNS

Python017

Python之DNS,第1张

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

安装

[root@bogon dns]# vim NS.py

import dns.resolver

domain = raw_input('Please input an domain: ')

ns = dns.resolver.query(domain, 'NS')

for i in ns.response.answer:

for j in i.items:

print j.to_text()

测试:

[root@bogon dns]# python NS.py

Please input an domain: baidu.com #智能输入一级域名

ns4.baidu.com.

ns3.baidu.com.

ns2.baidu.com.

dns.baidu.com.

ns7.baidu.com.

[root@bogon dns]#

可以尝试以下步骤:

ping一个域名,用wireshark抓一个DNS的query,看看各个字段分别是什么值;

用python的struct将这些字段按顺序pack成二进制数据;

用python的socket将构造好的数据发到DNS服务器UDP的53号端口,本地端口可以自行指定;

用python的socket从buffer中读取server返回的数据;

用python的struct将二进制数据中各个字段按顺序unpack回来;

打印显示。

按照这个方法,同样可以写一个简单的DNS服务器,希望能有所帮助。

再具体点,可以参照The TCP/IP Guide 中的DNS message format来构造query的各个字段:

Header部分

Identifier:16位的int,就是0-65535,可以用随机数产生。

Flags:0x0100,其中:

#0... .... .... .... = Query/Response

Flag: query=0

#.000 0... .... .... = Opcode: standard query=0

#.... .0.. .... .... = Authoritative

Answer Flag

#.... ..0. .... .... = Truncated: not truncated=0

#.... ...1 .... .... = Recursion desired: recursively=1,如果想 iteratively就置1

#.... .... 0... .... = Recursion Available: response的东西,=0

#.... .... .000 .... = Zero: 保留字段,=0

#.... .... .... 0000 = Response Code:=0

3.Question Count:16位的int,=0x0001

4.Answer Record Count:16位的int,=0x0000

5.Authority

Record Count:16位的int,=0x0000

6.Additional Record Count:16位的int,=0x0000

Question部分

QName:直接把域名打包进去;

QType:16位的int,我们要得到的是主机名,所以=0x0001,

QClass:16位的int,=0x0001