Dns响应无法到达目的地

时间:2015-05-30 11:40:38

标签: python python-2.7 dns network-programming pycharm

我试图用python代码编写自己的dns服务器。所以,我将dns请求从我的计算机发送到我的网关(我从ipconfig->默认网关获得)。请求到达我的服务器,当我尝试响应时,似乎dns响应未到达客户端目的地(在这种情况下是我的计算机)。
在客户端我得到"标准查询响应服务器故障"而不是常规的DNS响应。

我做错了什么?我该如何解决?

客户端wireshark: client 服务器wireshark: sever

客户代码:

def ConvertToDnsNameFormat(name) :
    result = ""
    lock = 0
    name += "."
    length = len(name)
    for i in range(0, length) :
        if name[i] == "." :
            result += chr(i-lock)
            while lock < i :
                result += name[lock]
                lock = lock + 1
            lock = lock + 1
    result += (chr(0))
    return  result


hostname= "random1231.ns.cs.colman.ac.il"
hostname = ConvertToDnsNameFormat(hostname)
format = '!HHHHHH' + str(len(hostname)) + 'sHH' # the DNS query format
dnsMessage = pack(format, 1234, 256, 1, 0, 0, 0, hostname, 1, 1) # create the massage

#my gateway
HOST_IP = "192.168.1.1"
PORT = 53

AF = socket.AF_INET
TYPE = socket.SOCK_DGRAM
PROTO = socket.IPPROTO_UDP
mySocket = socket.socket(AF, TYPE, PROTO)

mySocket.sendto(dnsMessage, (HOST_IP, PORT))
(resp, address) = mySocket.recvfrom(1024)

服务器代码: 我从here

获取了此代码
import socket

class DNSQuery:
  def __init__(self, data):
    self.data=data
    self.dominio=''

    tipo = (ord(data[2]) >> 3) & 15   # Opcode bits
    if tipo == 0:                     # Standard query
      ini=12
      lon=ord(data[ini])
      while lon != 0:
        self.dominio+=data[ini+1:ini+lon+1]+'.'
        ini+=lon+1
        lon=ord(data[ini])

  def respuesta(self, ip):
    packet=''
    if self.dominio:
      packet+=self.data[:2] + "\x81\x80"
      packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'   # Questions and Answers Counts
      packet+=self.data[12:]                                         # Original Domain Name Question
      packet+='\xc0\x0c'                                             # Pointer to domain name
      packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'             # Response type, ttl and resource data length -> 4 bytes
      packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.'))) # 4bytes of IP
    return packet

if __name__ == '__main__':
  ip='192.168.1.1'
  print 'pyminifakeDNS:: dom.query. 60 IN A %s' % ip

  udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  udps.bind(('10.10.250.40',53))

  try:
    while 1:
      data, addr = udps.recvfrom(1024)
      p=DNSQuery(data)
      udps.sendto(p.respuesta(ip), addr)
      print 'Respuesta: %s -> %s' % (p.dominio, ip)
  except KeyboardInterrupt:
    print 'Finalizando'
    udps.close()

1 个答案:

答案 0 :(得分:1)

这可能是因为服务器 失败了。尝试对random1231.ns.cs.colman.ac.il执行ping操作,您将看到该域的响应是服务器故障:

enter image description here

因此,miniDNS程序没有捕获DNS请求。您是否尝试在本地地址上安装它? (127.0.0.1,比如端口4567)并将DNS服务配置为该地址。