多项修复

This commit is contained in:
Alex Yang
2026-04-04 12:25:49 +08:00
parent 429b2331fb
commit 63464df2f0
4 changed files with 3353 additions and 4 deletions
BIN
View File
Binary file not shown.
+22 -4
View File
@@ -1556,17 +1556,35 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
dnssecServerForResponse = resp.server
}
// 如果响应成功或为NXDOMAIN
// 如果响应成功或为 NXDOMAIN
if resp.response.Rcode == dns.RcodeSuccess || resp.response.Rcode == dns.RcodeNameError {
// 按Rcode分类添加到不同列表
// 按 Rcode 分类添加到不同列表
if resp.response.Rcode == dns.RcodeSuccess {
successResponses = append(successResponses, resp.response)
} else {
nxdomainResponses = append(nxdomainResponses, resp.response)
}
// 快速返回逻辑:找到第一个有效响应或更快的响应
if resp.response.Rcode == dns.RcodeSuccess {
// 简化的快速返回逻辑:找到第一个成功响应或更快的响应
// 对于不验证 DNSSEC 的域名,直接返回第一个成功响应
if noDNSSEC {
// 不验证 DNSSEC 的域名:直接返回第一个成功响应
if !hasBestResponse || 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}
}
} else if resp.response.Rcode == dns.RcodeSuccess {
// 优先选择带有DNSSEC的响应
if containsDNSSEC {
// 如果这是第一个DNSSEC响应,或者比当前最快的DNSSEC响应更快
+3293
View File
File diff suppressed because it is too large Load Diff
+38
View File
@@ -0,0 +1,38 @@
--- dns/server.go
+++ dns/server.go
@@ -605,6 +605,8 @@ func (s *Server) checkRequestConditions(w dns.ResponseWriter, r *dns.Msg, startT
if r.RecursionDesired == false {
se := new(dns.Msg)
se.SetReply(r)
+// 设置递归可用标志
+response.RecursionAvailable = true
不再硬编码 RecursionAvailable,使用默认值或上游返回的值
se.SetRcode(r, dns.RcodeRefused)
se)
@@ -1010,6 +1012,8 @@ func (s *Server) handleHostsResponse(w dns.ResponseWriter, r *dns.Msg, ip string
func handleHostsResponse(w dns.ResponseWriter, r *dns.Msg, ip string) {
response := new(dns.Msg)
response.SetReply(r)
+// 设置递归可用标志(因为我们的 DNS 服务器支持递归查询)
+response.RecursionAvailable = true
// 不再硬编码 RecursionAvailable,使用默认值或上游返回的值
if len(r.Question) > 0 {
@@ -1051,6 +1055,8 @@ func (s *Server) handleGFWListResponse(w dns.ResponseWriter, r *dns.Msg, domain
response := new(dns.Msg)
response.SetReply(r)
+// 设置递归可用标志
+response.RecursionAvailable = true
if len(r.Question) > 0 {
:= r.Question[0]
@@ -1082,6 +1088,8 @@ func (s *Server) handleBlockedResponse(w dns.ResponseWriter, r *dns.Msg, domain
response := new(dns.Msg)
response.SetReply(r)
+// 设置递归可用标志
+response.RecursionAvailable = true
// 不再硬编码 RecursionAvailable,使用默认值或上游返回的值
// 获取屏蔽方法配置