update
This commit is contained in:
+19
-23
@@ -1188,38 +1188,34 @@ func (s *Server) updateDNSSECServerMap() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// forwardDNSRequestWithCache 转发DNS请求到上游服务器并返回响应
|
// forwardDNSRequestWithCache 转发 DNS 请求到上游服务器并返回响应
|
||||||
func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg, time.Duration, string, string) {
|
func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg, time.Duration, string, string) {
|
||||||
// 始终支持EDNS
|
// 始终支持 EDNS
|
||||||
var udpSize uint16 = 4096
|
var udpSize uint16 = 4096
|
||||||
var doFlag bool = s.config.EnableDNSSEC
|
var doFlag bool = s.config.EnableDNSSEC
|
||||||
|
|
||||||
// 检查域名是否匹配不验证DNSSEC的模式
|
// 检查域名是否匹配不验证 DNSSEC 的模式
|
||||||
noDNSSEC := false
|
noDNSSEC := false
|
||||||
for _, pattern := range s.config.NoDNSSECDomains {
|
for _, pattern := range s.config.NoDNSSECDomains {
|
||||||
if strings.Contains(domain, pattern) {
|
if strings.Contains(domain, pattern) {
|
||||||
noDNSSEC = true
|
noDNSSEC = true
|
||||||
doFlag = false
|
doFlag = false
|
||||||
logger.Debug("域名匹配到不验证DNSSEC的模式", "domain", domain, "pattern", pattern)
|
logger.Debug("域名匹配到不验证 DNSSEC 的模式", "domain", domain, "pattern", pattern)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查客户端请求是否包含EDNS记录
|
// 检查客户端请求是否包含 EDNS 记录
|
||||||
if opt := r.IsEdns0(); opt != nil {
|
if opt := r.IsEdns0(); opt != nil {
|
||||||
// 保留客户端的UDP缓冲区大小
|
// 保留客户端的 UDP 缓冲区大小
|
||||||
udpSize = opt.UDPSize()
|
udpSize = opt.UDPSize()
|
||||||
// 移除现有的EDNS记录,以便重新添加
|
|
||||||
for i := range r.Extra {
|
|
||||||
if r.Extra[i] == opt {
|
|
||||||
r.Extra = append(r.Extra[:i], r.Extra[i+1:]...)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加EDNS记录,设置适当的UDPSize和DO标志
|
// 创建请求的副本,避免修改原始请求
|
||||||
r.SetEdns0(udpSize, doFlag)
|
query := r.Copy()
|
||||||
|
|
||||||
|
// 在副本上添加 EDNS 记录,设置适当的 UDPSize 和 DO 标志
|
||||||
|
query.SetEdns0(udpSize, doFlag)
|
||||||
|
|
||||||
// DNSSEC专用服务器列表,从配置中获取
|
// DNSSEC专用服务器列表,从配置中获取
|
||||||
dnssecServers := s.config.DNSSECUpstreamDNS
|
dnssecServers := s.config.DNSSECUpstreamDNS
|
||||||
@@ -1284,7 +1280,7 @@ func (s *Server) forwardDNSRequestWithCache(r *dns.Msg, domain string) (*dns.Msg
|
|||||||
|
|
||||||
// 使用配置中的超时时间
|
// 使用配置中的超时时间
|
||||||
defaultTimeout := time.Duration(s.config.QueryTimeout) * time.Millisecond
|
defaultTimeout := time.Duration(s.config.QueryTimeout) * time.Millisecond
|
||||||
logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultTimeout", defaultTimeout, "queryTimeout 配置", s.config.QueryTimeout)
|
logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultTimeout", defaultTimeout, "queryTimeout 配置", s.config.QueryTimeout)
|
||||||
|
|
||||||
// 根据查询模式处理请求
|
// 根据查询模式处理请求
|
||||||
switch s.config.QueryMode {
|
switch s.config.QueryMode {
|
||||||
@@ -1307,7 +1303,7 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
client.Timeout = defaultTimeout // 使用配置的超时时间
|
client.Timeout = defaultTimeout // 使用配置的超时时间
|
||||||
|
|
||||||
// 发送请求并获取响应,确保服务器地址包含端口号
|
// 发送请求并获取响应,确保服务器地址包含端口号
|
||||||
response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(server))
|
response, rtt, err := client.Exchange(query, normalizeDNSServerAddress(server))
|
||||||
responses <- serverResponse{response, rtt, server, err}
|
responses <- serverResponse{response, rtt, server, err}
|
||||||
|
|
||||||
// 将客户端实例放回池中(不重置 Timeout,因为下次使用时会重新设置)
|
// 将客户端实例放回池中(不重置 Timeout,因为下次使用时会重新设置)
|
||||||
@@ -1411,7 +1407,7 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
client.Timeout = defaultTimeout
|
client.Timeout = defaultTimeout
|
||||||
|
|
||||||
// 只向一个服务器发送请求
|
// 只向一个服务器发送请求
|
||||||
response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(fastestServer))
|
response, rtt, err := client.Exchange(query, normalizeDNSServerAddress(fastestServer))
|
||||||
|
|
||||||
// 将客户端实例放回池中
|
// 将客户端实例放回池中
|
||||||
s.clientPool.Put(client)
|
s.clientPool.Put(client)
|
||||||
@@ -1504,7 +1500,7 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
go func(server string) {
|
go func(server string) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
// 创建带有超时的resolver
|
// 创建带有超时的 resolver
|
||||||
client := &dns.Client{
|
client := &dns.Client{
|
||||||
Net: s.resolver.Net,
|
Net: s.resolver.Net,
|
||||||
UDPSize: s.resolver.UDPSize,
|
UDPSize: s.resolver.UDPSize,
|
||||||
@@ -1512,7 +1508,7 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 发送请求并获取响应,确保服务器地址包含端口号
|
// 发送请求并获取响应,确保服务器地址包含端口号
|
||||||
response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(server))
|
response, rtt, err := client.Exchange(query, normalizeDNSServerAddress(server))
|
||||||
responses <- serverResponse{response, rtt, server, err}
|
responses <- serverResponse{response, rtt, server, err}
|
||||||
}(upstream)
|
}(upstream)
|
||||||
}
|
}
|
||||||
@@ -1815,13 +1811,13 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
}, 1)
|
}, 1)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
// 创建带有超时的resolver
|
// 创建带有超时的 resolver
|
||||||
client := &dns.Client{
|
client := &dns.Client{
|
||||||
Net: s.resolver.Net,
|
Net: s.resolver.Net,
|
||||||
UDPSize: s.resolver.UDPSize,
|
UDPSize: s.resolver.UDPSize,
|
||||||
Timeout: defaultTimeout,
|
Timeout: defaultTimeout,
|
||||||
}
|
}
|
||||||
response, rtt, err := client.Exchange(r, normalizeDNSServerAddress(selectedDnssecServer))
|
response, rtt, err := client.Exchange(query, normalizeDNSServerAddress(selectedDnssecServer))
|
||||||
resultChan <- struct {
|
resultChan <- struct {
|
||||||
response *dns.Msg
|
response *dns.Msg
|
||||||
rtt time.Duration
|
rtt time.Duration
|
||||||
@@ -1924,7 +1920,7 @@ logger.Debug("并行查询超时设置", "domain", r.Question[0].Name, "defaultT
|
|||||||
UDPSize: s.resolver.UDPSize,
|
UDPSize: s.resolver.UDPSize,
|
||||||
Timeout: defaultTimeout, // 使用配置的超时时间
|
Timeout: defaultTimeout, // 使用配置的超时时间
|
||||||
}
|
}
|
||||||
resp, rtt, e := tempResolver.Exchange(r, normalizeDNSServerAddress(localServer))
|
resp, rtt, e := tempResolver.Exchange(query, normalizeDNSServerAddress(localServer))
|
||||||
resultChan <- struct {
|
resultChan <- struct {
|
||||||
response *dns.Msg
|
response *dns.Msg
|
||||||
rtt time.Duration
|
rtt time.Duration
|
||||||
|
|||||||
Reference in New Issue
Block a user