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