diff --git a/internal/dnsforward/dnsforward.go b/internal/dnsforward/dnsforward.go index 0380d004..a7e06c02 100644 --- a/internal/dnsforward/dnsforward.go +++ b/internal/dnsforward/dnsforward.go @@ -518,6 +518,29 @@ func (s *Server) prepareLocalResolvers( return uc, nil } +// LocalResolversError is an error type for errors during local resolvers setup. +// This is only needed to distinguish these errors from errors returned by +// creating the proxy. +type LocalResolversError struct { + Err error +} + +// type check +var _ error = (*LocalResolversError)(nil) + +// Error implements the error interface for *localResolversError. +func (err *LocalResolversError) Error() (s string) { + return fmt.Sprintf("creating local resolvers: %s", err.Err) +} + +// type check +var _ errors.Wrapper = (*LocalResolversError)(nil) + +// Unwrap implements the [errors.Wrapper] interface for *localResolversError. +func (err *LocalResolversError) Unwrap() error { + return err.Err +} + // setupLocalResolvers initializes and sets the resolvers for local addresses. // It assumes s.serverLock is locked or s not running. It returns the upstream // configuration used for private PTR resolving, or nil if it's disabled. Note, @@ -538,7 +561,7 @@ func (s *Server) setupLocalResolvers(boot upstream.Resolver) (uc *proxy.Upstream UpstreamConfig: uc, }) if err != nil { - return nil, fmt.Errorf("creating local resolvers: %w", err) + return nil, &LocalResolversError{Err: err} } // TODO(e.burkov): Should we also consider the DNS64 usage? diff --git a/internal/home/dns.go b/internal/home/dns.go index a1f841b7..8cab8156 100644 --- a/internal/home/dns.go +++ b/internal/home/dns.go @@ -18,6 +18,7 @@ import ( "github.com/AdguardTeam/AdGuardHome/internal/filtering" "github.com/AdguardTeam/AdGuardHome/internal/querylog" "github.com/AdguardTeam/AdGuardHome/internal/stats" + "github.com/AdguardTeam/dnsproxy/upstream" "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/netutil" @@ -157,6 +158,17 @@ func initDNSServer( } err = Context.dnsServer.Prepare(dnsConf) + + // TODO(e.burkov): Recreate the server with private RDNS disabled. This + // should go away once the private RDNS resolution is moved to the proxy. + var locResErr *dnsforward.LocalResolversError + if errors.As(err, &locResErr) && errors.Is(locResErr.Err, upstream.ErrNoUpstreams) { + log.Info("WARNING: no local resolvers configured while private RDNS " + + "resolution enabled, trying to disable") + dnsConf.UsePrivateRDNS = false + err = Context.dnsServer.Prepare(dnsConf) + } + if err != nil { return fmt.Errorf("dnsServer.Prepare: %w", err) }