【问题标题】:Dns response doesn't reach destinationDns 响应未到达目的地
【发布时间】:2015-08-13 06:32:55
【问题描述】:

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

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

客户端wireshark: 服务器线鲨:

客户端代码:

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()

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2018-12-03
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多