修复nil导致查询返回问题
This commit is contained in:
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
// 使用上游服务器的实际响应时间(转换为毫秒)
|
||||
|
||||
Reference in New Issue
Block a user