1.1.0 • Published 8 years ago
eva-dns-packet v1.1.0
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 |
+-----------------------------------------------+