python dns模塊


python dns模塊

dns常見的幾種解析類型

記錄 解釋
A IP Address 記錄,通過 hostname 獲取到ip 地址。
AAAA IP Address 記錄,通過 hostname 獲取到ipIPv6 地址.
PTR 反向dns解析, 使用ip 查找hostname記錄。
NS 負責域查詢的名稱服務器記錄。NS記錄是指定由哪個DNS服務器解析你的域名。
MX 郵件交換器記錄。服務器負責處理給定域的電子郵件。
SOA 授權起始記錄描述了區域管理員定義的有關區域的一些關鍵數據
CNAME 規范名稱或別名,這允許為資源提供備用名稱。
TXT 提供有關域的描述性數據的通用文本記錄。一般指某個主機名或域名的說明

使用dnspython 實現dns的查詢

安裝

pip3 install dnspython

通過 dns.resolver.query來實現dns解析查詢

query 參數解釋

  • qname參數為查詢的域名。
  • rdtype參數用來指定RR資源的類型,常用的有:A記錄、MX記錄、CNAME記錄、NS記錄、PTR記錄等。
  • rdclass參數用於指定網絡類型,可選值有IN、CH、與HS,其中IN為默認,使用最廣泛。
  • tcp參數用於指定查詢是否啟用TCP協議,默認為False不啟用。
  • source與source_port參數作為指定查詢源地址與端口,默認值為查詢設備IP地址和0。
  • raise_on_no_answer參數用於指定當查詢無應答時是否觸發異常,默認為True。

查詢一個A記錄

import dns.resolver
domain = 'www.biglittleant.cn'
qtype = 'A'
answer = dns.resolver.query(domain,qtype, raise_on_no_answer=False)
if answer.rrset is not None:
    print(answer.rrset)

結果

biglittleant.github.io. 3600 IN A 185.199.108.153
biglittleant.github.io. 3600 IN A 185.199.109.153
biglittleant.github.io. 3600 IN A 185.199.110.153
biglittleant.github.io. 3600 IN A 185.199.111.153

反向查詢,通過ip查詢域名

第一步通過 reversename 拿到反轉地址

from dns import reversename, resolver
ip = '13.229.188.59' #github.com 的ip
domain_address = reversename.from_address(ip)
print(domain_address)
qtype = 'PTR'
domain_name = str(resolver.query(domain_address, qtype)[0])
print(domain_name)

結果

59.188.229.13.in-addr.arpa.
ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.

NS記錄查詢

這里輸入的域名得是二級域名。三級域名會報錯。

import dns.resolver

myResolver = dns.resolver.Resolver()
myResolver.nameservers = ['223.5.5.5', '223.6.6.6']
myAnswers = myResolver.query("biglittleant.cn", "NS")
if myAnswers.rrset is not None:
    print(myAnswers.rrset)

myAnswers = myResolver.query("qq.com", "NS")
if myAnswers.rrset is not None:
    print(myAnswers.rrset)
biglittleant.cn. 3600 IN NS dns10.hichina.com.
biglittleant.cn. 3600 IN NS dns9.hichina.com.
qq.com. 3600 IN NS ns2.qq.com.
qq.com. 3600 IN NS ns1.qq.com.
qq.com. 3600 IN NS ns3.qq.com.
qq.com. 3600 IN NS ns4.qq.com.

搜索可知,ns.qq.com 是騰訊的dns服務器,hichina.com 是萬網的dns服務器。
biglittleant.cn的解析記錄是在阿里雲,qq.com的解析記錄是在騰訊雲

txt 記錄

這里輸入的域名得是二級域名。三級域名會報錯。

import dns.resolver

myResolver = dns.resolver.Resolver()
myAnswers = myResolver.query("qq.com", "TXT")
if myAnswers.rrset is not None:
    print(myAnswers.rrset)

結果

qq.com. 31 IN TXT "v=spf1 include:spf.mail.qq.com -all"

指定dns server 來查詢

import dns.resolver

myResolver = dns.resolver.Resolver()
myResolver.nameservers = ['223.5.5.5', '223.6.6.6']
myAnswers = myResolver.query("www.biglittleant.cn", "A")
if myAnswers.rrset is not None:
    print(myAnswers.rrset)

結果

biglittleant.github.io. 600 IN A 185.199.110.153
biglittleant.github.io. 600 IN A 185.199.111.153
biglittleant.github.io. 600 IN A 185.199.109.153
biglittleant.github.io. 600 IN A 185.199.108.153

一種偷懶的寫法

import dns.resolver
name = 'wwww.github.com'
for qtype in 'A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SOA':
    print(qtype)
    answer = dns.resolver.query(name, qtype,  raise_on_no_answer=False)
    if answer.rrset is not None:
        print(answer.rrset)

參考文檔

dnspython 官網
Examples
Domain Name System
添加解析記錄
《Python自動化運維:技術與最佳實踐》一1.3 DNS處理模塊dnspython
DNS處理模塊dnspython


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM