update
This commit is contained in:
+13
-6
@@ -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)
|
||||
}()
|
||||
|
||||
Reference in New Issue
Block a user