class DNSProxy(SocketServer.ThreadingMixIn, SocketServer.UDPServer): SocketServer.ThreadingMixIn.daemon_threads = True allow_reuse_address = True def __init__(self, address=("0.0.0.0", 53), VERBOSE=2): self.VERBOSE = VERBOSE print "listening at:", address SELF = self class ProxyHandle(SocketServer.BaseRequestHandler): # Ctrl-C will cleanly kill all spawned threads daemon_threads = True # much faster rebinding allow_reuse_address = True def handle(self): data = self.request[0] socket = self.request[1] addr = self.client_address DNSProxy.transfer(SELF, data, addr, socket) SocketServer.UDPServer.__init__(self, address, ProxyHandle) def loadConfig(self, config): self.DNSS = config.DNSS self.servers = Servers() for s in self.DNSS: assert len(s) == 3 ip, port, type_of_server = s self.servers.addDNSServer(DNSServer(ip, port, type_of_server)) self.WHITE_DNSS = config.WHITE_DNSS for ws in self.WHITE_DNSS: assert len(ws) == 4 ip, port, type_of_server, white_list = ws self.servers.addWhiteDNSServer(DNSServer(ip, port, type_of_server, white_list)) def transfer(self, query_data, addr, server): if not query_data: return domain = bytetodomain(query_data[12:-4]) qtype = struct.unpack('!h', query_data[-4:-2])[0] print 'domain:%s, qtype:%x, thread:%d' % \ (domain, qtype, threading.activeCount()) sys.stdout.flush() response = None for i in range(9): response, dnsserv = self.servers.query(query_data) if response: # udp dns packet no length server.sendto(response[2:], addr) if int(self.VERBOSE) > 0: dnsserv.showInfo(query_data, 0) dnsserv.showInfo(response[2:], 1) break if response is None: print "[ERROR] Tried 9 times and failed to resolve %s" % domain return
class DNSProxy(SocketServer.ThreadingMixIn, SocketServer.UDPServer): SocketServer.ThreadingMixIn.daemon_threads = True allow_reuse_address = True def __init__(self, address=("0.0.0.0", 53), VERBOSE=2): self.VERBOSE = VERBOSE print "listening at:", address SELF = self class ProxyHandle(SocketServer.BaseRequestHandler): # Ctrl-C will cleanly kill all spawned threads daemon_threads = True # much faster rebinding allow_reuse_address = True def handle(self): data = self.request[0] socket = self.request[1] addr = self.client_address DNSProxy.transfer(SELF, data, addr, socket) SocketServer.UDPServer.__init__(self, address, ProxyHandle) def loadConfig(self, config): self.DNSS = config.DNSS self.servers = Servers() for s in self.DNSS: assert len(s) == 3 ip, port, type_of_server = s self.servers.addDNSServer(DNSServer(ip, port, type_of_server, self.VERBOSE)) self.WHITE_DNSS = config.WHITE_DNSS for ws in self.WHITE_DNSS: assert len(ws) == 4 ip, port, type_of_server, white_list = ws self.servers.addWhiteDNSServer(DNSServer(ip, port, type_of_server, self.VERBOSE, white_list)) def transfer(self, query_data, addr, server): if not query_data: return domain = bytetodomain(query_data[12:-4]) qtype = struct.unpack('!h', query_data[-4:-2])[0] #print 'domain:%s, qtype:%x, thread:%d' % (domain, qtype, threading.activeCount()) sys.stdout.flush() response = None for i in range(9): response = self.servers.query(query_data) if response: # udp dns packet no length server.sendto(response[2:], addr) break if response is None: print "[ERROR] Tried 9 times and failed to resolve %s" % domain return
def _query(self, msg, query_data): # print msg ret = self.whiteListFirst(query_data) if ret: return ret # random select a server key = sample(self.dns_servers, 1)[0] # print key server = self.dns_servers[key] return server.query(query_data) if __name__ == "__main__": ss = Servers() s = DNSServer("8.8.8.8") ss.addDNSServer(s) ########NEW FILE######## __FILENAME__ = test #! /usr/bin/python # -*- coding: utf-8 -*- __author__ = "linkerlin" import sys import struct try: from dns import message as m except ImportError as ex: print "cannot find dnspython" from dnsserver import bytetodomain
#'208.67.220.220', #'198.153.192.1', #'198.153.194.1', #'74.207.247.4', #'209.244.0.3', #'8.26.56.26' ] DPORT = 53 # default dns port 53 TIMEOUT = 1 # set timeout 5 second VERBOSE = 0 from servers import Servers from dnsserver import DNSServer ss=Servers() for host in DHOSTS: ss.addDNSServer(DNSServer(host)) #------------------------------------------------------------- # Hexdump Cool :) # default width 16 #-------------------------------------------------------------- def hexdump( src, width=16 ): FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)]) result=[] for i in xrange(0, len(src), width): s = src[i:i+width] hexa = ' '.join(["%02X"%ord(x) for x in s]) printable = s.translate(FILTER) result.append("%04X %s %s\n" % (i, hexa, printable)) return ''.join(result)