Log nameserver in OS resolver response

This commit is contained in:
Cuong Manh Le
2024-10-16 14:13:21 +07:00
committed by Cuong Manh Le
parent 9501e35c60
commit 30ea0c6499
+22 -9
View File
@@ -7,6 +7,7 @@ import (
"net" "net"
"net/netip" "net/netip"
"slices" "slices"
"strings"
"sync" "sync"
"time" "time"
@@ -124,9 +125,9 @@ type osResolver struct {
} }
type osResolverResult struct { type osResolverResult struct {
answer *dns.Msg answer *dns.Msg
err error err error
isControlDPublicDNS bool server string
} }
// Resolve resolves DNS queries using pre-configured nameservers. // Resolve resolves DNS queries using pre-configured nameservers.
@@ -152,33 +153,45 @@ func (o *osResolver) Resolve(ctx context.Context, msg *dns.Msg) (*dns.Msg, error
go func(server string) { go func(server string) {
defer wg.Done() defer wg.Done()
answer, _, err := dnsClient.ExchangeContext(ctx, msg.Copy(), server) answer, _, err := dnsClient.ExchangeContext(ctx, msg.Copy(), server)
ch <- &osResolverResult{answer: answer, err: err, isControlDPublicDNS: server == controldPublicDnsWithPort} ch <- &osResolverResult{answer: answer, err: err, server: server}
}(server) }(server)
} }
logAnswer := func(server string) {
if before, _, found := strings.Cut(server, ":"); found {
server = before
}
Log(ctx, ProxyLogger.Load().Debug(), "got answer from nameserver: %s", server)
}
var ( var (
nonSuccessAnswer *dns.Msg nonSuccessAnswer *dns.Msg
nonSuccessServer string
controldSuccessAnswer *dns.Msg controldSuccessAnswer *dns.Msg
) )
errs := make([]error, 0, numServers) errs := make([]error, 0, numServers)
for res := range ch { for res := range ch {
switch { switch {
case res.answer != nil && res.answer.Rcode == dns.RcodeSuccess: case res.answer != nil && res.answer.Rcode == dns.RcodeSuccess:
if res.isControlDPublicDNS { if res.server == controldPublicDnsWithPort {
controldSuccessAnswer = res.answer // only use ControlD answer as last one. controldSuccessAnswer = res.answer // only use ControlD answer as last one.
} else { } else {
cancel() cancel()
logAnswer(res.server)
return res.answer, nil return res.answer, nil
} }
case res.answer != nil: case res.answer != nil:
nonSuccessAnswer = res.answer nonSuccessAnswer = res.answer
nonSuccessServer = res.server
} }
errs = append(errs, res.err) errs = append(errs, res.err)
} }
for _, answer := range []*dns.Msg{controldSuccessAnswer, nonSuccessAnswer} { if controldSuccessAnswer != nil {
if answer != nil { logAnswer(controldPublicDnsWithPort)
return answer, nil return controldSuccessAnswer, nil
} }
if nonSuccessAnswer != nil {
logAnswer(nonSuccessServer)
return nonSuccessAnswer, nil
} }
return nil, errors.Join(errs...) return nil, errors.Join(errs...)
} }