網站首頁 編程語言 正文
dnspython是python實現的一個DNS工具包,它支持記錄類型、查詢、傳輸并動態更新ZONE信息等等。據說dnspython可以代替dig、nslookup等工具。下面我們就來介紹dnspython模塊的使用。
dnspython源碼安裝
這里介紹一下dnspython模塊的安裝,采用源碼的安裝方式,目前使用的版本是1.16.0
如下安裝:
wget https://www.dnspython.org/kits/1.16.0/dnspython-1.16.0.tar.gz
tar -zxvf dnspython-1.16.0.tar.gz
cd dnspython-1.16.0
python setup.py install
看到紅框的信息說明安裝完成了。
好了,開始進入今天的正題,python模塊的講解。
python模塊域名解析方法講解
平常測試DNS的時候,有些操作手動處理不方便,需要寫個腳本來實現,這是就會想到使用dnspython模塊,它提供了大量的DNS處理方法,我們知道最常用的方法就是域名查詢,dnspyhton庫提供一個解析器類(resolver),我們可以使用它query方法實現域名查詢功能。這里要說一下query:
query(self, qname, rdtype = 1, rdclass = 1, tcp = False, source = None, raise_on_no_answer = True, source_port = 0)
qname:查詢的域名。
rdtype :指定RR資源的類型
全部的rdtype類型為:
常用的有以下幾種:
A記錄:將主機名轉換成IP地址
MX記錄:郵件交換記錄,定義郵件服務器的域名
CNAME記錄:別名記錄,實現域名間的映射
NS記錄:標記區域的域名服務器及授權子域
PTR記錄:反向解析,與A記錄相反,將IP地址轉換為主機名
SOA記錄:SOA標記,一個起始授權區的定義
rdclass: 指定網絡類型,可選的值為CH、IN。其中IN為默認的,使用最廣泛。
tcp :指定查詢是否啟動TCP協議,默認不啟動。
source與source_port:指定的查詢源地址與端口。
raise_on_no_answer :指定查詢無應答時是否觸發異常,默認為True。
下面我們開始對常見解析類型進行說明。
解析類型說明
A記錄
#!/usr/local/bin/python38
# -*- coding: utf-8 -*-
import dns.resolver
domain = input('Please input an domain: ') #輸入域名地址
A = dns.resolver.query(domain, 'A') #查詢記錄為A記錄
for i in A.response.answer:
for j in i.items:
if j.rdtype == 1: #加判斷,不然會出現AttributeError: 'CNAME' object has no attribute 'address'
print(j.address)
運行代碼查看結果,這里以www.baidu.com域名為例:
這樣子我們就將www.baidu.com的域名解析出來了。 來看看效果:
MZ記錄
#!/usr/local/bin/python38
# -*- coding: utf-8 -*-
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)
運行代碼查看結果,這里以qq.com域名為例:
其中我們可以看到preference值(優先級)和exchange值(交換地址),其中優先級默認為10,MX記錄可以通過設置優先級實現主輔服務器設置,”優先級”中的數字越小表示級別越高,“優先級”僅對MX記錄有效。
NS記錄
NS(Name Server)域名服務器記錄。用來表明由哪臺服務器對該域名進行解析。在注冊域名時,總有默認的DNS服務器,每個注冊的域名都是由一個DNS域名服務器來進行解析的。
下面實現NS記錄查詢方法:
#!/usr/local/bin/python38
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())
運行結果如下:
只限輸入一級域名,如baidu.com。如果輸入二級或多級域名,如:www.baidu.com,則是錯誤的,我們可以試一下,驗證問題:
CNAME記錄
使用CNAME時,CNAME的目標主機地址只能使用主機名,不能使用IP地址。主機名前不能有任何其他前綴,如:http://等是不被允許的。
來看看下面代碼實現CNAME記錄方法:
#!/usr/local/bin/python38
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())
運行結果如下:
運行結果出現www.a.shifen.com域名,這個域名就是www.baidu.com的別名指向。相當于用子域名來代替ip地址,優點是如果ip地址變化,只需要改動子域名的解析,而不需要逐一改變ip地址解析。
DNS域名輪詢業務監控
大部分的DNS解析器都是一個域名對應一個IP地址,但是通過DNS輪詢技術可以做到一個域名對應多個IP,從而實現最簡單高效的負載平衡,不過此方最大的弊端是目標主機不可用時無法被自動剔除,因此做好業務主機的服務可用監控至關重要。
下面我們來實現域名的解析,獲取域名的所有A記錄解析IP列表。
#!/usr/local/bin/python38
import dns.resolver
import httplib2
iplist = []
appdomain = "www.baidu.com"
def get_iplist(domain=""):
try:
A = dns.resolver.query(domain,"A")
except Exception as e:
print("dns resolver error:" + str(e))
return
for i in A.response.answer:
for j in i.items:
if j.rdtype == 1:
iplist.append(j.address)
return True
def checkip(ip):
checkurl = 'http://' + ip + ":80"
getcontent = ""
httplib2.socket.setdefaulttimeout(5)
conn = httplib2.Http()
try:
resp,getcontent=conn.request(checkurl)
finally:
if resp['status']== "200":
print(ip+"[OK]")
else:
print(ip+"[Error]")
if __name__ == "__main__":
if get_iplist(appdomain) and len(iplist) > 0:
for ip in iplist:
checkip(ip)
運行結果如下:
從結果可以看出,域名www.baidu.com解析出3個IP地址,并且服務都是正常的。上面的代碼,第一步通過dns.resolver.query()方法獲取業務域名A記錄信息,查詢出所有IP地址列表,再使用httplib模塊的request()方法以GET方式請求監控頁面,監控業務所有服務的IP是否服務正常。
總結
我們知道將IP地址轉換為可讀格式或單詞后,便稱為域名。在python中,域名到IP地址的轉換由python模塊dnspython管理。它支持記錄類型、查詢、傳輸并動態更新ZONE信息的方法。感興趣的朋友,可以去看看dnspython源碼。
原文鏈接:https://blog.csdn.net/chen1415886044/article/details/108320745
相關推薦
- 2024-01-12 如何理解 Elasticsearch 中的 Indices、Types、Documents、Fiel
- 2023-07-16 uniapp 下拉菜單 picker
- 2022-05-13 Flutter開發之——getX-GetPage中間件(11)
- 2022-07-10 axios調用接口報錯
- 2022-11-22 python正則表達式中匹配次數與貪心問題詳解(+??*)_python
- 2022-06-25 CentOS?8?安裝調試KVM的詳細步驟_Kvm
- 2022-09-15 Android?Jetpack庫剖析之Lifecycle組件篇_Android
- 2022-10-04 Python的getattr函數方法學習使用示例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支