the difficulty lies in the construction of the DNS server , however very simple, the installation of Dnslib will have DNS server:zoneresolver.py, slightly modified to use
#-*-coding:utf-8-*- from __future__ Importprint_functionImportOsos.environ.setdefault ("Django_settings_module","dj_apache.settings")ImportDjangodjango.setup ()ImportCopyImportRe fromDnslibImportRr,qtype,rcode fromDnslib.serverImportDnsserver,dnshandler,baseresolver,dnslogger fromLogview.modelsImport*classMysqllogger ():defLog_data (Self, dnsobj):Pass defLog_error (self, Handler, E):Pass defLog_pass (Self, *args):Pass defLog_prefix (self, handler):Pass deflog_recv (self, Handler, data):Pass deflog_reply (self, Handler, reply):Pass deflog_request (self, Handler, request): Domain= Request.q.qname.__str__() ifDomain.endswith ('dnslog.ml.'): Udomain= Re.search (r'\. ([^\.] +) \.dnslog\.ml\.', domain)ifUdomain:user= User.objects.filter (Udomain__exact=udomain.group (1)) ifUser:dnslog= Dnslog (user=user[0],http_host=domain,type=Qtype[request.q.qtype]) dnslog.save ()deflog_send (self, Handler, data):Pass deflog_truncated (self, Handler, reply):PassclassZoneresolver (baseresolver):"""Simple fixed zone file resolver. """ def __init__(self,zone,glob=False):"""initialise Resolver from zone file. Stores RRs as a list of (LABEL,TYPE,RR) tuples If ' glob ' is True use glob match against zone file"""Self.zone= [(RR.RNAME,QTYPE[RR.RTYPE],RR) forRrinchRr.fromzone (Zone)] Self.glob=Glob Self.eq='Matchglob' ifGlobElse '__eq__' defResolve (Self,request,handler):"""Respond to DNS request-parameters is request packet & handler. Method is expected to return DNS response"""reply=request.reply () QName=request.q.qname Qtype=Qtype[request.q.qtype] forName,rtype,rrinchSelf.zone:#Check if label & type Match ifGetAttr (QNAME,SELF.EQ) (name) and(Qtype = = RtypeorQtype==' any' orRtype=='CNAME'): #If We have a glob match fix reply label ifself.glob:a=copy.copy (RR) a.rname=QName Reply.add_answer (a)Else: Reply.add_answer (RR)#Check for A/AAAA records associated with reply and #Add in additional section ifRtypeinch['CNAME','NS','MX','PTR']: forA_name,a_rtype,a_rrinchSelf.zone:ifA_name = = Rr.rdata.label andA_rtypeinch['A','AAAA']: Reply.add_ar (A_RR)if notReply.rr:reply.header.rcode=RCODE. NXDOMAINreturnreplyif __name__=='__main__': ImportArgparse,sys,time P= Argparse. Argumentparser (description="Zone DNS Resolver") p.add_argument ("--zone","- Z", required=True, Metavar="<zone-file>", Help="Zone file ('-' for stdin)") p.add_argument ("--port","- P", type=int,default=53, Metavar="<port>", Help="Server Port (default:53)") p.add_argument ("--address"," -A", default="", Metavar="<address>", Help="Listen Address (Default:all)") p.add_argument ("--glob", action='store_true', default=False, Help="Glob match against zone file (Default:false)") p.add_argument ("--udplen","- u", type=int,default=0, Metavar="<udplen>", Help="Max UDP Packet Length (default:0)") args=P.parse_args ()ifArgs.zone = ='-': Args.zone=Sys.stdinElse: Args.zone=Open (args.zone) resolver=zoneresolver (args.zone,args.glob) Logger=Mysqllogger ()Print("starting Zone Resolver (%s:%d) [%s]"%(args.addressor "*", Args.port,"UDP")) forRrinchResolver.zone:Print(" | ", Rr[2].tozone (), sep="") Print() ifArgs.udplen:DNSHandler.udplen=Args.udplen Udp_server=DNSServer (resolver, Port=Args.port, Address=args.address, Logger=logger) Udp_server.start ()
Zone.txt
*.dnslog.ml. In NS ns1.howmp.com.*.dnslog.ml. In NS ns2.howmp.com.*.dnslog.ml. In A 106.186.118.146
Use the command python zoneresolver.py--zone zone.txt--glob to start the serverwhich inadd your own processing logic to the Log_request
The realization of Cloudeye