dnsforward: upd proxy, imp code, docs

This commit is contained in:
Eugene Burkov 2024-04-10 19:21:44 +03:00
parent 4de1eb2bca
commit b98adbc0cc
5 changed files with 27 additions and 29 deletions

2
go.mod
View File

@ -3,7 +3,7 @@ module github.com/AdguardTeam/AdGuardHome
go 1.22.2 go 1.22.2
require ( require (
github.com/AdguardTeam/dnsproxy v0.69.0 github.com/AdguardTeam/dnsproxy v0.69.1
github.com/AdguardTeam/golibs v0.23.0 github.com/AdguardTeam/golibs v0.23.0
github.com/AdguardTeam/urlfilter v0.18.0 github.com/AdguardTeam/urlfilter v0.18.0
github.com/NYTimes/gziphandler v1.1.1 github.com/NYTimes/gziphandler v1.1.1

4
go.sum
View File

@ -1,5 +1,5 @@
github.com/AdguardTeam/dnsproxy v0.69.0 h1:VaaXpvkkNkf3gx9d8EvUutRQu/BVtT8vvDa572U3wTk= github.com/AdguardTeam/dnsproxy v0.69.1 h1:KiLkKUSrvHeUO/YEf4Bbo/5zyFRIvQstjL7W9G/24pk=
github.com/AdguardTeam/dnsproxy v0.69.0/go.mod h1:atO3WeeuyepyhjSt6hC+MF7/IN7TZHfG3/ZwhImHzYs= github.com/AdguardTeam/dnsproxy v0.69.1/go.mod h1:atO3WeeuyepyhjSt6hC+MF7/IN7TZHfG3/ZwhImHzYs=
github.com/AdguardTeam/golibs v0.23.0 h1:PHz/QhJhLmoaOokkqrPFUgu9Hw4iVAqLtBP0O3g1D3Q= github.com/AdguardTeam/golibs v0.23.0 h1:PHz/QhJhLmoaOokkqrPFUgu9Hw4iVAqLtBP0O3g1D3Q=
github.com/AdguardTeam/golibs v0.23.0/go.mod h1:/xZCf6gZZzz7k1qaoJmI+hhxN98kHFr7LJ22j1nLH0c= github.com/AdguardTeam/golibs v0.23.0/go.mod h1:/xZCf6gZZzz7k1qaoJmI+hhxN98kHFr7LJ22j1nLH0c=
github.com/AdguardTeam/urlfilter v0.18.0 h1:ZZzwODC/ADpjJSODxySrrUnt/fvOCfGFaCW6j+wsGfQ= github.com/AdguardTeam/urlfilter v0.18.0 h1:ZZzwODC/ADpjJSODxySrrUnt/fvOCfGFaCW6j+wsGfQ=

View File

@ -517,7 +517,7 @@ func (s *Server) prepareUpstreamSettings(boot upstream.Resolver) (err error) {
return fmt.Errorf("loading upstreams: %w", err) return fmt.Errorf("loading upstreams: %w", err)
} }
s.conf.UpstreamConfig, err = newUpstreamConfig(upstreams, defaultDNS, &upstream.Options{ uc, err := newUpstreamConfig(upstreams, defaultDNS, &upstream.Options{
Bootstrap: boot, Bootstrap: boot,
Timeout: s.conf.UpstreamTimeout, Timeout: s.conf.UpstreamTimeout,
HTTPVersions: UpstreamHTTPVersions(s.conf.UseHTTP3Upstreams), HTTPVersions: UpstreamHTTPVersions(s.conf.UseHTTP3Upstreams),
@ -536,6 +536,8 @@ func (s *Server) prepareUpstreamSettings(boot upstream.Resolver) (err error) {
return fmt.Errorf("preparing upstream config: %w", err) return fmt.Errorf("preparing upstream config: %w", err)
} }
s.conf.UpstreamConfig = uc
return nil return nil
} }
@ -582,18 +584,11 @@ func (s *Server) prepareLocalResolvers() (uc *proxy.UpstreamConfig, err error) {
} }
addrs := s.conf.LocalPTRResolvers addrs := s.conf.LocalPTRResolvers
uc, err = newLocalResolvers(addrs, ownAddrs, s.sysResolvers, s.privateNets, opts) uc, err = newPrivateConfig(addrs, ownAddrs, s.sysResolvers, s.privateNets, opts)
if err != nil { if err != nil {
return nil, fmt.Errorf("preparing resolvers: %w", err) return nil, fmt.Errorf("preparing resolvers: %w", err)
} }
// Prevalidate the config to catch the exact error before creating proxy.
// See TODO on [ErrBadPrivateRDNSUpstreams].
err = proxy.ValidatePrivateConfig(uc, s.privateNets)
if err != nil {
return nil, err
}
return uc, nil return uc, nil
} }

View File

@ -342,7 +342,7 @@ func (req *jsonDNSConfig) validateUpstreamDNSServers(
opts := &upstream.Options{} opts := &upstream.Options{}
if req.Upstreams != nil { if req.Upstreams != nil {
uc, err = newUpstreamConfig(*req.Upstreams, nil, opts) uc, err = proxy.ParseUpstreamsConfig(*req.Upstreams, opts)
err = errors.WithDeferred(err, uc.Close()) err = errors.WithDeferred(err, uc.Close())
if err != nil { if err != nil {
return fmt.Errorf("upstream servers: %w", err) return fmt.Errorf("upstream servers: %w", err)
@ -350,7 +350,7 @@ func (req *jsonDNSConfig) validateUpstreamDNSServers(
} }
if addrs := req.LocalPTRUpstreams; addrs != nil { if addrs := req.LocalPTRUpstreams; addrs != nil {
uc, err = newLocalResolvers(*addrs, ownAddrs, sysResolvers, privateNets, opts) uc, err = newPrivateConfig(*addrs, ownAddrs, sysResolvers, privateNets, opts)
err = errors.WithDeferred(err, uc.Close()) err = errors.WithDeferred(err, uc.Close())
if err != nil { if err != nil {
return fmt.Errorf("private upstream servers: %w", err) return fmt.Errorf("private upstream servers: %w", err)
@ -364,7 +364,7 @@ func (req *jsonDNSConfig) validateUpstreamDNSServers(
} }
if req.Fallbacks != nil { if req.Fallbacks != nil {
uc, err = newUpstreamConfig(*req.Fallbacks, nil, opts) uc, err = proxy.ParseUpstreamsConfig(*req.Fallbacks, opts)
err = errors.WithDeferred(err, uc.Close()) err = errors.WithDeferred(err, uc.Close())
if err != nil { if err != nil {
return fmt.Errorf("fallback servers: %w", err) return fmt.Errorf("fallback servers: %w", err)
@ -440,6 +440,7 @@ func (s *Server) handleSetConfig(w http.ResponseWriter, r *http.Request) {
// TODO(e.burkov): Consider prebuilding this set on startup. // TODO(e.burkov): Consider prebuilding this set on startup.
ourAddrs, err := s.conf.ourAddrsSet() ourAddrs, err := s.conf.ourAddrsSet()
if err != nil { if err != nil {
// TODO(e.burkov): !! Put into openapi
aghhttp.Error(r, w, http.StatusInternalServerError, "getting our addresses: %s", err) aghhttp.Error(r, w, http.StatusInternalServerError, "getting our addresses: %s", err)
return return

View File

@ -81,11 +81,11 @@ func newUpstreamConfig(
return uc, nil return uc, nil
} }
// newLocalResolvers creates an upstream configuration for resolving PTR records // newPrivateConfig creates an upstream configuration for resolving PTR records
// for local addresses. The configuration is built either from the provided // for local addresses. The configuration is built either from the provided
// addresses or from the system resolvers. unwanted filters the resulting // addresses or from the system resolvers. unwanted filters the resulting
// upstream configuration. // upstream configuration.
func newLocalResolvers( func newPrivateConfig(
addrs []string, addrs []string,
unwanted addrPortSet, unwanted addrPortSet,
sysResolvers SystemResolvers, sysResolvers SystemResolvers,
@ -105,23 +105,25 @@ func newLocalResolvers(
log.Debug("dnsforward: upstreams to resolve ptr for local addresses: %v", addrs) log.Debug("dnsforward: upstreams to resolve ptr for local addresses: %v", addrs)
uc, err = newUpstreamConfig(addrs, nil, opts) uc, err = proxy.ParseUpstreamsConfig(addrs, opts)
if err != nil { if err != nil {
return nil, fmt.Errorf("preparing private upstreams: %w", err) return uc, fmt.Errorf("preparing private upstreams: %w", err)
} }
if confNeedsFiltering { if !confNeedsFiltering {
err = filterOutAddrs(uc, unwanted) return uc, nil
if err != nil { }
return nil, fmt.Errorf("filtering private upstreams: %w", err)
}
err = proxy.ValidatePrivateConfig(uc, privateNets) err = filterOutAddrs(uc, unwanted)
if err != nil { if err != nil {
log.Debug("dnsforward: validating private rdns upstreams: %s", err) return uc, fmt.Errorf("filtering private upstreams: %w", err)
}
return nil, &PrivateRDNSError{err: err} // Prevalidate the config to catch the exact error before creating proxy.
} // See TODO on [PrivateRDNSError].
err = proxy.ValidatePrivateConfig(uc, privateNets)
if err != nil {
return uc, &PrivateRDNSError{err: err}
} }
return uc, nil return uc, nil