【问题标题】:Human readable form of DNS lookup人类可读的 DNS 查询形式
【发布时间】:2011-07-02 13:02:21
【问题描述】:

我有一个非常简单的想法,我想尝试一下。假设我有一个浏览器,例如 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

【问题讨论】:

  • 如果你想查找一个 IP,为什么不直接使用 dig 或 nslookup 呢?

标签: dns python tcp


【解决方案1】:

如果你想使用 python 分析查询数据,我推荐优秀的 scapy 库 (http://www.secdev.org/projects/scapy/) 它有许多网络协议的解码(和构建!)例程,包括域名系统。

这是添加了 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

享受吧!

【讨论】:

    【解决方案2】:

    如果您只想阅读机器上正在发送/接收的查询,您可以使用Wireshark

    如果您真的想将 DNS 请求解码作为练习,那么您最好的初始资源是 DNS RFC:https://www.rfc-editor.org/rfc/rfc1035

    【讨论】:

      【解决方案3】:

      如果您只想在 python 中进行 nslookup,请查看http://small-code.blogspot.com/2008/05/nslookup-in-python.html

      如果您真的想要原始 DNS 服务器响应,那就另当别论了。目标到底是什么?

      【讨论】:

        【解决方案4】:

        你的目标是什么?

        如果您想了解 DNS 的运作方式,可以从阅读相关的 RFC 开始。或者使用 wireshark 为您捕获和分析 DNS 流量。

        【讨论】:

        • 两者。仅使用wireshark 会导致对协议的不完全理解,并且很可能导致不正确的实现。
        • @JdeBP 对于 DNS RFC 的说法不如其他一些。
        • DNS RFC 也比其他一些 RFC 更多正确。
        猜你喜欢
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多