運行環境:Python3.6,Windwos10 RS1,Pycharm
模塊介紹
dnspython
是Python
實現的一個DNS
工具包,支持幾乎所有的記錄類型,可以用於查詢,傳輸並動態更新ZONE信息,同時支持TSIG
(事務簽名)驗證消息和EDNS0
(擴展DNS)。可以替代nslookup
,dig
等工具,輕鬆做到平臺整合
模塊安裝
因爲我電腦目前環境是Python3.6
,已經繼承了pip
軟件管理工具,所以我就直接使用pip
來進行安裝dnspython
模塊了。
pip install dnspython #最新版本爲1.15.0,如果是Python2和Python3環境同時安裝了,安裝到指定python3上,則使用pip3 install dnspython進行安裝
域名解析方法
dnspython
提供了大量的DNS
處理方法,最常用的是域名查詢。dnspython
提供了一個DNS
解析器類resolver
,使用它的query
方法來實現域名的查詢功能.
query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)
qname
爲查詢的域名,rdtype
用來指定RR
資源的類型:
A記錄:將主機名轉換成IP地址
MX記錄:郵件交換記錄,定義郵件服務器域名
CNAME記錄:別名記錄,實現域名間的映射
NS記錄:標記區域的域名服務器及授權子域
PTR記錄:反向解析,與A記錄相反,將IP轉換爲主機名
SOA記錄:一個起始授權區的定義
如果想要了解更多關於域名解析類型的信息,可以參考這篇文章(鏈接)
常見域名解析示例
上面說到了六種域名解析類型,不過我們常用的不過A
、MX
、NS
、CNAME
四種解析類型。
①A記錄
關於A記錄的實例代碼如下:
# -*- coding: utf-8 -*-
# @Time : 2017/10/1 9:58
# @File : DNS.py
# @Software: PyCharm
import dns.resolver
domain = input("請輸入域名地址:") # 輸入域名地址
A = dns.resolver.query(domain, 'A') # 指定查詢記錄爲A型
for i in A.response.answer: # 通過response.answer方法獲取查詢迴應信息
# print(i)
for j in i.items:
print(j)
運行結果如下:
請輸入域名地址:>? www.baidu.com
www.a.shifen.com.
14.215.177.38
14.215.177.39
這樣子我們就將www.baidu.com
的域名解析出來了。
除此之外,我們可以在調試窗口中看一下變量i是什麼。
print(i) # 輸出變量i中的內容
輸出結果如下:
>>> print(i)
www.a.shifen.com. 225 IN A 14.215.177.38
www.a.shifen.com. 225 IN A 14.215.177.39
發現i
中具有兩個條目,對應我們輸出的j
值。
另外這裏面有幾個需要注意的地方:
- 在《Python自動化運維》一書中使用的
Python2.6
,示例代碼中最後一行爲print j.address
,即打印出變量i中的address
屬性,但是我在運行代碼時出現異常,提示並沒有該address
屬性存在,而直接打印變量j
即可反饋出解析地址,這個具體原因還未知。- 該
DNS
解析時出現了一個新的域名www.a.shifen.com
,上網查了一下相關資料,根據dig
跟蹤發現shifen.com
和baidu.com
服務器是同一臺,具體可以參考(鏈接)
②MX記錄
實現MX記錄查詢方法示例,在上面提到了是用於郵箱解析的,所以我們以QQ郵箱爲例。
# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain')
MX = dns.resolver.query(domain, 'MX') # 指定解析類型爲MX記錄
for i in MX: # 遍歷迴應結果
print('MX preference =', i.preference, 'mail exchanger =', i.exchange)
運行結果如下:
>>> Please input a domain>? qq.com
MX preference = 20 mail exchanger = mx2.qq.com.
MX preference = 30 mail exchanger = mx1.qq.com.
MX preference = 10 mail exchanger = mx3.qq.com.
其中我們可以看到
preference
值(優先級)和exchange
值(交換地址),其中優先級默認爲10
,MX記錄可以通過設置優先級實現主輔服務器設置,”優先級”中的數字越小表示級別越高,“優先級”僅對MX記錄有效。
③NS記錄
NS記錄示例代碼如下:
# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain')
NS = dns.resolver.query(domain, 'NS')
for i in NS.response.answer:
for j in i.items:
print(j.to_text())
運行結果如下:
>>> Input an domain>? baidu.com
dns.baidu.com.
ns3.baidu.com.
ns4.baidu.com.
ns2.baidu.com.
ns7.baidu.com.
NS(Name Server)
域名服務器記錄。用來表明由哪臺服務器對該域名進行解析。在註冊域名時,總有默認的DNS服務器
,每個註冊的域名都是由一個DNS域名服務器來進行解析的。但是需要注意的是隻能輸入一級域名,如:baidu.com
;對於二級以及多級域名,如www.baidu.com
、wenku.baidu.com
則是錯誤的。
④CNAME記錄
CNAME記錄查詢代碼示例如下:
# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain:')
CNAME = dns.resolver.query(domain,'CNAME')
for i in CNAME.response.answer:
for j in i.items:
print(j.to_text())
運行結果如下:
>>> Input an domain:>? www.baidu.com
www.a.shifen.com.
發現又再次出現了上面在A記錄中出現的
www.a.shifen.com
域名,這個域名就是www.baidu.com
的別名指向。相當於用子域名來代替ip地址
,優點是如果ip地址
變化,只需要改動子域名的解析,而不需要逐一改變ip地址
解析。注意事項:
- CNAME的目標主機地址只能使用主機名,不能使用
IP地址
;- 主機名前不能有任何其他前綴,如:
http://
等是不被允許的;- A記錄優先於CNAME記錄。即如果一個主機地址同時存在A記錄和CNAME記錄,則CNAME記錄不生效。