2015-05-30 23 views
1

我想用python代碼編寫我自己的dns服務器。所以,我從我的電腦發送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) 

Server代碼: 我把這個代碼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 BTW,它是「預先感謝」,而不是「先進的感謝」。 –

回答

0

這可能因爲服務器失敗。嘗試做一個ping到random1231.ns.cs.colman.ac.il,你會看到與該域,響應服務器故障:

enter image description here

因此,miniDNS程序沒有捕捉DNS請求。你有沒有嘗試將它安裝在你的localhost地址上? (127.0.0.1,比如端口4567),並將您的DNS服務配置爲該地址。

+0

也許你嘗試當服務器代碼沒有打開。我試圖ping類似1111.ns.cs.colman.ac .il和服務器發送這個包。http://s16.postimg.org/ofvq4yoph/pinganswer.png – Naim