DNS
dnspython(http://www.dnspython.org/) 是Python實現(xiàn)的一個DNS工具包禽翼,它支持幾乎所有的記錄類型屠橄,可以用于查詢、傳輸并動態(tài)更新ZONE信息闰挡,同時支持TSIG(事務(wù)簽名)驗證消息和EDNS0(擴展DNS).在系統(tǒng)方面,我們可以利用其查詢功能來實現(xiàn)DNS服務(wù)監(jiān)控以及解析結(jié)果的校驗,可以代替nslookup及dig等工具锐墙,輕松做到與現(xiàn)有平臺的整合
安裝
pip install dnspython
DNS記錄解析
- A記錄,將主機名轉(zhuǎn)換成IP地址
- MX記錄长酗,郵件交換記錄溪北,定義郵件服務(wù)器的域名
- CNAME記錄,指別名記錄花枫,實現(xiàn)域名間的映射
- NS記錄刻盐,標記區(qū)域的域名服務(wù)器及授權(quán)子域
- PTR記錄,反向解析劳翰,與A記錄相反敦锌,將IP轉(zhuǎn)換成主機名
- SOA記錄,SOA標記佳簸,一個起始授權(quán)區(qū)的定義
A記錄
# codeing=utf-8
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記錄
# coding=utf-8
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
Please input an domain: 163.com
MX preference = 10 mail exchanger = 163mx02.mxmail.netease.com.
MX preference = 10 mail exchanger = 163mx01.mxmail.netease.com.
MX preference = 50 mail exchanger = 163mx00.mxmail.netease.com.
MX preference = 10 mail exchanger = 163mx03.mxmail.netease.com.
NS記錄
# coding=utf-8
import dns.resolver
print '*************NS****************'
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()
*************NS****************
Please input an domain: baidu.com
ns4.baidu.com.
dns.baidu.com.
ns2.baidu.com.
ns7.baidu.com.
ns3.baidu.com.
CNAME記錄
# coding=utf-8
import dns.resolver
print '****************CNAME****************'
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()
****************CNAME****************
Please input an domain: www.baidu.com
www.a.shifen.com.
綜合案例
import dns.resolver
import httplib
iplist = [] # 定義域名IP列表變量
# appdomain = "www.google.com.hk" # 定義業(yè)務(wù)域名
appdomain = "www.baidu.com" # 定義業(yè)務(wù)域名
# 域名解析函數(shù)乙墙,解析成功IP將追加到iplist
def get_iplist(domain=""):
try:
A = dns.resolver.query(domain, 'A') # 解析A記錄類型
except Exception, e:
print "dns resolver error:" + str(e)
return
for i in A.response.answer:
for j in i.items:
iplist.append(j.address) # 追加到iplist
return True
def checkip(ip):
checkurl = ip + ":80"
getcontent = ""
httplib.socket.setdefaulttimeout(5) # 定義http連接超時時間(5秒)
conn = httplib.HTTPConnection(checkurl) # 創(chuàng)建http連接對象
try:
conn.request("GET", "/", headers={"Host": appdomain}) # 發(fā)起URL請求颖变,添加host主機頭
r = conn.getresponse()
getcontent = r.read(15) # 獲取URL頁面前15個字符,以便做可用性校驗
finally:
if getcontent.lower() == "<!doctype html>": # 監(jiān)控URL頁的內(nèi)容一般是事先定義好听想,比如“HTTP200”等
print ip + " [OK]"
else:
print ip + " [Error]" # 此處可放告警程序腥刹,可以是郵件、短信通知
if __name__ == "__main__":
if get_iplist(appdomain) and len(iplist) > 0: # 條件:域名解析正確且至少要返回一個IP
for ip in iplist:
checkip(ip)
else:
print "dns resolver error."