dns-packet

An abstract-encoding compliant module for encoding / decoding DNS packets. Lifted out of multicast-dns as a separate module.

npm install dns-packet

build status

Usage

``` js var packet = require('dns-packet') var dgram = require('dgram')

var socket = dgram.createSocket('udp4')

var buf = packet.encode({ type: 'query', id: 1, flags: packet.RECURSION_DESIRED, questions: [{ type: 'A', name: 'google.com' }] })

socket.on('message', function (message) { console.log(packet.decode(message)) // prints out a response from google dns })

socket.send(buf, 0, buf.length, 53, '8.8.8.8') ```

API

var buf = packets.encode(packet, [buf], [offset])

Encodes a DNS packet into a buffer.

var packet = packets.decode(buf, [offset])

Decode a DNS packet from a buffer

var len = packets.encodingLength(packet)

Returns how many bytes are needed to encode the DNS packet

Packets

Packets look like this

js { type: 'query|response', id: optionalIdNumber, flags: optionalBitFlags, questions: [...], answers: [...], additionals: [...], authorities: [...] }

The bit flags available are

js packet.RECURSION_DESIRED packet.RECURSION_AVAILABLE packet.TRUNCATED_RESPONSE packet.AUTHORITATIVE_ANSWER packet.AUTHENTIC_DATA packet.CHECKING_DISABLED

To use more than one flag bitwise-or them together

js var flags = packet.RECURSION_DESIRED | packet.RECURSION_AVAILABLE

And to check for a flag use bitwise-and

js var isRecursive = message.flags & packet.RECURSION_DESIRED

A question looks like this

js { type: 'A', // or SRV, AAAA, etc name: 'google.com' // which record are you looking for }

And an answers, additional, or authority looks like this

js { type: 'A', // or SRV, AAAA, etc name: 'google.com', // which name is this record for ttl: optionalTimeToLiveInSeconds, (record specific data, see below) }

Currently the different available records are

A

js { data: 'IPv4 address' // fx 127.0.0.1 }

AAAA

js { data: 'IPv6 address' // fx fe80::1 }

TXT

js { data: Buffer('some text') }

NS

js { data: nameServer }

NULL

js { data: Buffer('any binary data') }

SOA

js { data: { mname: domainName, rname: mailbox, serial: zoneSerial, refresh: refreshInterval, retry: retryInterval, expire: expireInterval, minimum: minimumTTL } }

SRV

js { data: { port: servicePort, target: serviceHostName, priority: optionalServicePriority, weight: optionalServiceWeight } }

HINFO

js { data: { cpu: 'cpu info', os: 'os info' } }

PTR

js { data: 'points.to.another.record' }

CNAME

js { data: 'cname.to.another.record' }

DNAME

js { data: 'dname.to.another.record' }

CAA

js { flags: 128, // octet tag: 'issue|issuewild|iodef', value: 'ca.example.net' }

If you need another one, open an issue and we'll try to add it.

License

MIT