This commit is contained in:
Alex Yang
2026-04-04 12:49:15 +08:00
parent 63464df2f0
commit d4c15f83b3
28 changed files with 13 additions and 480533 deletions
+13 -6
View File
@@ -1284,6 +1284,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
// 使用配置中的超时时间
defaultTimeout := time.Duration(s.config.QueryTimeout) * time.Millisecond
logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultTimeout", defaultTimeout, "queryTimeout 配置", s.config.QueryTimeout)
// 根据查询模式处理请求
switch s.config.QueryMode {
@@ -1334,7 +1335,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
// 检查是否包含DNSSEC记录
containsDNSSEC := s.hasDNSSECRecords(resp.response)
// 对于不验证DNSSEC的域名,始终设置AD标志为false
// 对于不验证 DNSSEC 的域名,始终设置 AD 标志为 false
if noDNSSEC {
resp.response.AuthenticatedData = false
}
@@ -1525,6 +1526,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
var fastestHasDnssec bool
var successResponses []*dns.Msg
var nxdomainResponses []*dns.Msg
var bestResponseSent bool // 标记是否已经发送了最佳响应
// 等待所有请求完成或超时
timer := time.NewTimer(defaultTimeout)
@@ -1566,25 +1568,26 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
}
// 简化的快速返回逻辑:找到第一个成功响应或更快的响应
// 对于不验证 DNSSEC 的域名,直接返回第一个成功响应
if noDNSSEC {
// 对于不验证 DNSSEC 的域名,直接返回第一个成功响应(只发送一次)
if noDNSSEC && !bestResponseSent {
// 不验证 DNSSEC 的域名:直接返回第一个成功响应
if !hasBestResponse || resp.rtt < fastestRtt {
if fastestResponse == nil || resp.rtt < fastestRtt {
fastestResponse = resp.response
fastestRtt = resp.rtt
fastestServer = resp.server
fastestDnssecServer = dnssecServerForResponse
fastestHasDnssec = false
// 立即发送结果,快速返回
// 立即发送结果,快速返回(只发送一次)
resultChan <- struct {
response *dns.Msg
rtt time.Duration
usedServer string
usedDnssecServer string
}{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer}
bestResponseSent = true
}
} else if resp.response.Rcode == dns.RcodeSuccess {
} else if resp.response.Rcode == dns.RcodeSuccess && !bestResponseSent {
// 优先选择带有DNSSEC的响应
if containsDNSSEC {
// 如果这是第一个DNSSEC响应,或者比当前最快的DNSSEC响应更快
@@ -1625,6 +1628,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
usedServer string
usedDnssecServer string
}{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer}
bestResponseSent = true
}
} else {
// 非DNSSEC响应,只有在还没有找到DNSSEC响应且当前响应更快时才更新
@@ -1667,6 +1671,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
usedServer string
usedDnssecServer string
}{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer}
bestResponseSent = true
}
}
} else if resp.response.Rcode == dns.RcodeNameError {
@@ -1710,6 +1715,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
usedServer string
usedDnssecServer string
}{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer}
bestResponseSent = true
}
}
} else {
@@ -1742,6 +1748,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
usedServer string
usedDnssecServer string
}{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer}
bestResponseSent = true
}
close(resultChan)
}()