VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 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)

相关教程