From ff341bd7cf9e30ee84b72fbf2fc3e6aa38c0feda Mon Sep 17 00:00:00 2001 From: Stanislav Chzhen Date: Mon, 21 Aug 2023 19:34:02 +0300 Subject: [PATCH] Pull request 1965: 3701-fallback-dns Updates #3701. Squashed commit of the following: commit 5801acd3a919a55be6cb1de3b5c8afb61d5136d8 Author: Stanislav Chzhen Date: Mon Aug 21 13:37:57 2023 +0300 all: upd chlog commit 5c40913f76131854d321950f80ae9d5b78e56d9d Author: Stanislav Chzhen Date: Thu Aug 17 13:15:19 2023 +0300 dnsforward: add fallback dns servers --- CHANGELOG.md | 2 ++ internal/dnsforward/config.go | 3 +++ internal/dnsforward/dnsforward.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index adc57df7..eff8ef36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ NOTE: Add new changes BELOW THIS COMMENT. ### Added +- The ability to set fallback DNS servers in the configuration file ([#3701]). - While adding or updating blocklists, the title can now be parsed from `! Title:` definition of the blocklist's source ([#6020]). - The ability to filter DNS HTTPS records including IPv4/v6 hints ([#6053]). @@ -70,6 +71,7 @@ In this release, the schema version has changed from 24 to 25. ([#5948]). [#1453]: https://github.com/AdguardTeam/AdGuardHome/issues/1453 +[#3701]: https://github.com/AdguardTeam/AdGuardHome/issues/3701 [#5948]: https://github.com/AdguardTeam/AdGuardHome/issues/5948 [#6020]: https://github.com/AdguardTeam/AdGuardHome/issues/6020 [#6053]: https://github.com/AdguardTeam/AdGuardHome/issues/6053 diff --git a/internal/dnsforward/config.go b/internal/dnsforward/config.go index ffd51a78..89695cc5 100644 --- a/internal/dnsforward/config.go +++ b/internal/dnsforward/config.go @@ -118,6 +118,9 @@ type FilteringConfig struct { // resolvers (plain DNS only). BootstrapDNS []string `yaml:"bootstrap_dns"` + // FallbackDNS is the list of fallback DNS servers. + FallbackDNS []string `yaml:"fallback_dns"` + // AllServers, if true, parallel queries to all configured upstream servers // are enabled. AllServers bool `yaml:"all_servers"` diff --git a/internal/dnsforward/dnsforward.go b/internal/dnsforward/dnsforward.go index fcc0fa5f..c1ee6686 100644 --- a/internal/dnsforward/dnsforward.go +++ b/internal/dnsforward/dnsforward.go @@ -263,6 +263,7 @@ func (s *Server) WriteDiskConfig(c *FilteringConfig) { *c = sc c.RatelimitWhitelist = stringutil.CloneSlice(sc.RatelimitWhitelist) c.BootstrapDNS = stringutil.CloneSlice(sc.BootstrapDNS) + c.FallbackDNS = stringutil.CloneSlice(sc.FallbackDNS) c.AllowedClients = stringutil.CloneSlice(sc.AllowedClients) c.DisallowedClients = stringutil.CloneSlice(sc.DisallowedClients) c.BlockedHosts = stringutil.CloneSlice(sc.BlockedHosts) @@ -584,6 +585,11 @@ func (s *Server) Prepare(conf *ServerConfig) (err error) { return fmt.Errorf("setting up resolvers: %w", err) } + err = s.setupFallbackDNS() + if err != nil { + return fmt.Errorf("setting up fallback dns servers: %w", err) + } + s.recDetector.clear() s.setupAddrProc() @@ -593,6 +599,28 @@ func (s *Server) Prepare(conf *ServerConfig) (err error) { return nil } +// setupFallbackDNS initializes the fallback DNS servers. +func (s *Server) setupFallbackDNS() (err error) { + fallbacks := s.conf.FallbackDNS + if len(fallbacks) == 0 { + return nil + } + + uc, err := proxy.ParseUpstreamsConfig(fallbacks, &upstream.Options{ + // TODO(s.chzhen): Investigate if other options are needed. + Timeout: s.conf.UpstreamTimeout, + PreferIPv6: s.conf.BootstrapPreferIPv6, + }) + if err != nil { + // Do not wrap the error because it's informative enough as is. + return err + } + + s.dnsProxy.Fallbacks = uc + + return nil +} + // setupAddrProc initializes the address processor. For internal use only. func (s *Server) setupAddrProc() { // TODO(a.garipov): This is a crutch for tests; remove.