diff --git a/dns/server.go b/dns/server.go index ae251a2..7f2e826 100644 --- a/dns/server.go +++ b/dns/server.go @@ -1568,10 +1568,27 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT } // 简化的快速返回逻辑:找到第一个成功响应或更快的响应 - // 对于不验证 DNSSEC 的域名,直接返回第一个成功响应(只发送一次) - if noDNSSEC && !bestResponseSent { - // 不验证 DNSSEC 的域名:直接返回第一个成功响应 - if fastestResponse == nil || resp.rtt < fastestRtt { + // 对于不验证 DNSSEC 的域名,直接返回第一个成功响应(只发送一次) + if noDNSSEC && !bestResponseSent { + // 不验证 DNSSEC 的域名:返回第一个包含有效记录的成功响应 + if fastestResponse == nil || resp.rtt < fastestRtt { + // 检查响应是否包含有效记录 + hasValidRecords := false + if len(resp.response.Answer) > 0 { + hasValidRecords = true + } else if len(resp.response.Ns) > 0 { + hasValidRecords = true + } else if len(resp.response.Extra) > 0 { + for _, rr := range resp.response.Extra { + if rr.Header().Rrtype != dns.TypeOPT { + hasValidRecords = true + break + } + } + } + + // 只有包含有效记录才返回 + if hasValidRecords { fastestResponse = resp.response fastestRtt = resp.rtt fastestServer = resp.server @@ -1587,7 +1604,8 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT }{fastestResponse, fastestRtt, fastestServer, fastestDnssecServer} bestResponseSent = true } - } else if resp.response.Rcode == dns.RcodeSuccess && !bestResponseSent { + } + } else if resp.response.Rcode == dns.RcodeSuccess && !bestResponseSent { // 优先选择带有DNSSEC的响应 if containsDNSSEC { // 如果这是第一个DNSSEC响应,或者比当前最快的DNSSEC响应更快