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