Skip to main content

Simple library to encode/decode DNS wire-format packets

Project description

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

License:

* BSD

Author:

* Paul Chakravarti (paul.chakravarti@gmail.com)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dnslib-0.6.tar.gz (9.7 kB view details)

Uploaded Source

File details

Details for the file dnslib-0.6.tar.gz.

File metadata

  • Download URL: dnslib-0.6.tar.gz
  • Upload date:
  • Size: 9.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for dnslib-0.6.tar.gz
Algorithm Hash digest
SHA256 8f5b8bf42c2d76dde78f55d1f5b020b2de82c7bb0ba371adf78ab8f2f64cea10
MD5 0f3e503706ee1ef2dc8ff9fb8c7dc9be
BLAKE2b-256 e6be1c8081f7d883422bd752ea8ad58df5368ad3e796808abbbfc14ec1b970ca

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page