skip to navigation
skip to content

Not Logged In

dnslib 0.7

Simple library to encode/decode DNS wire-format packets

Latest Version: 0.9.4

dnslib
------

A simple library to encode/decode DNS wire-format packets. This was originally
written for a custom nameserver.

The key classes are:

* DNSRecord (contains a DNSHeader and one or more DNSQuestion/DNSRR records)
* DNSHeader
* DNSQuestion
* RR (resource records)
* RD (resource data - superclass for TXT,A,MX,CNAME,PRT,SOA)
* DNSLabel (envelope for a DNS label)

Note: In version 0.3 the library was modified to use the DNSLabel class to
support arbirary DNS labels (as specified in RFC2181) - and specifically
to allow embedded '.'s. In most cases this is transparent (DNSLabel will
automatically convert a domain label presented as a dot separated string &
convert pack to this format when converted to a string) however to get the
underlying label data (as a tuple) you need to access the DNSLabel.label
attribute. To specifiy a label to the DNSRecord classes you can either pass
a DNSLabel object or pass the elements as a list/tuple.

To decode a DNS packet:

>>> packet = 'd5ad818000010005000000000377777706676f6f676c6503636f6d0000010001c00c0005000100000005000803777777016cc010c02c0001000100000005000442f95b68c02c0001000100000005000442f95b63c02c0001000100000005000442f95b67c02c0001000100000005000442f95b93'.decode('hex')
>>> d = DNSRecord.parse(packet)
>>> print d
<dns header:="" id="0xd5ad" type="RESPONSE" opcode="QUERY" flags="RD,RA" rcode="None" q="1" a="5" ns="0" ar="0">
<dns question:="" 'www.google.com'="" qtype="A" qclass="IN">
<dns rr:="" 'www.google.com'="" rtype="CNAME" rclass="IN" ttl="5" rdata="www.l.google.com">
<dns rr:="" 'www.l.google.com'="" rtype="A" rclass="IN" ttl="5" rdata="66.249.91.104">
<dns rr:="" 'www.l.google.com'="" rtype="A" rclass="IN" ttl="5" rdata="66.249.91.99">
<dns rr:="" 'www.l.google.com'="" rtype="A" rclass="IN" ttl="5" rdata="66.249.91.103">
<dns rr:="" 'www.l.google.com'="" rtype="A" rclass="IN" ttl="5" rdata="66.249.91.147">

To create a DNS Request Packet:

>>> d = DNSRecord(q=DNSQuestion("google.com"))
>>> print d
<dns header:="" id="..." type="QUERY" opcode="QUERY" flags="RD" rcode="None" q="1" a="0" ns="0" ar="0">
<dns question:="" 'google.com'="" qtype="A" qclass="IN">
>>> d.pack()
'...'

>>> d = DNSRecord(q=DNSQuestion("google.com",QTYPE.MX))
>>> print d
<dns header:="" id="..." type="QUERY" opcode="QUERY" flags="RD" rcode="None" q="1" a="0" ns="0" ar="0">
<dns question:="" 'google.com'="" qtype="MX" qclass="IN">
>>> d.pack()
'...'

To create a DNS Response Packet:

>>> d = DNSRecord(DNSHeader(qr=1,aa=1,ra=1),
... q=DNSQuestion("abc.com"),
... a=RR("abc.com",rdata=A("1.2.3.4")))
>>> print d
<dns header:="" id="..." type="RESPONSE" opcode="QUERY" flags="AA,RD,RA" rcode="None" q="1" a="1" ns="0" ar="0">
<dns question:="" 'abc.com'="" qtype="A" qclass="IN">
<dns rr:="" 'abc.com'="" rtype="A" rclass="IN" ttl="0" rdata="1.2.3.4">
>>> d.pack()
'...'

To create a skeleton reply to a DNS query:

>>> q = DNSRecord(q=DNSQuestion("abc.com",QTYPE.CNAME))
>>> a = q.reply(data="xxx.abc.com")
>>> print a
<dns header:="" id="..." type="RESPONSE" opcode="QUERY" flags="AA,RD,RA" rcode="None" q="1" a="1" ns="0" ar="0">
<dns question:="" 'abc.com'="" qtype="CNAME" qclass="IN">
<dns rr:="" 'abc.com'="" rtype="CNAME" rclass="IN" ttl="0" rdata="xxx.abc.com">
>>> a.pack()
'...'

Add additional RRs:

>>> a.add_answer(RR('xxx.abc.com',QTYPE.A,rdata=A("1.2.3.4")))
>>> print a
<dns header:="" id="..." type="RESPONSE" opcode="QUERY" flags="AA,RD,RA" rcode="None" q="1" a="2" ns="0" ar="0">
<dns question:="" 'abc.com'="" qtype="CNAME" qclass="IN">
<dns rr:="" 'abc.com'="" rtype="CNAME" rclass="IN" ttl="0" rdata="xxx.abc.com">
<dns rr:="" 'xxx.abc.com'="" rtype="A" rclass="IN" ttl="0" rdata="1.2.3.4">
>>> a.pack()
'...'

Changelog:

* 0.1 2010-09-19 Initial Release
* 0.2 2010-09-22 Minor fixes
* 0.3 2010-10-02 Add DNSLabel class to support arbitrary labels (embedded '.')
* 0.4 2012-02-26 Merge with dbslib-circuits
* 0.5 2012-09-13 Add support for RFC2136 DDNS updates
Patch provided by Wesley Shields <wxs@freebsd.org> - thanks
* 0.6 2012-10-20 Basic AAAA support
* 0.7 2012-10-20 Add initial EDNS0 support (untested)

License:

* BSD

Author:

* Paul Chakravarti (paul.chakravarti@gmail.com)  
File Type Py Version Uploaded on Size
dnslib-0.7.tar.gz (md5) Source 2012-10-20 11KB
  • Downloads (All Versions):
  • 219 downloads in the last day
  • 1257 downloads in the last week
  • 4445 downloads in the last month