优化解析
This commit is contained in:
+25
-12
@@ -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 {
|
||||||
// 更新服务器统计信息
|
// 更新服务器统计信息
|
||||||
|
|||||||
Reference in New Issue
Block a user