[dns-operations] Analyze responses with drool and respdiff

Jerry Lundström jerry at dns-oarc.net
Fri Jul 20 11:59:18 UTC 2018

Hi all,

With the release of drool version 1.99.2 (and dnsjit v0.9.5) and a tool-
chain called respdiff it is now possible to replay a PCAP and do analysis
of the responses found in the PCAP with those received from the replay.
TL;DR? Check below for example!

[ also in HTML: https://medium.com/@dnsoarc/analyze-responses-with-drool-an
d-respdiff-168a2b9ffb49 ]



dnsjit (developed by DNS-OARC) is a combination of parts taken from dsc,
dnscap, drool (when it was in C), and put together around Lua to create a
script-based engine for easy capturing, parsing and statistics gathering of
DNS messages while also providing facilities for replaying DNS traffic.



drool (DNS Replay Tool, developed by DNS-OARC) can replay DNS traffic from
packet capture (PCAP) files and send it to a specified server, with options
such as to manipulate the timing between packets, as well as loop packets
infinitely or for a set number of iterations.

drool is now a Lua script that uses dnsjit and this work has been sponsored
by Comcast Innovation Fund.



Respdiff (developed by CZ.NIC, part of the Knot project) is an abbreviation
from “response differences” used as name for set of tools to gather answers
to DNS queries from DNS servers and compare them based on specified

drool + respdiff

We (DNS-OARC and CZ.NIC) started a collaborative effort a few months back
to use each others tool. The aim is to have drool replay traffic and gather
the responses for respdiff to analyze.

Example (yay!)

drool comes packaged for most Linux distributions and is also compiled and
tested on FreeBSD and OpenBSD but respdiff was just moved out from being an
internal testing tool at CZ.NIC so it may be more tricky to get to run
currently. Here is two install examples, first for Debian 9 and later on
for CentOS 7.

Debian 9 installation

  sudo apt-get install -y build-essential wget python3-pip lmdb-utils
  sudo pip3 install --upgrade pip
  sudo git clone --depth=1 https://gitlab.labs.nic.cz/knot/respdiff.git /var/opt/respdiff
  sudo pip3 install -r /var/opt/respdiff/requirements.txt
  wget -O - https://pkg.dns-oarc.net/dns-oarc.distribution.key.gpg | sudo apt-key add -
  echo "deb http://pkg.dns-oarc.net/deb-pr stretch main" | sudo tee /etc/apt/sources.list.d/dns-oarc-pr.list
  sudo apt-get update
  sudo apt-get install -y drool

CentOS 7 installation

  sudo yum group install -y "Development Tools"
  sudo yum install -y yum-plugin-copr epel-release wget centos-release-scl
  sudo yum copr -y enable @dnsoarc/drool-pr
  sudo yum install -y drool rh-python36
  sudo scl enable rh-python36 'pip3 install --upgrade pip'
  sudo git clone --depth=1 https://gitlab.labs.nic.cz/knot/respdiff.git /var/opt/respdiff
  sudo scl enable rh-python36 'pip3 install -r /var/opt/respdiff/requirements.txt'

Replay and analyze

Because respdiff needs newer Python then what is available on CentOS 7 you
will need to enable it into a new shell first (if your testing on CentOS 7
of course).

  scl enable rh-python36 bash

Now get a DNS PCAP, replay it and run an analysis on the results.

  wget https://github.com/DNS-OARC/drool/raw/develop/src/test/dns.pcap
  drool respdiff /tmp/respdiff-results pcap dns.pcap google 53
  wget https://gist.github.com/jelu/219f5e4976121397158c4153393e54d8/raw/8d1f4691bc371e5cfc3dfef05b342a60619f86f0/respdiff.cfg
  /var/opt/respdiff/msgdiff.py -c ./respdiff.cfg /tmp/respdiff-results
  /var/opt/respdiff/diffsum.py -c ./respdiff.cfg /tmp/respdiff-results

Example output

  $ drool respdiff /tmp/respdiff-results pcap dns.pcap google 53
  << dnsjit v0.9.5 https://github.com/DNS-OARC/dnsjit/issues >>
  runtime 1.551086741     run     1.526865703     finish  0.024221038
          total   /sec
  packets 133     87.106547575651
  queries 41      26.852394365426
  sent    41      26.852394365426
  received        41      26.852394365426
  responses       41      26.852394365426
  timeouts        0
  errors  0

  $ /var/opt/respdiff/msgdiff.py -c ./respdiff.cfg /tmp/respdiff-results

  $ /var/opt/respdiff/diffsum.py -c ./respdiff.cfg /tmp/respdiff-results
  == Global statistics
  duration                       2           seconds
  queries                       41
  answers                       41  100.00 % of queries

  == Differences statistics
  upstream unstable              0    0.00 % of answers (ignoring)
  not 100% reproducible          0    0.00 % of answers (ignoring)
  target disagrees               0    0.00 % of not ignored answers

Replay your own PCAP or analyze other things

To replay and analyze a different PCAP you need to know a few things:
- The second argument to drool respdiff is the server name for the
responses found in the PCAP and needs to exist in respdiff.cfg
- The fourth argument to drool respdiff is the server name for the
responses received when replaying and needs to exist in respdiff.cfg
- drool respdiff can currently only replay against one host
- The criteria in the diff section of respdiff.cfg controls what fields are
analyzed, see respdiff.cfg in it’s main repository for comments on each
- Re-run both msgdiff.py and diffsum.py to redo or do a new analysis on an
existing result

Still early development…

Please note that this is still in early development and things are missing
or possibly broke, but we would none the less be very happy if you can find
the time to test this a bit and report any issues you discover or any other
feedback you would like to give!

    drool: https://github.com/DNS-OARC/drool/issues
    respdiff: https://gitlab.labs.nic.cz/knot/respdiff/issues

Jerry Lundström (DNS-OARC) & Petr Špaček (CZ.NIC)

More information about the dns-operations mailing list