Pull request 1965: 3701-fallback-dns

Updates #3701.

Squashed commit of the following:

commit 5801acd3a919a55be6cb1de3b5c8afb61d5136d8
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date:   Mon Aug 21 13:37:57 2023 +0300

    all: upd chlog

commit 5c40913f76131854d321950f80ae9d5b78e56d9d
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date:   Thu Aug 17 13:15:19 2023 +0300

    dnsforward: add fallback dns servers
This commit is contained in:
Stanislav Chzhen 2023-08-21 19:34:02 +03:00
parent 05262d7b6b
commit ff341bd7cf
3 changed files with 33 additions and 0 deletions

View File

@ -25,6 +25,7 @@ NOTE: Add new changes BELOW THIS COMMENT.
### Added ### 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 - While adding or updating blocklists, the title can now be parsed from
`! Title:` definition of the blocklist's source ([#6020]). `! Title:` definition of the blocklist's source ([#6020]).
- The ability to filter DNS HTTPS records including IPv4/v6 hints ([#6053]). - 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]). ([#5948]).
[#1453]: https://github.com/AdguardTeam/AdGuardHome/issues/1453 [#1453]: https://github.com/AdguardTeam/AdGuardHome/issues/1453
[#3701]: https://github.com/AdguardTeam/AdGuardHome/issues/3701
[#5948]: https://github.com/AdguardTeam/AdGuardHome/issues/5948 [#5948]: https://github.com/AdguardTeam/AdGuardHome/issues/5948
[#6020]: https://github.com/AdguardTeam/AdGuardHome/issues/6020 [#6020]: https://github.com/AdguardTeam/AdGuardHome/issues/6020
[#6053]: https://github.com/AdguardTeam/AdGuardHome/issues/6053 [#6053]: https://github.com/AdguardTeam/AdGuardHome/issues/6053

View File

@ -118,6 +118,9 @@ type FilteringConfig struct {
// resolvers (plain DNS only). // resolvers (plain DNS only).
BootstrapDNS []string `yaml:"bootstrap_dns"` 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 // AllServers, if true, parallel queries to all configured upstream servers
// are enabled. // are enabled.
AllServers bool `yaml:"all_servers"` AllServers bool `yaml:"all_servers"`

View File

@ -263,6 +263,7 @@ func (s *Server) WriteDiskConfig(c *FilteringConfig) {
*c = sc *c = sc
c.RatelimitWhitelist = stringutil.CloneSlice(sc.RatelimitWhitelist) c.RatelimitWhitelist = stringutil.CloneSlice(sc.RatelimitWhitelist)
c.BootstrapDNS = stringutil.CloneSlice(sc.BootstrapDNS) c.BootstrapDNS = stringutil.CloneSlice(sc.BootstrapDNS)
c.FallbackDNS = stringutil.CloneSlice(sc.FallbackDNS)
c.AllowedClients = stringutil.CloneSlice(sc.AllowedClients) c.AllowedClients = stringutil.CloneSlice(sc.AllowedClients)
c.DisallowedClients = stringutil.CloneSlice(sc.DisallowedClients) c.DisallowedClients = stringutil.CloneSlice(sc.DisallowedClients)
c.BlockedHosts = stringutil.CloneSlice(sc.BlockedHosts) 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) 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.recDetector.clear()
s.setupAddrProc() s.setupAddrProc()
@ -593,6 +599,28 @@ func (s *Server) Prepare(conf *ServerConfig) (err error) {
return nil 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. // setupAddrProc initializes the address processor. For internal use only.
func (s *Server) setupAddrProc() { func (s *Server) setupAddrProc() {
// TODO(a.garipov): This is a crutch for tests; remove. // TODO(a.garipov): This is a crutch for tests; remove.