09python实现DNS查找域名对应的IP地址

# 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)
原文地址:https://www.cnblogs.com/cong12586/p/14267232.html