1.1.0 • Published 8 years ago

eva-dns-packet v1.1.0

Weekly downloads
1
License
MIT
Repository
github
Last release
8 years ago

Install

npm install eva-dns-packet

TODO

  • Add a load more comments
  • Add more request types
  • Make the writing of RData more logical

Example

Requesting 'A' type for 'scagood.co.uk' using google DNS (udp 8.8.8.8:53)

var dgram = require( "dgram" ),
    dnsPacket = require('eva-dns-packet');

var host = "192.168.0.12", port = 34324,
    client = dgram.createSocket( "udp4" ),
    
    input = {
        questions: [{
            QNAME: "scagood.co.uk",
            QTYPE: dnsPacket.types.A
        }]
    };
    
client.on( "message", function( msg, rinfo ) {
    console.log(dnsPacket.read(msg));
});

// client listens on a port as well in order to receive ping
client.bind( port, host );

var message = dnsPacket.write(input);
client.send(message, 0, message.length, 53, "8.8.8.8" );

Basic Usage

Currently supported

Currently only the following request types are supported:

A, NS, CNAME, SOA, PTR, MX, TXT, AAAA, SRV

I will add more based of requests and what I need when it comes to it :D

Reading packets

var dnsPacket = require('eva-dns-packet');

var input = , // Buffer containing your DNS packet you want to read
    output;
    
output = dnsPacket.read(input);

Lets say you were passing a responce from a server regarding 'scagood.co.uk' and you were looking for the 'A' record

Output would be:

{
	"header": {
		"MSGID": 1,
		"TYPE": {
			"QR": 1,
			"OPCODE": 0,
			"AA": 0,
			"TC": 0,
			"RD": 0,
			"RA": 0,
			"R1": 0,
			"R2": 0,
			"R3": 0,
			"RCODE": 0
		},
		"QDCOUNT": 1,
		"ANCOUNT": 1,
		"NSCOUNT": 0,
		"ARCOUNT": 0
	},
	"questions": [{
		"length": 19,
		"offset": 12,
		"QNAME": "scagood.co.uk",
		"QTYPE": 1,
		"QCLASS": 1
	}],
	"answers": [{
		"length": 16,
		"offset": 31,
		"NAME": "scagood.co.uk",
		"TYPE": 1,
		"CLASS": 1,
		"TTL": 600,
		"RDLENGTH": 4,
		"RDATA": {
			"data": [{
				"data": 94,
				"type": "UInt8"
			},
			{
				"data": 136,
				"type": "UInt8"
			},
			{
				"data": 40,
				"type": "UInt8"
			},
			{
				"data": 103,
				"type": "UInt8"
			}],
			"parsed": "94.136.40.103"
		}
	}],
	"authority": [],
	"additional": []
}

Writing packets

var dnsPacket = require('eva-dns-packet');

var input = {
        header: {
            TYPE: {
                QR: 1
            }
        },
        questions:[{
            QNAME: "scagood.co.uk"
        }],
        answers: [{
            NAME: "scagood.co.uk",
            RDATA: {data:[{
                type: "UInt8",
                data: 94
            },{
                type: "UInt8",
                data: 136
            },{
                type: "UInt8",
                data: 40
            },{
                type: "UInt8",
                data: 103
            }]}
        }]
    },
    output;
    
    output = dnsPacket.write(write);

Output = :

<Buffer 00 01 80 00 00 01 00 01 00 00 00 00 07 73 63 61 67 6f 6f 64 02 63 6f 02 75 6b 00 00 01 00 01 c0 0c 00 01 00 01 00 00 02 58 00 04 5e 88 28 67 >

Data Structure

You can have multiple questions and multiple answers in 1 request but you can only have 1 header

// Bits and octets
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|        1 Octet        |        1 Octet        |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|

// Header
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   Message Id                  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   OPCODE  |AA|TC|RD|RA|R1|R2|R3|   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QD COUNT                   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    AN COUNT                   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    NS COUNT                   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    AR COUNT                   |
+-----------------------------------------------+

// Question
+-----------------------------------------------+
|             QNAME - length unknown            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    Q TYPE                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     QCLASS                    |
+-----------------------------------------------+

// Answer
+-----------------------------------------------+
|             ANAME - length unknown            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    A TYPE                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                     ACLASS                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      TTL1                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      TTL2                     |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    RDLENGTH                   |
+-----------------------------------------------+
|             RDATA - length unknown            |
+-----------------------------------------------+
1.1.0

8 years ago

1.0.3

8 years ago

1.0.2

8 years ago

1.0.1

8 years ago

1.0.0

8 years ago