修复nil导致查询返回问题

This commit is contained in:
Alex Yang
2026-04-04 12:16:48 +08:00
parent 67c7332f75
commit 429b2331fb
2 changed files with 23 additions and 13 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
CGO_ENABLED=1
GOOS=linux
GOARCH=amd64
CC=gcc
service dns-server stop && go build -o dns-server main.go && service dns-server start
export CGO_ENABLED=1
export GOOS=linux
export GOARCH=amd64
export CC=gcc
#service dns-server stop && go build -o dns-server main.go && service dns-server start
+18 -8
View File
@@ -838,36 +838,36 @@ func (s *Server) handleUpstreamRequest(w dns.ResponseWriter, r *dns.Msg, startTi
logger.Debug("上游请求返回", "domain", reqInfo.domain, "response", response != nil, "rtt", rtt)
if response != nil {
// 如果客户端请求包含EDNS记录,确保响应也包含EDNS
// 如果客户端请求包含 EDNS 记录,确保响应也包含 EDNS
if opt := r.IsEdns0(); opt != nil {
// 检查响应是否已经包含EDNS记录
// 检查响应是否已经包含 EDNS 记录
if respOpt := response.IsEdns0(); respOpt == nil {
// 添加EDNS记录,使用客户端的UDP缓冲区大小
// 添加 EDNS 记录,使用客户端的 UDP 缓冲区大小
response.SetEdns0(opt.UDPSize(), s.config.EnableDNSSEC)
} else {
// 确保响应的UDP缓冲区大小不超过客户端请求的大小
// 确保响应的 UDP 缓冲区大小不超过客户端请求的大小
if respOpt.UDPSize() > opt.UDPSize() {
// 移除现有的EDNS记录
// 移除现有的 EDNS 记录
for i := range response.Extra {
if response.Extra[i] == respOpt {
response.Extra = append(response.Extra[:i], response.Extra[i+1:]...)
break
}
}
// 添加新的EDNS记录,使用客户端的UDP缓冲区大小
// 添加新的 EDNS 记录,使用客户端的 UDP 缓冲区大小
response.SetEdns0(opt.UDPSize(), s.config.EnableDNSSEC)
}
}
}
// 确保响应的Question部分与客户端请求的Question部分匹配
// 确保响应的 Question 部分与客户端请求的 Question 部分匹配
response.Question = r.Question
// 设置递归可用标志(因为我们的 DNS 服务器支持递归查询)
response.RecursionAvailable = true
response.RecursionDesired = r.RecursionDesired
// 修复:如果响应包含记录,确保Rcode为成功
// 修复:如果响应包含记录,确保 Rcode 为成功
hasValidRecords := false
// 检查Answer部分
@@ -892,6 +892,16 @@ func (s *Server) handleUpstreamRequest(w dns.ResponseWriter, r *dns.Msg, startTi
// 写入响应给客户端
w.WriteMsg(response)
} else {
// response 为 nil,说明上游 DNS 查询失败
// 返回服务器失败错误给客户端
logger.Debug("上游 DNS 查询失败,返回 SERVFAIL", "domain", reqInfo.domain)
errorResponse := new(dns.Msg)
errorResponse.SetReply(r)
// 设置递归可用标志
errorResponse.RecursionAvailable = true
errorResponse.SetRcode(r, dns.RcodeServerFailure)
w.WriteMsg(errorResponse)
}
// 使用上游服务器的实际响应时间(转换为毫秒)