python - DNS 响应未到达目的地

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

最佳答案

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

enter image description here

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

关于python - DNS 响应未到达目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30545719/

相关文章:

python - Django BigInteger自动增量字段作为主键?

python - 使用 python Fabric 的 Linux 机器的目录大小

opencv - cv2 问题中的 Fourcc

windows - 在 Python 中获取网络位置的 DFS 路径

python - 为什么我的 python 代码在调试器中按预期运行而不是其他方式?

python - 在 hadoop 中将附加文件附加到 python 流作业

python - Django 如何根据选择字段验证请求的 URL?

.NET 到远程 SQL Server 在一台计算机上速度较慢,在另一台计算机上则不然

ssl - 通配符证书在未指定 FQDN 时标记为无效,即使它在搜索域中?

windows - 在Windows计算机上为单个DNS映射覆盖DNS服务器