Skip to content

Instantly share code, notes, and snippets.

@andreif
Forked from gleicon/gDNS.py
Created July 23, 2013 19:23
Show Gist options
  • Select an option

  • Save andreif/6065361 to your computer and use it in GitHub Desktop.

Select an option

Save andreif/6065361 to your computer and use it in GitHub Desktop.

Revisions

  1. @gleicon gleicon revised this gist Jul 10, 2011. 1 changed file with 5 additions and 3 deletions.
    8 changes: 5 additions & 3 deletions gDNS.py
    Original file line number Diff line number Diff line change
    @@ -33,9 +33,11 @@ def dns_handler(s, peer, data, r):
    IP = r.get("IP:%s" % qname)
    TXT = r.get("TXT:%s" % qname)
    if not IP:
    _t, addrs = gevent.dns.resolve_ipv4(str(qname))
    IP = socket.inet_ntoa(random.choice(addrs))

    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:
  2. @gleicon gleicon created this gist Jul 10, 2011.
    59 changes: 59 additions & 0 deletions gDNS.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    # 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:
    _t, addrs = gevent.dns.resolve_ipv4(str(qname))
    IP = socket.inet_ntoa(random.choice(addrs))

    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()