From 759633b11f0e2bc5c40cea3752b9c8c09cf0e812 Mon Sep 17 00:00:00 2001 From: yangdx Date: Sat, 4 Apr 2026 18:05:32 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20dns/server.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dns/server.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) 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响应更快