修复Got recursion not available from *.*.*.*

This commit is contained in:
Alex Yang
2026-04-04 02:01:09 +08:00
parent 1fd71ddfde
commit 67c7332f75
104 changed files with 18 additions and 5730 deletions
+18 -3
View File
@@ -579,11 +579,13 @@ func (s *Server) initRequestInfo(w dns.ResponseWriter, r *dns.Msg) *requestInfo
// checkRequestConditions 检查请求条件,返回是否需要提前响应
func (s *Server) checkRequestConditions(w dns.ResponseWriter, r *dns.Msg, startTime time.Time, reqInfo *requestInfo) bool {
// 检查是否是AAAA记录查询且IPv6解析已禁用
// 检查是否是 AAAA 记录查询且 IPv6 解析已禁用
if reqInfo.qType == dns.TypeAAAA && !s.config.EnableIPv6 {
// 返回空的成功响应,而不是NXDOMAIN
// 返回空的成功响应,而不是 NXDOMAIN
response := new(dns.Msg)
response.SetReply(r)
// 设置递归可用标志
response.RecursionAvailable = true
response.SetRcode(r, dns.RcodeSuccess)
w.WriteMsg(response)
@@ -605,7 +607,9 @@ func (s *Server) checkRequestConditions(w dns.ResponseWriter, r *dns.Msg, startT
if r.RecursionDesired == false {
response := new(dns.Msg)
response.SetReply(r)
// 不再硬编码RecursionAvailable,使用默认值或上游返回的值
// 设置递归可用标志
response.RecursionAvailable = true
// 不再硬编码 RecursionAvailable,使用默认值或上游返回的值
response.SetRcode(r, dns.RcodeRefused)
w.WriteMsg(response)
@@ -859,6 +863,10 @@ func (s *Server) handleUpstreamRequest(w dns.ResponseWriter, r *dns.Msg, startTi
// 确保响应的Question部分与客户端请求的Question部分匹配
response.Question = r.Question
// 设置递归可用标志(因为我们的 DNS 服务器支持递归查询)
response.RecursionAvailable = true
response.RecursionDesired = r.RecursionDesired
// 修复:如果响应包含记录,确保Rcode为成功
hasValidRecords := false
@@ -1006,6 +1014,11 @@ func (s *Server) handleUpstreamRequest(w dns.ResponseWriter, r *dns.Msg, startTi
func (s *Server) handleHostsResponse(w dns.ResponseWriter, r *dns.Msg, ip string) {
response := new(dns.Msg)
response.SetReply(r)
// 设置递归可用标志
response.RecursionAvailable = true
// 不再硬编码 RecursionAvailable,使用默认值或上游返回的值
// 设置递归可用标志(因为我们的 DNS 服务器支持递归查询)
response.RecursionAvailable = true
// 不再硬编码 RecursionAvailable,使用默认值或上游返回的值
if len(r.Question) > 0 {
@@ -2032,6 +2045,8 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
// 所有上游服务器都失败,返回服务器失败错误
response := new(dns.Msg)
response.SetReply(r)
// 设置递归可用标志
response.RecursionAvailable = true
response.SetRcode(r, dns.RcodeServerFailure)