• Stars
    star
    272
  • Rank 148,202 (Top 3 %)
  • Language
    C
  • License
    Other
  • Created about 12 years ago
  • Updated 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Network capture utility designed specifically for DNS traffic

dnscap

Total alerts Bugs Security Rating

dnscap is a network capture utility designed specifically for DNS traffic. It produces binary data in pcap(3) and other format. This utility is similar to tcpdump(1), but has a number of features tailored to DNS transactions and protocol options. DNS-OARC uses dnscap for DITL data collections.

Some of its features include:

  • Understands both IPv4 and IPv6
  • Captures UDP, TCP, and IP fragments.
  • Collect only queries, responses, or both (-s option)
  • Collect for only certain source/destination addresses (-a -z -A -Z options)
  • Periodically creates new pcap files (-t option)
  • Spawns an upload script after closing a pcap file (-k option)
  • Will start and stop collecting at specific times (-B -E options)

More information may be found here:

Issues should be reported here:

General support and discussion:

Dependencies

dnscap requires a couple of libraries beside a normal C compiling environment with autoconf, automake, libtool and pkgconfig.

dnscap has a non-optional dependency on the PCAP library and LDNS.

To install the dependencies under Debian/Ubuntu:

apt-get install -y libpcap-dev libldns-dev zlib1g-dev libyaml-perl libssl-dev

To install the dependencies under CentOS (with EPEL enabled):

yum install -y libpcap-devel ldns-devel openssl-devel zlib-devel perl-YAML

For the following OS you will need to install some of the dependencies from source or Ports, these instructions are not included.

To install some of the dependencies under FreeBSD 10+ using pkg:

pkg install -y libpcap ldns p5-YAML openssl-devel

To install some of the dependencies under OpenBSD 5+ using pkg_add:

pkg_add libldns p5-YAML

NOTE: It is recommended to install the PCAP library from source/ports on OpenBSD since the bundled version is an older and modified version.

Dependencies for cryptopant.so plugin

For this plugin a library call cryptopANT is required and the original can be found here: https://ant.isi.edu/software/cryptopANT/index.html .

For DNS-OARC packages we build our own fork, with slight modifications to conform across distributions, of this library which is included in the same package repository as dnscap. The modifications and packaging files can be found here: https://github.com/DNS-OARC/cryptopANT .

Building from source tarball

The source tarball from DNS-OARC comes prepared with configure:

tar zxvf dnscap-version.tar.gz
cd dnscap-version
./configure [options]
make
make install

Building from Git repository

If you are building dnscap from it's Git repository you will first need to initiate the Git submodules that exists and later create autoconf/automake files, this will require a build environment with autoconf, automake, libtool and pkg-config to be installed.

git clone https://github.com/DNS-OARC/dnscap.git
cd dnscap
git submodule update --init
./autogen.sh
./configure [options]
make
make install

64-bit libraries

If you need to link against 64-bit libraries found in non-standard locations, provide the location by setting LDFLAGS before running configure:

$ env LDFLAGS=-L/usr/lib64 ./configure

OpenBSD

For OpenBSD you probably installed libpcap in /usr/local so you will need to tell configure where to find the libraries and header files:

$ env CFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" ./configure

Plugins

dnscap comes bundled with a set of plugins, see -P option.

  • anonaes128.so: Anonymize IP addresses using AES128
  • anonmask.so: Pseudo-anonymize IP addresses by masking them
  • cryptopan.so: Anonymize IP addresses using an extension to Crypto-PAn (College of Computing, Georgia Tech) made by David Stott (Lucent)
  • cryptopant.so: Anonymize IP addresses using cryptopANT, a different implementation of Crypto-PAn made by the ANT project at USC/ISI
  • ipcrypt.so: Anonymize IP addresses using ipcrypt create by Jean-Philippe Aumasson
  • pcapdump.so: Dump DNS into a PCAP with some filtering options
  • royparse.so: Splits a PCAP into two streams; queries in PCAP format and responses in ASCII format
  • rssm.so: Root Server Scaling Measurement plugin, see it's README.md for more information
  • rzkeychange.so: RFC8145 key tag signal collection and reporting plugin
  • txtout.so: Dump DNS as one-line text
  • eventlog.so: Syslog style output for easy parsing, use with a SIEM, etc.

There is also a template plugin in the source repository to help others develop new plugins.

CBOR DNS Stream Format

This is an experimental format for representing DNS information in CBOR with the goals to:

  • Be able to stream the information
  • Support incomplete, broken and/or invalid DNS
  • Have close to no data quality and signature degradation
  • Support additional non-DNS meta data (such as ICMP/TCP attributes)

Read CBOR_DNS_STREAM.md for more information.

To enable this output please follow the instructions below for Enabling CBOR Output, note that this only requires Tinycbor.

Outputting to CBOR DNS Stream (CDS)

To output to the CDS format you tell dnscap to write to a file and set the format to CDS. CDS is a stream of CBOR objects and you can control how many objects are kept in memory until flushed to the file by setting cds_cbor_size, note that this is bytes of memory and not number of objects. When it reaches this limit it will write the output and start on a new file. Read dnscap's man page for all CDS extended options.

src/dnscap [...] -w <file> -F cds [ -o cds_cbor_size=<bytes> ]

CBOR

There is experimental support for CBOR output using LDNS and Tinycbor with a data structure described in the DNS-in-JSON draft.

https://datatracker.ietf.org/doc/draft-hoffman-dns-in-json/

Enabling CBOR Output

To enable the CBOR output support you will need to install it's dependencies before running configure, LDNS exists for most distributions but Tinycbor is new so you need to download and compile it, you do not necessary need to install it as shown in the example below.

git clone https://github.com/DNS-OARC/dnscap.git
cd dnscap
git submodule update --init
git clone https://github.com/01org/tinycbor.git
cd tinycbor
git checkout v0.4.2
make
cd ..
sh autogen.sh
CFLAGS="-I$PWD/tinycbor/src" LDFLAGS="-L$PWD/tinycbor/lib" LIBS="-ltinycbor" ./configure
make

NOTE: Paths in CFLAGS and LDFLAGS must be absolute.

CBOR to JSON

Tinycbor comes with a tool to convert CBOR to JSON, check bin/cbordump -h in the Tinycbor directory after having compiled it.

Outputting to CBOR

To output to the CBOR format you tell dnscap to write to a file and set the format to CBOR. Since Tinycbor constructs everything in memory there is a limit and when it is reached it will write the output and start on a new file. You can control the number of bytes with the extended option cbor_chunk_size.

src/dnscap [...] -w <file> -F cbor [ -o cbor_chunk_size=<bytes> ]

Additional attributes

There is currently an additional attribute added to the CBOR object which contains the IP information as following:

"ip": [
  <proto>,
  "<source ip address>",
  <source port>
  "<destination ip address>",
  <destination port>
]

Example:

"ip": [
  17,
  "127.0.0.1",
  34856,
  "127.0.0.1",
  53
]

Limitations, deviations and issues

Since this is still experimental there are of course some issues:

  • RDATA is in binary format
  • DNS packet are parsed by LDNS which can fail if malformed packets
  • dateSeconds is added as a C double which might loose some of the time precision

More Repositories

1

PacketQ

A tool that provides a basic SQL-frontend to PCAP-files
JavaScript
389
star
2

dnsperf

DNS Performance Testing Tools
C
383
star
3

flamethrower

a DNS performance and functional testing utility supporting UDP, TCP, DoT and DoH
C++
314
star
4

dsc

DNS Statistics Collector
C
105
star
5

drool

DNS Replay Tool
Lua
82
star
6

dnsjit

Engine for capturing, parsing and replaying DNS
C
55
star
7

dnsmeter

Tool for testing performance of nameservers
C++
54
star
8

services

Project and issue tracking for DNS-OARC services
35
star
9

sample-query-data

Sample query data files for use with dnsperf and resperf
21
star
10

dumdumd

High performance UDP/TCP/DoT/DoH DNS "server" that... just drops/reflects everything you send to it
C
17
star
11

cmdns-cli

Check My DNS command line client
Go
17
star
12

dsc-datatool

Tool for converting, exporting, merging and transforming DSC data
Python
16
star
13

bad-packets

Collection of "bad" packets in PCAPs that can be used for testing software
Python
16
star
14

omg-dns

Helper library for parsing valid/invalid/broken/malformed DNS packets
C
15
star
15

dsp

DNS Statistics Presenter
Perl
15
star
16

ripeatlas

Go bindings for RIPE Atlas API
Go
12
star
17

tldmon

Nagios Plugin Scripts for TLDmon
Perl
8
star
18

dnswire

library for DNS encapsulations
C
8
star
19

dns-benchmarking

DNS Benchmarking Tiger Team repository
Python
8
star
20

pcap-thread

PCAP helper library with POSIX threads support and transport layer callbacks
C
6
star
21

sllq

Semi Lock-Less Queue
C
5
star
22

golang-dns-server-doq

Go library for DNS-over-QUIC server (DoQ, RFC9250)
Go
5
star
23

ripe-hackathon-dns-caching

Everything you ever wanted to know about caching resolvers but were afraid to ask
JavaScript
4
star
24

parseconf

Conf parser helper library
C
4
star
25

p5-DSC

Perl library for DSP
Perl
3
star
26

dsc-datatool-grafana

Grafana Dashboards for use with DSC/dsc-datatool
Python
3
star
27

tinyframe

Minimalistic Frame Streams library
C
3
star
28

cryptopANT

IP Address Anonymization Library
C
3
star
29

p5-Net-GetDNS

Perl bindings for getdns, a modern asynchronous DNS API
XS
2
star
30

dns-metrics

DNS Metrics JSON Schema
1
star