2015-05-30 3 views
1

Я пытаюсь написать свой собственный DNS-сервер с кодом python. Итак, я отправляю запрос dns с моего компьютера на свой шлюз (который я получаю из ipconfig-> шлюза по умолчанию). Запрос доходит до моего сервера, и когда я пытаюсь ответить, кажется, что ответ DNS не достигает адресата клиента (в этом случае мой компьютер).
На клиенте я получаю «Стандартный ответ на запрос сервера» вместо обычного ответа 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() 
+0

В отличие от сайтов на форуме, мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be «Спасибо заранее», а не «Спасибо в продвинутом». –

ответ

0

Это, вероятно, потому что сервер : не работает. Попробуйте сделать пинг к random1231.ns.cs.colman.ac.il, вы увидите, что с этим доменом, ответ отказа сервера:

enter image description here

Таким образом, программа miniDNS не захватывая DNS-запросы. Вы пытались установить его на свой адрес localhost? (127.0.0.1, скажем, порт 4567) и настройте службу DNS на этот адрес.

+0

Возможно, вы пытались, когда код сервера не был включен. Я попытался пронести что-то вроде 1111.ns.cs.colman.ac .il и сервер отправляет этот пакет. http://s16.postimg.org/ofvq4yoph/pinganswer.png – Naim

Смежные вопросы