# 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__":
# 入參為要查詢的域名,和第一個域名服務器的地址。
dns_name = 'www.baidu.com'
dns_ip = '192.168.60.14'
dns_query(dns_name,dns_ip)