因為平時在測試DNS的時候有些操作手動完成不方便,所以需要用到腳本,而在Python里dnspython這個用於DNS操作的庫十分強大,但是無奈網上大部分資料只列舉了少部分的用法,所以記錄一下我平時使用到的功能,基本上已經能應付大部分的使用場景了。想具體了解dnspython可以登錄官方網站閱讀使用文檔.
常用工具
最常用的用法是調用默認的resolver發送解析請求,如
from dns import resolver ans = resolver.query("www.baidu.com", "A") print("qname:",ans.qname) print ("reclass:",ans.rdclass) print ("rdtype:",ans.rdtype) print ("rrset:",ans.rrset) print ("response:",ans.response)
結果為
('qname:', <DNS name www.baidu.com.>) ('reclass:', 1) ('rdtype:', 1) ('rrset:', <DNS www.a.shifen.com. IN A RRset>) ('response:', <DNS message, ID 64940>)
在這里解析任務默認發送給系統默認的dns服務器,其中比較重要的是response,在dnspython的官方文檔里,response屬於類dns.message.Message,這個類也是許多DNS query請求的返回結果,下面詳細介紹下這個類。
類的主要成員變量有:
int flags #The DNS flags of the message. int id #The query id; the default is a randomly chosen id. list of RRset addictional list of RRset answer list of RRset authority
flags屬於返回DNS報文的標志位(詳見《TCP/IP詳解(卷一)》關於DNS的部分),可以利用以下代碼打印DNS報文的各個標志位:
#!/bin/env python2.7 ans = resolver.query("www.baidu.com", "A") def FlagCount(flags, pos): if (flags/(2**pos))%2 == 1: return True else: return False def GetFlags(flags): QR_pos = 15 AA_pos = 10 TC_pos = 9 RD_pos = 8 RA_pos = 7 QR_flag = FlagCount(flags, QR_pos) AA_flag = FlagCount(flags, AA_pos) TC_flag = FlagCount(flags, TC_pos) RD_flag = FlagCount(flags, RD_pos) RA_flag = FlagCount(flags, RA_pos) flag_dic = {"QR":QR_flag, "AA":AA_flag, "TC":TC_flag, "RD":RD_flag, "RA":RA_flag} print "flag:", for flag in flag_dic: if flag_dic[flag]: print flag, flags = ans.response.flags GetFlags(flags)
返回結果為:
flag: AA RD QR RA
另外一個比較重要的類就是RRset,通常返回的三個section信息都使用這個類封裝,常用的用法是使用類函數to_text()令解析結果以字符串形式顯示。如:
ans = resolver.query("www.baidu.com", "A") for i in ans.response.answer: print i.to_text()
結果為:
www.baidu.com. 1200 IN CNAME www.a.shifen.com. www.a.shifen.com. 119 IN A 220.181.112.244 www.a.shifen.com. 119 IN A 220.181.111.188
使用實例:
A記錄查詢
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') A = dns.resolver.query(domain, 'A') for i in A.response.answer: for j in i.items: print j.address
MX記錄查詢(注意輸入域名不包括www)
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') MX = dns.resolver.query(domain, 'MX') for i in MX: print 'MX preference =', i.preference, 'mail exchanger =', i.exchange
NS記錄查詢
#!/usr/bin/env python 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()
CNAME記錄查詢
#!/usr/bin/env python import dns.resolver domain = raw_input('Please input an domain: ') cname = dns.resolver.query(domain, 'CNAME') for i in cname.response.answer: for j in i.items: print j.to_text()