DNS Parser

Since 1.8.0, dnsdist contains a limited DNS parser class that can be used to inspect the content of DNS queries and responses in Lua.

The first step is to get the content of the DNS payload into a Lua string, for example using DNSQuestion:getContent(), or DNSResponse:getContent(), and then to create a DNSPacketOverlay object:

function dumpPacket(dq)
  local packet = dq:getContent()
  local overlay = newDNSPacketOverlay(packet)
  print(overlay.qname)
  print(overlay.qtype)
  print(overlay.qclass)
  local count = overlay:getRecordsCountInSection(DNSSection.Answer)
  print(count)
  for idx=0, count-1 do
    local record = overlay:getRecord(idx)
    print(record.name)
    print(record.type)
    print(record.class)
    print(record.ttl)
    print(record.place)
    print(record.contentLength)
    print(record.contentOffset)
  end
  return DNSAction.None
end

addAction(AllRule(), LuaAction(dumpPacket))
newDNSPacketOverlay(packet) → DNSPacketOverlay

New in version 1.8.0.

Returns a DNSPacketOverlay

Parameters:packet (str) – The DNS payload
class DNSPacketOverlay

New in version 1.8.0.

The DNSPacketOverlay object has several attributes, all of them read-only:

qname

The qname of this packet, as a DNSName objects.

qtype

The type of the query in this packet.

qclass

The class of the query in this packet.

dh

It also supports the following methods:

:getRecordsCountInSection(section) → int

Returns the number of records in the ANSWER (1), AUTHORITY (2) and ADDITIONAL (3) DNS Packet Sections of this packet. The number of records in the QUESTION (0) is always set to 0, look at the dnsheader if you need the actual qdcount.

Parameters:section (int) – The section, see above
:getRecord(idx) → DNSRecord

Get the record at the requested position. The records in the QUESTION sections are not taken into account, so the first record in the answer section would be at position 0.

Parameters:idx (int) – The position of the requested record

DNSRecord object

class DNSRecord

New in version 1.8.0.

This object represents an unparsed DNS record, as returned by the DNSPacketOverlay class. It has several attributes, all of them read-only:

name

The name of this record, as a DNSName objects.

type

The type of this record.

class

The class of this record.

ttl

The TTL of this record.

place

The place (section) of this record.

contentLength

The length, in bytes, of the rdata content of this record.

contentOffset

The offset since the beginning of the DNS payload, in bytes, at which the rdata content of this record starts.