dns: switch to active upstream pool and wave fallback behavior
This commit is contained in:
@@ -141,14 +141,9 @@ type wildcardMatcher struct {
|
||||
suffix []string
|
||||
}
|
||||
|
||||
var resolverFallbackDNS = []string{
|
||||
"1.1.1.1#53",
|
||||
"1.0.0.1#53",
|
||||
"9.9.9.9#53",
|
||||
"149.112.112.112#53",
|
||||
"8.8.8.8#53",
|
||||
"8.8.4.4#53",
|
||||
}
|
||||
// Empty by default: primary resolver pool comes from DNS upstream pool state.
|
||||
// Optional fallback list can still be provided via RESOLVE_DNS_FALLBACKS env.
|
||||
var resolverFallbackDNS []string
|
||||
|
||||
func normalizeWildcardDomain(raw string) string {
|
||||
d := strings.TrimSpace(strings.SplitN(raw, "#", 2)[0])
|
||||
@@ -562,14 +557,8 @@ func digA(host string, dnsList []string, timeout time.Duration, logf func(string
|
||||
if logf != nil {
|
||||
logf("dns warn %s via %s: kind=%s err=%v", host, addr, kind, err)
|
||||
}
|
||||
// NXDOMAIN usually means authoritative negative answer.
|
||||
// Do not fan out further retries for this host.
|
||||
if kind == dnsErrorNXDomain {
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
stats.addSuccess(addr)
|
||||
var ips []string
|
||||
for _, ip := range records {
|
||||
if isPrivateIPv4(ip) {
|
||||
@@ -577,6 +566,14 @@ func digA(host string, dnsList []string, timeout time.Duration, logf func(string
|
||||
}
|
||||
ips = append(ips, ip)
|
||||
}
|
||||
if len(ips) == 0 {
|
||||
stats.addError(addr, dnsErrorOther)
|
||||
if logf != nil {
|
||||
logf("dns warn %s via %s: kind=other err=no_public_ips", host, addr)
|
||||
}
|
||||
continue
|
||||
}
|
||||
stats.addSuccess(addr)
|
||||
return uniqueStrings(ips), stats
|
||||
}
|
||||
return nil, stats
|
||||
@@ -1036,6 +1033,11 @@ func loadDNSConfig(path string, logf func(string, ...any)) dnsConfig {
|
||||
SmartDNS: smartDNSAddr(),
|
||||
Mode: DNSModeDirect,
|
||||
}
|
||||
activePool := loadEnabledDNSUpstreamPool()
|
||||
if len(activePool) > 0 {
|
||||
cfg.Default = activePool
|
||||
cfg.Meta = activePool
|
||||
}
|
||||
|
||||
// 1) Если форсируем SmartDNS — вообще игнорим файл и ходим только через локальный резолвер.
|
||||
if smartDNSForced() {
|
||||
@@ -1051,12 +1053,14 @@ func loadDNSConfig(path string, logf func(string, ...any)) dnsConfig {
|
||||
return cfg
|
||||
}
|
||||
|
||||
// 2) Иначе пытаемся прочитать dns-upstreams.conf, как и раньше.
|
||||
// 2) Читаем dns-upstreams.conf для legacy-совместимости и smartdns/mode значений.
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
if logf != nil {
|
||||
logf("dns-config: use built-in defaults, can't read %s: %v", path, err)
|
||||
logf("dns-config: can't read %s: %v", path, err)
|
||||
}
|
||||
cfg.Default = mergeDNSUpstreamPools(cfg.Default, resolverFallbackPool())
|
||||
cfg.Meta = mergeDNSUpstreamPools(cfg.Meta, resolverFallbackPool())
|
||||
return cfg
|
||||
}
|
||||
|
||||
@@ -1098,11 +1102,13 @@ func loadDNSConfig(path string, logf func(string, ...any)) dnsConfig {
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(def) > 0 {
|
||||
cfg.Default = def
|
||||
}
|
||||
if len(meta) > 0 {
|
||||
cfg.Meta = meta
|
||||
if len(activePool) == 0 {
|
||||
if len(def) > 0 {
|
||||
cfg.Default = def
|
||||
}
|
||||
if len(meta) > 0 {
|
||||
cfg.Meta = meta
|
||||
}
|
||||
}
|
||||
cfg.Default = mergeDNSUpstreamPools(cfg.Default, resolverFallbackPool())
|
||||
cfg.Meta = mergeDNSUpstreamPools(cfg.Meta, resolverFallbackPool())
|
||||
|
||||
Reference in New Issue
Block a user