Python自動化運維筆記(三):DNS處理模塊dnspython

運行環境:Python3.6,Windwos10 RS1,Pycharm


模塊介紹

dnspythonPython實現的一個DNS工具包,支持幾乎所有的記錄類型,可以用於查詢,傳輸並動態更新ZONE信息,同時支持TSIG(事務簽名)驗證消息和EDNS0(擴展DNS)。可以替代nslookupdig等工具,輕鬆做到平臺整合

模塊安裝

因爲我電腦目前環境是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記錄:一個起始授權區的定義

如果想要了解更多關於域名解析類型的信息,可以參考這篇文章(鏈接

常見域名解析示例

上面說到了六種域名解析類型,不過我們常用的不過AMXNSCNAME四種解析類型。

①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.combaidu.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.comwenku.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記錄不生效。

發佈了49 篇原創文章 · 獲贊 84 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章