From ec036b356104da80d78f431f07052668d5ddaf31 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 17 Nov 2021 09:29:18 -0800 Subject: [PATCH] logpolicy: use bootstrap DNS for logtail dialer Fixes #3332 Change-Id: Ie45efb448e5508c3ece48dd1d8d7e9a39e2e9dc1 Signed-off-by: Brad Fitzpatrick --- cmd/tailscaled/depaware.txt | 2 +- logpolicy/logpolicy.go | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index b00a7466f..4708d497f 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -182,7 +182,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/net/dns from tailscale.com/cmd/tailscaled+ tailscale.com/net/dns/resolver from tailscale.com/net/dns+ tailscale.com/net/dnscache from tailscale.com/control/controlclient+ - tailscale.com/net/dnsfallback from tailscale.com/control/controlclient + tailscale.com/net/dnsfallback from tailscale.com/control/controlclient+ tailscale.com/net/flowtrack from tailscale.com/net/packet+ 💣 tailscale.com/net/interfaces from tailscale.com/cmd/tailscaled+ tailscale.com/net/netcheck from tailscale.com/wgengine/magicsock diff --git a/logpolicy/logpolicy.go b/logpolicy/logpolicy.go index ee3bf70dc..8633c26f9 100644 --- a/logpolicy/logpolicy.go +++ b/logpolicy/logpolicy.go @@ -31,6 +31,8 @@ import ( "tailscale.com/atomicfile" "tailscale.com/logtail" "tailscale.com/logtail/filch" + "tailscale.com/net/dnscache" + "tailscale.com/net/dnsfallback" "tailscale.com/net/netknob" "tailscale.com/net/netns" "tailscale.com/net/tlsdial" @@ -592,10 +594,22 @@ func newLogtailTransport(host string) *http.Transport { t0 := time.Now() c, err := nd.DialContext(ctx, netw, addr) d := time.Since(t0).Round(time.Millisecond) - if err != nil { - log.Printf("logtail: dial %q failed: %v (in %v)", addr, err, d) - } else { + if err == nil { log.Printf("logtail: dialed %q in %v", addr, d) + return c, nil + } + + // If we failed to dial, try again with bootstrap DNS. + log.Printf("logtail: dial %q failed: %v (in %v), trying bootstrap...", addr, err, d) + dnsCache := &dnscache.Resolver{ + Forward: dnscache.Get().Forward, // use default cache's forwarder + UseLastGood: true, + LookupIPFallback: dnsfallback.Lookup, + } + dialer := dnscache.Dialer(nd.DialContext, dnsCache) + c, err = dialer(ctx, netw, addr) + if err == nil { + log.Printf("logtail: bootstrap dial succeeded") } return c, err }