mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-15 09:58:42 -07:00
dnsforward: upd proxy, imp code, docs
This commit is contained in:
parent
4de1eb2bca
commit
b98adbc0cc
2
go.mod
2
go.mod
@ -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
4
go.sum
@ -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=
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user