一、域名解析模塊(dnspython)
dnspython模塊提供了大量的DNS處理方法,最常用的方法是域名查詢。dnspython提供了一個DNS解析器類--resolver,使用它的query方法來實現域名的查詢功能。query方法的定義如下:
- A記錄:將主機名轉換成IP地址
- MX記錄:郵件交換記錄,定義郵件服務器的域名
- CNAME記錄:指別名記錄,實現域名間的映射
- NS記錄:標記區域的域名服務器及授權子域
- RTP記錄:反向解析,與A記錄相反,將IP轉換成主機名
- SOA記錄:SOA標記,一個起始授權區的定義
rdclass參數用於指定網絡類型,可選的值有IN,CH與HS,其中IN為默認,使用最廣泛。TCP參數用於指定查詢是否啟動TCP協議,默認為False(不啟用)。source與source_port參數作為指定查詢源地址與端口,默認值為查詢設備IP地址和0,raise_on_no_answer參數用於指定當查詢無應答是否觸發異常,默認為True
二、常見解析類型示例說明
常見的DNS解析類型包括A,MX,NS,CHANE等。利用dnspython的dns.resolver.query方法可以簡單實現這些DNS類型的查詢,為后面要實現的功能提供數據來源,比如對一個使用DNS輪循業務的域名進行可用性監控,需要得到當前的解析結果。
1. A記錄
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dns.resolver
domain = input("Please input an domain:").strip() # 輸入一個域名
A = dns.resolver.query(domain,'A') # 指定查看類型為A記錄
for i in A.response.answer: # 通過response.answer方法獲取查詢回應信息
for j in i.items: # 遍歷回應信息
print(j.address)
#run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自動化運維/IPy實用的IP地址處理模塊/dns輪循監控.py
Please input an domain:baidu.com
220.181.57.216
123.125.115.110
2. MX記錄
import dns.resolver
domain = input("Please input an domain:").strip()
MX = dns.resolver.query(domain, 'MX') # 指定查看類型為MX
for i in MX:
print('MX preference=',i.preference,'mail exchanger=',i.exchange)
# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自動化運維/IPy實用的IP地址處理模塊/dns輪循監控.py
Please input an domain:yeah.net
MX preference= 10 mail exchanger= yeahmx01.mxmail.netease.com.
MX preference= 50 mail exchanger= yeahmx00.mxmail.netease.com.
3. NS記錄
import dns.resolver
domain = input("Please input an domain:").strip()
ns = dns.resolver.query(domain,'NS') # 指定查詢類型為NS記錄
for i in ns.response.answer:
for j in i.items:
print(j.to_text())
# 只限輸入一級域名,如baidu.com.如果輸入二級域名或多級域名,如www.baidu.com,則是錯誤的
# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自動化運維/IPy實用的IP地址處理模塊/dns輪循監控.py
Please input an domain:baidu.com
ns3.baidu.com.
ns2.baidu.com.
ns7.baidu.com.
dns.baidu.com.
ns4.baidu.com.
4. CNAME記錄
import dns.resolver
domain = input("Please input an domain:").strip()
cname = dns.resolver.query(domain, 'CNAME') # 指定查詢類型為CNAME記錄
for i in cname.response.answer: # 結果將回應cname后的目標域名
for j in i.items:
print(j.to_text())
# run
結果將返回cname后的目標域名
