# DNS:是一个UDP层上边的协议,用于将<a href="https://www.gaodaima.com/tag/%e5%9f%9f%e5%90%8d" title="查看更多关于域名的文章" target="_blank">域名</a>转换成IP地址,在我们平时浏览网页的时候,<br># 这个我们平时用到的特别多的,在我们打开浏览器进行搜索网页的时候,不是填入IP地址进行<br># 搜索的,而只是输入域名,DNS协议会将域名解析成IP地址,然后记性寻找我们访问的网页。<br>from scapy.all import *<br># 传入两个参数,域名和域名服务器。<br>def <a href="https://www.gaodaima.com/tag/dns" title="查看更多关于dns的文章" target="_blank">dns</a>_query(dns_name,dns_<a href="https://www.gaodaima.com/tag/ip" title="查看更多关于ip的文章" target="_blank">ip</a>):<br> # 首先构造一个DNS的包,IP的目的地址为第一个域名服务器地址,UDP字段让scapy自己填写,后边我们填写DNS字段的选项部分。<br> # 这里是收一个包,发送一个包。<br> dns_response = sr1(IP(dst = dns_ip)/UDP()/DNS(id=435,qr = 0,opcode=0,ra = 1,qd=DNSQR(qname=dns_name)),verbose=False)<br> # print(dns_response.show())<br> # 下边进行解析包。一个DNS的应答包中可能包含很多的回答,因为我们访问的域名可能有特别多的别名。<br> layer = 1<br> while True:<br> try:<br> print(dns_response.getlayer(DNS).fields["an"][layer].fields["type"])<br> # 判断是否是A记录,每一层就是一个记录,但是不一定是A,可能是CNAME!<br> # 只有A记录里边有IP地址,CNAME里边是别名。<br> # 这里我们在A记录里边进行解析,如果不是A记录,那么就跳过。<br> if dns_response.getlayer(DNS).fields["an"][layer].fields["type"] == 1: # A记录<br> # 取出IP地址。<br> ip_data = dns_response.getlayer(DNS).fields["an"][layer].fields["rdata"]<br> print("域名为:",dns_name,"的IP地址为:",ip_data)<br> layer += 1<br> except Exception as e :<br> # 如果错误的话,就代表着包结束了<br> print("错误",e)<br> break<br><br><br><br>if __name__ == "__main__":<br> # 入参为要查询的域名,和第一个域名服务器的地址。<br> dns_name = "www.baidu.com"<br> dns_ip = "192.168.60.14"<br> dns_query(dns_name,dns_ip)
www#gaodaima.com来源gaodai$ma#com搞$代*码*网搞代码