Python DNS解析之pydns/py3dns使用文檔

由於工作中需要解析大量域名,獲取DNS解析記錄信息,於是找到了pydns庫,此第三方庫支持DNS解析,但是發現缺乏相關文檔,特此整理了pydns/py3dns的使用文檔。

前提

在此之前,你可能需要回顧下DNS有關基礎知識,特別是域名相關解析記錄類型,如下:

A記錄: 將域名指向一個IPv4地址(例如:100.100.100.100),需要增加A記錄

CNAME記錄: 如果將域名指向一個域名,實現與被指向域名相同的訪問效果,需要增加CNAME記錄。這個域名一般是主機服務商提供的一個域名

MX記錄: 建立電子郵箱服務,將指向郵件服務器地址,需要設置MX記錄。建立郵箱時,一般會根據郵箱服務商提供的MX記錄填寫此記錄

NS記錄: 域名解析服務器記錄,如果要將子域名指定某個域名服務器來解析,需要設置NS記錄

TXT記錄: 可任意填寫,可爲空。一般做一些驗證記錄時會使用此項,如:做SPF(反垃圾郵件)記錄

AAAA記錄: 將主機名(或域名)指向一個IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA記錄

SRV記錄: 添加服務記錄服務器服務記錄時會添加此項,SRV記錄了哪臺計算機提供了哪個服務。格式爲:服務的名字.協議的類型(例如:_example-server._tcp)。

SOA記錄: SOA叫做起始授權機構記錄,NS用於標識多臺域名解析服務器,SOA記錄用於在衆多NS記錄中那一臺是主服務器

PTR記錄: PTR記錄是A記錄的逆向記錄,又稱做IP反查記錄或指針記錄,負責將IP反向解析爲域名

顯性URL轉發記錄: 將域名指向一個http(s)協議地址,訪問域名時,自動跳轉至目標地址。例如:將www.liuht.cn顯性轉發到www.itbilu.com後,訪問www.liuht.cn時,地址欄顯示的地址爲:www.itbilu.com。

隱性UR轉發記錄L: 將域名指向一個http(s)協議地址,訪問域名時,自動跳轉至目標地址,隱性轉發會隱藏真實的目標地址。例如:將www.liuht.cn顯性轉發到www.itbilu.com後,訪問www.liuht.cn時,地址欄顯示的地址仍然是:www.liuht.cn。

DNS默認端口爲:53

DNS同時支持UDP和TCP協議,但一般情況下使用的都是UDP協議,關於協議的使用場景,可閱讀:https://draveness.me/whys-the-design-dns-udp-tcp

好的,瞭解了DNS的基礎知識,下面我們開始介紹pydns的使用方法

庫導入

pydns/py3dns使用時,庫導入方法如下:

import DNS

此處我遇到了問題,發現如果和 dnspython 混用的話,會出現無法導入的問題,具體原因不得而知,解決辦法是 卸載 dnspython 和 pydns/py3dns,然後再重新安裝

sudo pip uninstall dnspython
sudo pip uninstall pydns
sudo pip install pydns

使用

簡單查詢

使用 dnslookup方法來進行查詢,其參數有三個,分別是:

  • name: 需要查詢的域名
  • qtype: 查詢記錄類型,如ACNAMEMX
  • timeout: dns解析超時時間,默認值爲 30s

查詢 baidu A記錄信息:

DNS.dnslookup('www.baidu.com', qtype='A') # ['www.a.shifen.com', '220.181.38.149', '220.181.38.150']

查詢 baidu CNAME 信息:

DNS.dnslookup('www.baidu.com', qtype='CNAME') # ['www.a.shifen.com']

查詢MX記錄

可 使用 dnslookup指定qtype 爲 MX,也可以直接使用 mxlookup方法來進行查詢,其有兩個參數:

  • name: 需要查詢的域名
  • timeout: dns解析超時時間,默認值爲 30s

例:

DNS.mxlookup('www.baidu.com') # ['www.a.shifen.com']

DNS反查

可使用revlookuprevlookupall實現DNS反查功能,兩者的區別在於 revlookup只會返回一條記錄,而revlookupall會返回所以查到的記錄,兩者參數相同如下:

  • name: 需要查詢的域名
  • timeout: dns解析超時時間,默認值爲 30s

例子:

DNS.revlookupall("10.237.8.5")
DNS.revlookup("10.237.8.5")

高級查詢

可能有時候,上面的參數並不能滿足我們的需求,比如需要從特定的DNS Server上面查詢,從特定端口查詢,從特定協議上查詢等,DnsRequest類可以滿足你的需求,DnsRequest 類創建時,常用的參數有:

  • name: 需要查詢的域名,如想支持多個域名,可使用,分隔
  • protocol:使用的協議,默認爲 udp
  • port: 使用的端口,默認爲 53
  • qtype: 解析記錄類型,默認爲A記錄
  • timeout: 超時時間,默認爲 30s
  • server: DNS server列表,默認爲空

例1:查詢 www.baidu.comA記錄信息:

req = DNS.DnsRequest(name="www.baidu.com")
r = req.req() # 發動查詢請求
r.show() # 展示查詢詳情,類似於 dig www.baidu.com 結果
print(r.answers) # DNS響應的數據

例2:查詢 www.baidu.com CNAME 信息,指定端口爲 53,使用TCP協議、超時時間爲 20,DNS地址爲 8.8.8.8

req = DNS.DnsRequest(name="www.baidu.com", qtype="CNAME", port=53, protocol='tcp', server=['8.8.8.8'])
r = req.req(timeout=20)
print(r.answers)
r.show()

其他

ParseResolvConf : 加載DNS解析配置,從而設置默認server地址,參數 resolv_path 指定配置地址,默認從 /etc/resolv.conf讀取DNS配置

例:

DNS.ParseResolvConf() # 從 /etc/resolv.conf 加載DNS server地址

參考:https://itbilu.com/other/relate/EyxzdVl3.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章