From 429b2331fb95616fb1a875447d67f384112885b7 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Sat, 4 Apr 2026 12:16:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dnil=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=BF=94=E5=9B=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 10 +++++----- dns/server.go | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index caf9aa7..0ff11bf 100755 --- a/build.sh +++ b/build.sh @@ -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 diff --git a/dns/server.go b/dns/server.go index 67f95ff..cd253c8 100644 --- a/dns/server.go +++ b/dns/server.go @@ -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) } // 使用上游服务器的实际响应时间(转换为毫秒)