COREDNS-DNSTAP(7) CoreDNS Plugins COREDNS-DNSTAP(7) NAME dnstap - enables logging to dnstap. DESCRIPTION dnstap is a flexible, structured binary log format for DNS software; see https://dnstap.info <https://dnstap.info>. With this plugin you make CoreDNS output dnstap logging. Every message is sent to the socket as soon as it comes in, the dnstap plu- gin has a buffer of 10000 messages, above that number dnstap messages will be dropped (this is logged). SYNTAX dnstap SOCKET [full] [writebuffer] [queue] { [identity IDENTITY] [version VERSION] [extra EXTRA] [skipverify] } * SOCKET is the socket (path) supplied to the dnstap command line tool. * full to include the wire-format DNS message. * writebuffer sets the TCP write buffer multiplier in MiB. Valid range: [1, 1024]. * queue sets the queue multiplier, applied to 10,000 messages. Valid range: [1, 4096]. * IDENTITY to override the identity of the server. Defaults to the host- name. * VERSION to override the version field. Defaults to the CoreDNS version. * EXTRA to define "extra" field in dnstap payload, metadata <../meta- data/> replacement available here. * skipverify to skip tls verification during connection. Default to be secure EXAMPLES Log information about client requests and responses to /tmp/dnstap.sock. dnstap /tmp/dnstap.sock Log information about client requests and responses with a custom TCP write buffer (1024 MiB) and queue capacity (2048 x 10000). dnstap /tmp/dnstap.sock full 1024 2048 Log information including the wire-format DNS message about client requests and responses to /tmp/dnstap.sock. dnstap unix:///tmp/dnstap.sock full Log to a remote endpoint. dnstap tcp://127.0.0.1:6000 full Log to a remote endpoint by FQDN. dnstap tcp://example.com:6000 full Log to a socket, overriding the default identity and version. dnstap /tmp/dnstap.sock { identity my-dns-server1 version MyDNSServer-1.2.3 } Log to a socket, customize the "extra" field in dnstap payload. You may use metadata provided by other plugins in the extra field. forward . 8.8.8.8 metadata dnstap /tmp/dnstap.sock { extra "upstream: {/forward/upstream}" } Log to a remote TLS endpoint. dnstap tls://127.0.0.1:6000 full { skipverify } You can use dnstap more than once to define multiple taps. The following logs information including the wire-format DNS message about client re- quests and responses to /tmp/dnstap.sock, and also sends client requests and responses without wire-format DNS messages to a remote FQDN. dnstap /tmp/dnstap.sock full dnstap tcp://example.com:6000 COMMAND LINE TOOL Dnstap has a command line tool that can be used to inspect the logging. The tool can be found at GitHub: https://github.com/dnstap/golang-dnstap <https://github.com/dnstap/golang-dnstap>. It's written in Go. The following command listens on the given socket and decodes messages to stdout. $ dnstap -u /tmp/dnstap.sock The following command listens on the given socket and saves message pay- loads to a binary dnstap-format log file. $ dnstap -u /tmp/dnstap.sock -w /tmp/test.dnstap Listen for dnstap messages on port 6000. $ dnstap -l 127.0.0.1:6000 USING DNSTAP IN YOUR PLUGIN In your setup function, collect and store a list of all dnstap plugins loaded in the config: x := ExamplePlugin{} c.OnStartup(func() error { if taph := dnsserver.GetConfig(c).Handler("dnstap"); taph != nil { for tapPlugin, ok := taph.(*dnstap.Dnstap); ok; tapPlugin, ok = tapPlugin.Next.(*dnstap.Dnstap) { x.tapPlugins = append(x.tapPlugins, tapPlugin) } } return nil }) And then in your plugin: import ( "github.com/coredns/coredns/plugin/dnstap/msg" "github.com/coredns/coredns/request" tap "github.com/dnstap/golang-dnstap" ) func (x ExamplePlugin) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { for _, tapPlugin := range x.tapPlugins { q := new(msg.Msg) msg.SetQueryTime(q, time.Now()) msg.SetQueryAddress(q, w.RemoteAddr()) if tapPlugin.IncludeRawMessage { buf, _ := r.Pack() // r has been seen packed/unpacked before, this should not fail q.QueryMessage = buf } msg.SetType(q, tap.Message_CLIENT_QUERY) // if no metadata interpretation is needed, just send the message tapPlugin.TapMessage(q) // OR: to interpret the metadata in "extra" field, give more context info tapPlugin.TapMessageWithMetadata(ctx, q, request.Request{W: w, Req: query}) } // ... } SEE ALSO The website dnstap.info <https://dnstap.info> has info on the dnstap proto- col. The forward plugin's dnstap.go uses dnstap to tap messages sent to an upstream. CoreDNS March 2026 COREDNS-DNSTAP(7)
NAME | DESCRIPTION | SYNTAX | EXAMPLES | COMMAND LINE TOOL | USING DNSTAP IN YOUR PLUGIN | SEE ALSO
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=coredns-dnstap&sektion=7&manpath=FreeBSD+Ports+15.1.quarterly>
