09python實現DNS查詢網域名稱對應的IP位址

2022-03-17 06:47:06 字數 1327 閱讀 7075

# dns:是乙個udp層上邊的協議,用於將網域名稱轉換成ip位址,在我們平時瀏覽網頁的時候,

# 這個我們平時用到的特別多的,在我們開啟瀏覽器進行搜尋網頁的時候,不是填入ip位址進行

# 搜尋的,而只是輸入網域名稱,dns協議會將網域名稱解析成ip位址,然後記性尋找我們訪問的網頁。

from scapy.all import *

# 傳入兩個引數,網域名稱和網域名稱伺服器。

def dns_query(dns_name,dns_ip):

# 首先構造乙個dns的包,ip的目的位址為第乙個網域名稱伺服器位址,udp欄位讓scapy自己填寫,後邊我們填寫dns欄位的選項部分。

# 這裡是收乙個包,傳送乙個包。

dns_response = sr1(ip(dst = dns_ip)/udp()/dns(id=435,qr = 0,opcode=0,ra = 1,qd=dnsqr(qname=dns_name)),verbose=false)

# print(dns_response.show())

# 下邊進行解析包。乙個dns的應答包中可能包含很多的回答,因為我們訪問的網域名稱可能有特別多的別名。

layer = 1

while true:

try:

print(dns_response.getlayer(dns).fields['an'][layer].fields['type'])

# 判斷是否是a記錄,每一層就是乙個記錄,但是不一定是a,可能是cname!

# 只有a記錄裡邊有ip位址,cname裡邊是別名。

# 這裡我們在a記錄裡邊進行解析,如果不是a記錄,那麼就跳過。

if dns_response.getlayer(dns).fields['an'][layer].fields['type'] == 1: # a記錄

# 取出ip位址。

ip_data = dns_response.getlayer(dns).fields['an'][layer].fields['rdata']

print('網域名稱為:',dns_name,'的ip位址為:',ip_data)

layer += 1

except exception as e :

# 如果錯誤的話,就代表著包結束了

print("錯誤",e)

break

if __name__ == "__main__":

# 入參為要查詢的網域名稱,和第乙個網域名稱伺服器的位址。

09 Python基礎之注釋

當你把變數理解透了,你就已經進入了程式設計的世界。隨著學習的深入,用不了多久,你就可以寫複雜的上千甚至上萬行的 啦,有些 你花了很久寫出來,過了些天再回去看,發現竟然看不懂了,這太正常了。另外,你以後在工作中會發現,乙個專案多是由幾個甚至幾十個開發人員一起做,你要呼叫別人寫的 別人也要用你的,如果 ...

09 Python兩種建立類的方式

第一種比較普遍的方式 1 class work 2def init self,name 3 self.name name 45 w work well woker 這樣就簡單建立了乙個類,分別列印w的型別和work的型別 1 print type w 2print type work 這就說明typ...

python實現網域名稱系統 DNS 正向查詢的方法

網域名稱系統 dns 是乙個分布式的資料庫,主要程式設計客棧是用來把主機名換成ip位址。dns存在有兩大理由 1 可以使使用者方便記住名字,而不是純粹的ip位址 2 允許伺服器改變ip位址,但可以使用原來的網域名稱。系統中最基本的查詢為正向查詢,它會根據乙個主機名來查詢ip位址。例如如果你想從www...