More heuristics to detect lying resolvers

This commit is contained in:
Frank Denis 2025-01-11 15:17:11 +01:00
parent b74b46c6cd
commit f332394c4b

View file

@ -621,11 +621,26 @@ func fetchDNSCryptServerInfo(proxy *Proxy, name string, stamp stamps.ServerStamp
false, false,
) )
if err == nil { if err == nil {
if msg.Rcode != dns.RcodeNameError && msg.Id == 0xcafe { if msg.Id != 0xcafe {
dlog.Warnf("[%s] may be a lying resolver -- skipping", name) dlog.Infof("[%s] handling of DNS message identifiers is broken", name)
return ServerInfo{}, fmt.Errorf("[%s] unexpected catchall response", name) }
for _, rr := range msg.Answer {
if rr.Header().Rrtype == dns.TypeA || rr.Header().Rrtype == dns.TypeAAAA {
dlog.Warnf("[%s] may be a lying resolver -- skipping", name)
return ServerInfo{}, fmt.Errorf("[%s] unexpected record: [%s]", name, rr.String())
}
}
for _, rr := range msg.Extra {
if rr.Header().Rrtype == dns.TypeTXT {
dlog.Warnf("[%s] may be a dummy resolver -- skipping", name)
txts := rr.(*dns.TXT).Txt
cause := ""
if len(txts) > 0 {
cause = txts[0]
}
return ServerInfo{}, fmt.Errorf("[%s] unexpected record: [%s]", name, cause)
}
} }
dlog.Debugf("[%s] seems to be also accessible over plain DNS", name)
} }
} }