# 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 = https://www.cnblogs.com/cong12586/p/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__":
# 入參為要查詢的域名,和第一個域名服務器的地址,
dns_name = 'www.baidu.com'
dns_ip = '192.168.60.14'
dns_query(dns_name,dns_ip)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247949.html
標籤:Python
