mirror of
https://github.com/coredns/coredns.git
synced 2026-07-13 11:10:10 -04:00
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user