diff --git a/blocklist.go b/blocklist.go index 32a59d6..216861f 100644 --- a/blocklist.go +++ b/blocklist.go @@ -7,7 +7,6 @@ import ( "time" "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // Blocklist is a resolver that returns NXDOMAIN or a spoofed IP for every query that @@ -63,7 +62,7 @@ func (r *Blocklist) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { return nil, errors.New("no question in query") } question := q.Question[0] - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": question.Name}) + log := logger(r.id, q, ci) r.mu.RLock() blocklistDB := r.BlocklistDB diff --git a/cache.go b/cache.go index 704b8fb..d167cde 100644 --- a/cache.go +++ b/cache.go @@ -65,7 +65,7 @@ func (r *Cache) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { return r.resolver.Resolve(q, ci) } - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}) + log := logger(r.id, q, ci) // Returned an answer from the cache if one exists a, ok := r.answerFromCache(q) diff --git a/dnsclient.go b/dnsclient.go index f2f5fb7..91cbc82 100644 --- a/dnsclient.go +++ b/dnsclient.go @@ -34,10 +34,7 @@ func NewDNSClient(id, endpoint, net string) *DNSClient { // Resolve a DNS query. func (d *DNSClient) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - Log.WithFields(logrus.Fields{ - "id": d.id, - "client": ci.SourceIP, - "qname": qName(q), + logger(d.id, q, ci).WithFields(logrus.Fields{ "resolver": d.endpoint, "protocol": d.net, }).Debug("querying upstream resolver") diff --git a/dohclient.go b/dohclient.go index 5745021..079bfc4 100644 --- a/dohclient.go +++ b/dohclient.go @@ -89,15 +89,11 @@ func NewDoHClient(id, endpoint string, opt DoHClientOptions) (*DoHClient, error) // Resolve a DNS query. func (d *DoHClient) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - log := Log.WithFields(logrus.Fields{ - "id": d.id, - "client": ci.SourceIP, - "qname": qName(q), + logger(d.id, q, ci).WithFields(logrus.Fields{ "resolver": d.endpoint, "protocol": "doh", "method": d.opt.Method, - }) - log.Debug("querying upstream resolver") + }).Debug("querying upstream resolver") // Add padding before sending the query over HTTPS padQuery(q) diff --git a/doqclient.go b/doqclient.go index 7c59b39..b57ab36 100644 --- a/doqclient.go +++ b/doqclient.go @@ -77,10 +77,9 @@ func NewDoQClient(id, endpoint string, opt DoQClientOptions) (*DoQClient, error) // Resolve a DNS query. func (d *DoQClient) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - d.log.WithFields(logrus.Fields{ - "id": d.id, - "client": ci.SourceIP, - "qname": qName(q), + logger(d.id, q, ci).WithFields(logrus.Fields{ + "resolver": d.endpoint, + "protocol": "doq", }).Debug("querying upstream resolver") // Sending a edns-tcp-keepalive EDNS(0) option over DoQ is an error. Filter it out. diff --git a/dotclient.go b/dotclient.go index 7a2f2be..2f98c4c 100644 --- a/dotclient.go +++ b/dotclient.go @@ -54,10 +54,7 @@ func NewDoTClient(id, endpoint string, opt DoTClientOptions) (*DoTClient, error) // Resolve a DNS query. func (d *DoTClient) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - Log.WithFields(logrus.Fields{ - "id": d.id, - "client": ci.SourceIP, - "qname": qName(q), + logger(d.id, q, ci).WithFields(logrus.Fields{ "resolver": d.endpoint, "protocol": "dot", }).Debug("querying upstream resolver") diff --git a/drop.go b/drop.go index dea31ba..2597b01 100644 --- a/drop.go +++ b/drop.go @@ -2,7 +2,6 @@ package rdns import ( "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // DropResolver is a resolver that returns nil for every query which then @@ -20,7 +19,7 @@ func NewDropResolver(id string) *DropResolver { // Resolve a DNS query by returning nil to signal to the listener to drop this request. func (r *DropResolver) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}).Debug("dropping query") + logger(r.id, q, ci).Debug("dropping query") return nil, nil } diff --git a/dtlsclient.go b/dtlsclient.go index fd84415..61c1714 100644 --- a/dtlsclient.go +++ b/dtlsclient.go @@ -72,10 +72,7 @@ func NewDTLSClient(id, endpoint string, opt DTLSClientOptions) (*DTLSClient, err // Resolve a DNS query. func (d *DTLSClient) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - Log.WithFields(logrus.Fields{ - "id": d.id, - "client": ci.SourceIP, - "qname": qName(q), + logger(d.id, q, ci).WithFields(logrus.Fields{ "resolver": d.endpoint, "protocol": "dtls", }).Debug("querying upstream resolver") diff --git a/failback.go b/failback.go index 051b6fe..b253e10 100644 --- a/failback.go +++ b/failback.go @@ -44,7 +44,7 @@ func NewFailBack(id string, opt FailBackOptions, resolvers ...Resolver) *FailBac // Resolve a DNS query using a failover resolver group that switches to the next // resolver on error. func (r *FailBack) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}) + log := logger(r.id, q, ci) var gErr error for i := 0; i < len(r.resolvers); i++ { resolver, active := r.current() diff --git a/failrotate.go b/failrotate.go index 2e637c4..216a27e 100644 --- a/failrotate.go +++ b/failrotate.go @@ -29,7 +29,7 @@ func NewFailRotate(id string, resolvers ...Resolver) *FailRotate { // Resolve a DNS query using a failover resolver group that switches to the next // resolver on error. func (r *FailRotate) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}) + log := logger(r.id, q, ci) var gErr error for i := 0; i < len(r.resolvers); i++ { resolver, active := r.current() diff --git a/go.mod b/go.mod index 4bebbdf..4e71a86 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/oschwald/maxminddb-golang v1.6.0 github.com/pion/dtls/v2 v2.0.1-0.20200602140430-8ad6de55a389 github.com/pkg/errors v0.9.1 + github.com/rs/zerolog v1.19.0 github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v0.0.5 github.com/stretchr/testify v1.5.1 diff --git a/go.sum b/go.sum index 2db4bd2..7719411 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,7 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -120,6 +121,9 @@ github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.19.0 h1:hYz4ZVdUgjXTBUmrkrw55j1nHx68LfOKIQk5IYtyScg= +github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= @@ -249,6 +253,7 @@ golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/logger.go b/logger.go index a601cab..e26563c 100644 --- a/logger.go +++ b/logger.go @@ -1,7 +1,19 @@ package rdns -import "github.com/sirupsen/logrus" +import ( + "github.com/miekg/dns" + "github.com/sirupsen/logrus" +) // Log is a package-global logger used throughout the library. Configuration can be // changed directly on this instance or the instance replaced. var Log = logrus.New() + +func logger(id string, q *dns.Msg, ci ClientInfo) *logrus.Entry { + return Log.WithFields(logrus.Fields{ + "id": id, + "client": ci.SourceIP, + "qtype": dns.Type(q.Question[0].Qtype).String(), + "qname": qName(q), + }) +} diff --git a/random.go b/random.go index 1a0030d..27b2dce 100644 --- a/random.go +++ b/random.go @@ -39,7 +39,7 @@ func NewRandom(id string, opt RandomOptions, resolvers ...Resolver) *Random { // Resolve a DNS query using a random resolver. func (r *Random) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}) + log := logger(r.id, q, ci) for { resolver := r.pick() if resolver == nil { diff --git a/replace.go b/replace.go index 042e3c6..bd1bf95 100644 --- a/replace.go +++ b/replace.go @@ -5,7 +5,6 @@ import ( "regexp" "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // Replace is a resolver that modifies queries according to regular expressions @@ -54,14 +53,14 @@ func NewReplace(id string, resolver Resolver, list ...ReplaceOperation) (*Replac // Resolve a DNS query by first replacing the query string with another // sending the query upstream and replace the name in the response with -// the orignal query string again. +// the original query string again. func (r *Replace) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { if len(q.Question) < 1 { return nil, errors.New("no question in query") } oldName := q.Question[0].Name newName := r.exp.apply(oldName) - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": oldName, "resolver": r.resolver.String()}) + log := logger(r.id, q, ci) // if nothing needs modifying, we can stop here and use the original query if newName == oldName { @@ -73,7 +72,7 @@ func (r *Replace) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { q.Question[0].Name = newName // Send the query upstream - log.WithField("new-qname", newName).Debug("forwarding modified query to resolver") + log.WithField("new-qname", newName).WithField("resolver", r.resolver).Debug("forwarding modified query to resolver") a, err := r.resolver.Resolve(q, ci) if err != nil || a == nil { return nil, err diff --git a/response-blocklist-ip.go b/response-blocklist-ip.go index 24b3993..f623892 100644 --- a/response-blocklist-ip.go +++ b/response-blocklist-ip.go @@ -104,7 +104,7 @@ func (r *ResponseBlocklistIP) blockIfMatch(query, answer *dns.Msg, ci ClientInfo continue } if rule, ok := r.BlocklistDB.Match(ip); ok { - log := Log.WithFields(logrus.Fields{"id": r.id, "qname": qName(query), "rule": rule, "ip": ip}) + log := logger(r.id, query, ci).WithFields(logrus.Fields{"rule": rule, "ip": ip}) if r.BlocklistResolver != nil { log.WithField("resolver", r.BlocklistResolver).Debug("blocklist match, forwarding to blocklist-resolver") return r.BlocklistResolver.Resolve(query, ci) @@ -118,7 +118,7 @@ func (r *ResponseBlocklistIP) blockIfMatch(query, answer *dns.Msg, ci ClientInfo } func (r *ResponseBlocklistIP) filterMatch(query, answer *dns.Msg, ci ClientInfo) (*dns.Msg, error) { - answer.Answer = r.filterRR(query, answer.Answer) + answer.Answer = r.filterRR(query, ci, answer.Answer) // If there's nothing left after applying the filter, return NXDOMAIN or send to the alternative resolver if len(answer.Answer) == 0 { log := Log.WithFields(logrus.Fields{"qname": qName(query)}) @@ -129,12 +129,12 @@ func (r *ResponseBlocklistIP) filterMatch(query, answer *dns.Msg, ci ClientInfo) log.Debug("no answers after filtering, blocking response") return nxdomain(query), nil } - answer.Ns = r.filterRR(query, answer.Ns) - answer.Extra = r.filterRR(query, answer.Extra) + answer.Ns = r.filterRR(query, ci, answer.Ns) + answer.Extra = r.filterRR(query, ci, answer.Extra) return answer, nil } -func (r *ResponseBlocklistIP) filterRR(query *dns.Msg, rrs []dns.RR) []dns.RR { +func (r *ResponseBlocklistIP) filterRR(query *dns.Msg, ci ClientInfo, rrs []dns.RR) []dns.RR { newRRs := make([]dns.RR, 0, len(rrs)) for _, rr := range rrs { var ip net.IP @@ -148,7 +148,7 @@ func (r *ResponseBlocklistIP) filterRR(query *dns.Msg, rrs []dns.RR) []dns.RR { continue } if rule, ok := r.BlocklistDB.Match(ip); ok { - Log.WithFields(logrus.Fields{"id": r.id, "qname": qName(query), "rule": rule, "ip": ip}).Debug("filtering response") + logger(r.id, query, ci).WithFields(logrus.Fields{"rule": rule, "ip": ip}).Debug("filtering response") continue } newRRs = append(newRRs, rr) diff --git a/response-blocklist-name.go b/response-blocklist-name.go index ed9dbd6..07205e9 100644 --- a/response-blocklist-name.go +++ b/response-blocklist-name.go @@ -5,7 +5,6 @@ import ( "time" "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // ResponseBlocklistName is a resolver that filters by matching the strings in CNAME, MX, @@ -89,7 +88,7 @@ func (r *ResponseBlocklistName) blockIfMatch(query, answer *dns.Msg, ci ClientIn continue } if _, rule, ok := r.BlocklistDB.Match(dns.Question{Name: name}); ok { - log := Log.WithFields(logrus.Fields{"id": r.id, "rule": rule}) + log := logger(r.id, query, ci).WithField("rule", rule) if r.BlocklistResolver != nil { log.WithField("resolver", r.BlocklistResolver).Debug("blocklist match, forwarding to blocklist-resolver") return r.BlocklistResolver.Resolve(query, ci) diff --git a/response-collapse.go b/response-collapse.go index e83f6e9..a7e5a12 100644 --- a/response-collapse.go +++ b/response-collapse.go @@ -2,7 +2,6 @@ package rdns import ( "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // ResponseCollapse is a resolver that collapses response records to just the type @@ -37,7 +36,7 @@ func (r *ResponseCollapse) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) } } answer.Answer = aRR - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": name}) + log := logger(r.id, q, ci) // If there's nothing left after collapsing, return NXDOMAIN if len(answer.Answer) == 0 { diff --git a/response-minimize.go b/response-minimize.go index 75dea22..6814fad 100644 --- a/response-minimize.go +++ b/response-minimize.go @@ -2,7 +2,6 @@ package rdns import ( "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // ResponseMinimize is a resolver that strips Extra and Authority records @@ -25,7 +24,7 @@ func (r *ResponseMinimize) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) if err != nil || answer == nil { return answer, err } - Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}).Debug("stripping response") + logger(r.id, q, ci).Debug("stripping response") answer.Extra = nil answer.Ns = nil return answer, nil diff --git a/roundrobin.go b/roundrobin.go index 8d49637..18871d3 100644 --- a/roundrobin.go +++ b/roundrobin.go @@ -4,10 +4,9 @@ import ( "sync" "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) -// RoundRobin is a group of recolvers that will receive equal amounts of queries. +// RoundRobin is a group of resolvers that will receive equal amounts of queries. // Failed queries are not retried. type RoundRobin struct { id string @@ -29,12 +28,7 @@ func (r *RoundRobin) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { resolver := r.resolvers[r.current] r.current = (r.current + 1) % len(r.resolvers) r.mu.Unlock() - Log.WithFields(logrus.Fields{ - "id": r.id, - "client": ci.SourceIP, - "qname": qName(q), - "resolver": resolver.String(), - }).Debug("forwarding query to resolver") + logger(r.id, q, ci).WithField("resolver", resolver).Debug("forwarding query to resolver") return resolver.Resolve(q, ci) } diff --git a/router.go b/router.go index efefae3..20af474 100644 --- a/router.go +++ b/router.go @@ -7,7 +7,6 @@ import ( "regexp" "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // Router for DNS requests based on query type and/or name. Implements the Resolver interface. @@ -30,7 +29,7 @@ func (r *Router) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { return nil, errors.New("no question in query") } question := q.Question[0] - log := Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": question.Name}) + log := logger(r.id, q, ci) for _, route := range r.routes { if route.typ != 0 && route.typ != question.Qtype { continue diff --git a/static.go b/static.go index 7867a56..368254b 100644 --- a/static.go +++ b/static.go @@ -2,7 +2,6 @@ package rdns import ( "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // StaticResolver is a resolver that always returns the same answer, to any question. @@ -72,7 +71,7 @@ func (r *StaticResolver) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { answer.Extra = r.extra answer.Rcode = r.rcode - Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}).Debug("responding") + logger(r.id, q, ci).Debug("responding") return answer, nil } diff --git a/ttl-modifier.go b/ttl-modifier.go index 8b61248..eaa609f 100644 --- a/ttl-modifier.go +++ b/ttl-modifier.go @@ -2,7 +2,6 @@ package rdns import ( "github.com/miekg/dns" - "github.com/sirupsen/logrus" ) // TTLModifier passes queries to upstream resolvers and then modifies @@ -59,7 +58,7 @@ func (r *TTLModifier) Resolve(q *dns.Msg, ci ClientInfo) (*dns.Msg, error) { } } if modified { - Log.WithFields(logrus.Fields{"id": r.id, "client": ci.SourceIP, "qname": qName(q)}).Debug("modified response ttl") + logger(r.id, q, ci).Debug("modified response ttl") } return a, nil }