优化解析

This commit is contained in:
Alex Yang
2026-04-04 01:37:38 +08:00
parent b06d4d62bb
commit 1fd71ddfde
+25 -12
View File
@@ -199,8 +199,8 @@ func NewServer(globalConfig *config.Config, shieldManager *shield.ShieldManager,
Net: "udp", Net: "udp",
UDPSize: 4096, // 增加UDP缓冲区大小,支持更大的DNSSEC响应 UDPSize: 4096, // 增加UDP缓冲区大小,支持更大的DNSSEC响应
}, },
ctx: ctx, ctx: ctx,
cancel: cancel, cancel: cancel,
stats: &Stats{ stats: &Stats{
Queries: 0, Queries: 0,
Blocked: 0, Blocked: 0,
@@ -237,7 +237,7 @@ func NewServer(globalConfig *config.Config, shieldManager *shield.ShieldManager,
return &dns.Client{ return &dns.Client{
Net: "udp", Net: "udp",
UDPSize: 4096, UDPSize: 4096,
Timeout: 5 * time.Second, // 默认超时时间,会在使用时覆盖 Timeout: 2 * time.Second, // 默认超时时间,会在使用时覆盖2 秒是合理的 DNS 查询超时)
} }
}, },
}, },
@@ -339,7 +339,6 @@ func (s *Server) Start() error {
// 重置stopped标志 // 重置stopped标志
// 初始化威胁检测相关组件 // 初始化威胁检测相关组件
s.initThreatDetection() s.initThreatDetection()
@@ -1278,16 +1277,16 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
// 从池中获取客户端实例 // 从池中获取客户端实例
client := s.clientPool.Get().(*dns.Client) client := s.clientPool.Get().(*dns.Client)
// 设置客户端参数 // 设置客户端参数(确保在 Exchange 之前设置,避免竞态条件)
client.Net = s.resolver.Net client.Net = s.resolver.Net
client.UDPSize = s.resolver.UDPSize client.UDPSize = s.resolver.UDPSize
client.Timeout = defaultTimeout client.Timeout = defaultTimeout // 使用配置的超时时间
// 发送请求并获取响应,确保服务器地址包含端口号 // 发送请求并获取响应,确保服务器地址包含端口号
response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(server)) response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(server))
responses <- serverResponse{response, rtt, server, err} responses <- serverResponse{response, rtt, server, err}
// 将客户端实例放回池中 // 将客户端实例放回池中(不重置 Timeout,因为下次使用时会重新设置)
s.clientPool.Put(client) s.clientPool.Put(client)
}(upstream) }(upstream)
} }
@@ -1853,21 +1852,35 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
}, 1) }, 1)
go func() { go func() {
resp, r, e := s.resolver.Exchange(r, normalizeDNSServerAddress(localServer)) // 创建临时的 resolver,设置超时时间
tempResolver := &dns.Client{
Net: s.resolver.Net,
UDPSize: s.resolver.UDPSize,
Timeout: defaultTimeout, // 使用配置的超时时间
}
resp, rtt, e := tempResolver.Exchange(r, normalizeDNSServerAddress(localServer))
resultChan <- struct { resultChan <- struct {
response *dns.Msg response *dns.Msg
rtt time.Duration rtt time.Duration
err error err error
}{resp, r, e} }{resp, rtt, e}
}() }()
var localResponse *dns.Msg var localResponse *dns.Msg
var rtt time.Duration var rtt time.Duration
var err error var err error
// 直接获取结果,不使用上下文超时 // 使用超时获取结果
result := <-resultChan select {
localResponse, rtt, err = result.response, result.rtt, result.err case result := <-resultChan:
localResponse, rtt, err = result.response, result.rtt, result.err
case <-time.After(defaultTimeout):
// 超时
logger.Debug("本地解析超时", "domain", domain, "server", localServer, "timeout", defaultTimeout)
// 超时后跳过本地解析
localResponse = nil
err = fmt.Errorf("timeout")
}
if err == nil && localResponse != nil { if err == nil && localResponse != nil {
// 更新服务器统计信息 // 更新服务器统计信息