fix(forward): make dnstap FORWARDER_* describe the socket from CoreDNS to upstream (#8184)

Signed-off-by: Jaime Hablutzel <hablutzel1@gmail.com>
This commit is contained in:
Jaime Hablutzel
2026-07-01 23:04:04 -05:00
committed by GitHub
parent 6e7093cafb
commit 8d94712f99
5 changed files with 138 additions and 44 deletions

View File

@@ -7,7 +7,6 @@ import (
"time"
"github.com/coredns/coredns/plugin/dnstap/msg"
"github.com/coredns/coredns/plugin/pkg/proxy"
"github.com/coredns/coredns/request"
tap "github.com/dnstap/golang-dnstap"
@@ -15,7 +14,7 @@ import (
)
// toDnstap will send the forward and received message to the dnstap plugin.
func toDnstap(ctx context.Context, f *Forward, host string, state request.Request, opts proxy.Options, reply *dns.Msg, start time.Time) {
func toDnstap(ctx context.Context, f *Forward, host string, localAddr net.Addr, proto string, state request.Request, reply *dns.Msg, start time.Time) {
ap, _ := netip.ParseAddrPort(host) // this is preparsed and can't err here
ip := net.IP(ap.Addr().AsSlice())
port := int(ap.Port())
@@ -24,15 +23,7 @@ func toDnstap(ctx context.Context, f *Forward, host string, state request.Reques
IP: ip,
Port: port,
}
t := state.Proto()
switch {
case opts.ForceTCP:
t = "tcp"
case opts.PreferUDP:
t = "udp"
}
if t == "tcp" {
if proto == "tcp" {
ta = &net.TCPAddr{IP: ip, Port: port}
}
@@ -40,9 +31,12 @@ func toDnstap(ctx context.Context, f *Forward, host string, state request.Reques
// Query
q := new(tap.Message)
msg.SetQueryTime(q, start)
// Forwarder dnstap messages are from the perspective of the downstream server
// (upstream is the forward server)
msg.SetQueryAddress(q, state.W.RemoteAddr())
// Forwarder dnstap messages are from the perspective of the
// downstream DNS server (current CoreDNS) to an upstream DNS
// server.
if localAddr != nil {
msg.SetQueryAddress(q, localAddr)
}
msg.SetResponseAddress(q, ta)
if t.IncludeRawMessage {
buf, _ := state.Req.Pack()
@@ -59,7 +53,9 @@ func toDnstap(ctx context.Context, f *Forward, host string, state request.Reques
r.ResponseMessage = buf
}
msg.SetQueryTime(r, start)
msg.SetQueryAddress(r, state.W.RemoteAddr())
if localAddr != nil {
msg.SetQueryAddress(r, localAddr)
}
msg.SetResponseAddress(r, ta)
msg.SetResponseTime(r, time.Now())
msg.SetType(r, tap.Message_FORWARDER_RESPONSE)

View File

@@ -8,6 +8,7 @@ import (
"context"
"crypto/tls"
"errors"
"net"
"net/http"
"sync/atomic"
"time"
@@ -168,13 +169,15 @@ func (f *Forward) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg
})
var (
ret *dns.Msg
err error
ret *dns.Msg
localAddr net.Addr
upstreamProto string
err error
)
opts := f.opts
for {
ret, err = proxy.Connect(ctx, state, opts)
ret, localAddr, upstreamProto, err = proxy.Connect(ctx, state, opts)
if err == proxyPkg.ErrCachedClosed { // Remote side closed conn, can only happen with TCP.
continue
@@ -192,7 +195,7 @@ func (f *Forward) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg
}
if len(f.tapPlugins) != 0 {
toDnstap(ctx, f, proxy.Addr(), state, opts, ret, start)
toDnstap(ctx, f, proxy.Addr(), localAddr, upstreamProto, state, ret, start)
}
upstreamErr = err