可读的DNS查找结果

2 投票
4 回答
4001 浏览
提问于 2025-04-16 20:46

我有一个很简单的想法想尝试一下。假设我在用浏览器,比如说 Chrome,我想查找一个域名的 IP 地址,比如 www.google.com。我用的是 Windows 7,并且把 DNS 查询的设置改成了手动,给了一个地址 127.0.0.1,这是我用 Python 写的服务器所在的地方。我启动了我的服务器,看到有 DNS 查询的请求,但显示的内容有点奇怪,像这样:

WAITING FOR CONNECTION.........

.........recieved from :  ('127.0.0.1', 59339)

'V"\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x06teredo\x04ipv6\tmicrosoft\x03com\x00\x00\x01\x00\x01'

其中的 waiting for connectionreceived from 是我服务器发出的。那么我该如何将这个信息转换成更容易理解的形式呢?

这是我的服务器代码(虽然很基础,但还是分享一下):

代码如下:

from time import sleep 
import socket 
host='' 
port=53 
addr_list=(host,port) 
buf_siz=1024 
udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
udp.bind(addr_list) 
while True: 
    print 'WAITING FOR CONNECTION.........' 
    data,addr = udp.recvfrom(buf_siz) print '.........recieved from : ',addr 
    sleep(3) 
    print data

4 个回答

0

如果你只是想在Python中做一个nslookup(域名查询),可以看看这个链接:http://small-code.blogspot.com/2008/05/nslookup-in-python.html

不过,如果你想要的是原始的DNS服务器响应,那就另当别论了。你到底想要达到什么目的呢?

2

如果你只是想查看在你电脑上发送和接收的查询信息,可以直接使用Wireshark这个工具。

如果你想要练习解码DNS请求,那么最好的起步资源就是DNS的官方文档,也就是RFC文档:https://www.rfc-editor.org/rfc/rfc1035

4

如果你想用Python分析查询数据,我推荐一个很棒的库叫做scapy(http://www.secdev.org/projects/scapy/)。这个库可以解码(和构建!)很多网络协议,包括DNS。

下面是你原来的程序,添加了scapy解码的部分:

from time import sleep
import socket
from scapy.all import DNS #Bring in scapy's DNS decoder

host=''
port=53
addr_list=(host,port)
buf_siz=1024
udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp.bind(addr_list)
while True:
    print 'WAITING FOR CONNECTION.........'
    data,addr = udp.recvfrom(buf_siz) print '.........recieved from : ',addr
    sleep(3)
    #Decode the DNS data
    decoded = DNS(data)
    #Print the decoded packet
    decoded.show()

对于你提到的原始数据包,这段代码会输出:

###[ DNS ]###
  id        = 22050
  qr        = 0L
  opcode    = QUERY
  aa        = 0L
  tc        = 0L
  rd        = 1L
  ra        = 0L
  z         = 0L
  rcode     = ok
  qdcount   = 1
  ancount   = 0
  nscount   = 0
  arcount   = 0
  \qd        \
   |###[ DNS Question Record ]###
   |  qname     = 'teredo.ipv6.microsoft.com.'
   |  qtype     = 12288
   |  qclass    = 256
  an        = None
  ns        = None
  ar        = None
###[ Raw ]###
     load      = '\x01'

关于scapy的安装说明可以在这里找到:http://www.secdev.org/projects/scapy/doc/installation.html#installing-scapy-v2-x

如果你使用的是ubuntu,只需运行 sudo apt-get install python-scapy 就可以了。

祝你玩得开心!

撰写回答