Skip to content

Instantly share code, notes, and snippets.

@a740122
Forked from gleicon/gDNS.py
Last active August 29, 2015 14:14
Show Gist options
  • Save a740122/a2d752f3e9343a88abe3 to your computer and use it in GitHub Desktop.
Save a740122/a2d752f3e9343a88abe3 to your computer and use it in GitHub Desktop.
# dns server using dnslib and gevent
# based on https://bitbucket.org/paulc/dnslib/src/80d85555aae4/src/server/gevent_server.py
# set the key as
# set IP:name ip_addr
# set TXT:name txtfield
# fallback on gevent's dns resolver
# gleicon 2011
import gevent
from gevent import socket
import gevent.dns;
from gevent import monkey;
monkey.patch_socket()
import urllib2,sys
import redis
import random
from dnslib import *
AF_INET = 2
SOCK_DGRAM = 2
s = socket.socket(AF_INET,SOCK_DGRAM)
s.bind(('',53))
def dns_handler(s, peer, data, r):
request = DNSRecord.parse(data)
id = request.header.id
qname = request.q.qname
qtype = request.q.qtype
IP = r.get("IP:%s" % qname)
TXT = r.get("TXT:%s" % qname)
if not IP:
try:
IP = socket.gethostbyname(str(qname))
except Exception, e:
print 'Host not found'
IP = '0.0.0.0'
print "Request (%s): %r (%s) - Response: %s" % (str(peer), qname.label, QTYPE[qtype], IP)
reply = DNSRecord(DNSHeader(id=id,qr=1,aa=1,ra=1),q=request.q)
if qtype == QTYPE.A:
reply.add_answer(RR(qname,qtype,rdata=A(IP)))
elif qtype == QTYPE['*']:
reply.add_answer(RR(qname,QTYPE.A,rdata=A(IP)))
reply.add_answer(RR(qname,QTYPE.MX,rdata=MX(IP)))
reply.add_answer(RR(qname,QTYPE.TXT,rdata=TXT(TXT)))
else:
reply.add_answer(RR(qname,QTYPE.CNAME,rdata=CNAME(TXT)))
s.sendto(reply.pack(),peer)
def main():
r = redis.Redis()
while True:
data,peer = s.recvfrom(8192)
gevent.spawn(dns_handler, s, peer, data, r)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment