|
|
|
|
@@ -13,7 +13,7 @@ import (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
queryTimeoutDuration = 5 * time.Second
|
|
|
|
|
queryTimeoutDuration = 700 * time.Millisecond
|
|
|
|
|
maxRetries = 2
|
|
|
|
|
maxDelegation = 20
|
|
|
|
|
timeoutMultiplier = 2
|
|
|
|
|
@@ -291,8 +291,17 @@ func (r *Resolver) resolveNSIPs(
|
|
|
|
|
return ips
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// resolveNSRecursive queries for NS records using recursive
|
|
|
|
|
// resolution as a fallback for intercepted environments.
|
|
|
|
|
// publicResolvers returns well-known public recursive DNS resolvers.
|
|
|
|
|
func publicResolvers() []string {
|
|
|
|
|
return []string{
|
|
|
|
|
"1.1.1.1", // Cloudflare
|
|
|
|
|
"8.8.8.8", // Google
|
|
|
|
|
"9.9.9.9", // Quad9
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// resolveNSRecursive queries for NS records using a public
|
|
|
|
|
// recursive resolver as a fallback for intercepted environments.
|
|
|
|
|
func (r *Resolver) resolveNSRecursive(
|
|
|
|
|
ctx context.Context,
|
|
|
|
|
domain string,
|
|
|
|
|
@@ -302,7 +311,7 @@ func (r *Resolver) resolveNSRecursive(
|
|
|
|
|
msg.SetQuestion(domain, dns.TypeNS)
|
|
|
|
|
msg.RecursionDesired = true
|
|
|
|
|
|
|
|
|
|
for _, ip := range rootServerList()[:3] {
|
|
|
|
|
for _, ip := range publicResolvers() {
|
|
|
|
|
if checkCtx(ctx) != nil {
|
|
|
|
|
return nil, ErrContextCanceled
|
|
|
|
|
}
|
|
|
|
|
@@ -323,7 +332,8 @@ func (r *Resolver) resolveNSRecursive(
|
|
|
|
|
return nil, ErrNoNameservers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// resolveARecord resolves a hostname to IPv4 addresses.
|
|
|
|
|
// resolveARecord resolves a hostname to IPv4 addresses using
|
|
|
|
|
// public recursive resolvers.
|
|
|
|
|
func (r *Resolver) resolveARecord(
|
|
|
|
|
ctx context.Context,
|
|
|
|
|
hostname string,
|
|
|
|
|
@@ -333,7 +343,7 @@ func (r *Resolver) resolveARecord(
|
|
|
|
|
msg.SetQuestion(hostname, dns.TypeA)
|
|
|
|
|
msg.RecursionDesired = true
|
|
|
|
|
|
|
|
|
|
for _, ip := range rootServerList()[:3] {
|
|
|
|
|
for _, ip := range publicResolvers() {
|
|
|
|
|
if checkCtx(ctx) != nil {
|
|
|
|
|
return nil, ErrContextCanceled
|
|
|
|
|
}
|
|
|
|
|
|