checker: fix GLUE search for external domains
This commit is contained in:
parent
c7a1812c9f
commit
31f871ba67
@ -22,7 +22,10 @@ const (
|
|||||||
year68 = 1 << 31 // For RFC1982 (Serial Arithmetic) calculations in 32 bits. Taken from miekg/dns
|
year68 = 1 << 31 // For RFC1982 (Serial Arithmetic) calculations in 32 bits. Taken from miekg/dns
|
||||||
)
|
)
|
||||||
|
|
||||||
var verbose = false
|
var (
|
||||||
|
verbose = false
|
||||||
|
domainsHostingMap = map[string]string{}
|
||||||
|
)
|
||||||
|
|
||||||
// ICMP
|
// ICMP
|
||||||
|
|
||||||
@ -48,13 +51,82 @@ func check_ping(ip string, cb func(pkt *ping.Packet)) (err error) {
|
|||||||
func get_GLUE(domain string) (aaaa net.IP, err error) {
|
func get_GLUE(domain string) (aaaa net.IP, err error) {
|
||||||
client := dns.Client{Net: "tcp", Timeout: time.Second * 5}
|
client := dns.Client{Net: "tcp", Timeout: time.Second * 5}
|
||||||
|
|
||||||
|
dnssrv := "[2a01:e0a:2b:2250::b]:53"
|
||||||
|
if strings.HasSuffix(domain, adlin.DelegatedDomainSuffix) {
|
||||||
|
dnssrv = "[2a01:e0a:2b:2250::b]:53"
|
||||||
|
} else if v, ok := domainsHostingMap[domain]; ok {
|
||||||
|
dnssrv = v
|
||||||
|
} else {
|
||||||
|
// Looking for root NS
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.SetQuestion(".", dns.TypeNS)
|
||||||
|
m.RecursionDesired = false
|
||||||
|
m.SetEdns0(4096, true)
|
||||||
|
|
||||||
|
var r *dns.Msg
|
||||||
|
r, _, err = client.Exchange(m, dnssrv)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if r == nil {
|
||||||
|
return nil, errors.New("response is nil during initial recursion")
|
||||||
|
}
|
||||||
|
if r.Rcode != dns.RcodeSuccess {
|
||||||
|
return nil, errors.New("failed to get a valid answer during initial recursion")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, answer := range r.Answer {
|
||||||
|
if t, ok := answer.(*dns.NS); ok {
|
||||||
|
dnssrv = t.Ns + ":53"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Do casual recursion
|
||||||
|
i := 0
|
||||||
|
recursion:
|
||||||
|
for i = 0; i < 10; i++ {
|
||||||
m := new(dns.Msg)
|
m := new(dns.Msg)
|
||||||
m.SetQuestion(domain, dns.TypeNS)
|
m.SetQuestion(domain, dns.TypeNS)
|
||||||
m.RecursionDesired = false
|
m.RecursionDesired = false
|
||||||
m.SetEdns0(4096, true)
|
m.SetEdns0(4096, true)
|
||||||
|
|
||||||
var r *dns.Msg
|
var r *dns.Msg
|
||||||
r, _, err = client.Exchange(m, "[2a01:e0a:2b:2250::b]:53")
|
r, _, err = client.Exchange(m, dnssrv)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if r == nil {
|
||||||
|
return nil, errors.New("response is nil during recursion")
|
||||||
|
}
|
||||||
|
if r.Rcode != dns.RcodeSuccess {
|
||||||
|
return nil, errors.New("failed to get a valid answer during recursion")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, answer := range r.Ns {
|
||||||
|
if t, ok := answer.(*dns.NS); ok {
|
||||||
|
dnssrv = t.Ns + ":53"
|
||||||
|
if t.Header().Name == domain {
|
||||||
|
break recursion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i >= 10 {
|
||||||
|
return nil, fmt.Errorf("too much name recursions")
|
||||||
|
} else {
|
||||||
|
domainsHostingMap[domain] = dnssrv
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.SetQuestion(domain, dns.TypeNS)
|
||||||
|
m.RecursionDesired = false
|
||||||
|
m.SetEdns0(4096, true)
|
||||||
|
|
||||||
|
var r *dns.Msg
|
||||||
|
r, _, err = client.Exchange(m, dnssrv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user