Very important DNS resolver fix.

This commit is contained in:
Revertron
2021-03-30 20:50:20 +02:00
parent 7e4e905e86
commit a4ecb1f0f7
2 changed files with 12 additions and 7 deletions
+1 -1
View File
@@ -155,7 +155,7 @@ impl DnsFilter for BlockchainFilter {
// Create DnsPacket // Create DnsPacket
let mut packet = DnsPacket::new(); let mut packet = DnsPacket::new();
packet.header.authoritative_answer = true; packet.header.authoritative_answer = true;
packet.header.rescode = ResultCode::NXDOMAIN; packet.header.rescode = ResultCode::NOERROR;
packet.questions.push(DnsQuestion::new(String::from(qname), qtype)); packet.questions.push(DnsQuestion::new(String::from(qname), qtype));
packet.authorities.push(DnsRecord::SOA { packet.authorities.push(DnsRecord::SOA {
domain: zone, domain: zone,
+11 -6
View File
@@ -61,12 +61,7 @@ pub trait DnsServer {
/// Utility function for resolving domains referenced in for example CNAME or SRV /// Utility function for resolving domains referenced in for example CNAME or SRV
/// records. This usually spares the client from having to perform additional lookups. /// records. This usually spares the client from having to perform additional lookups.
fn resolve_cnames( fn resolve_cnames(lookup_list: &[DnsRecord], results: &mut Vec<DnsPacket>, resolver: &mut Box<dyn DnsResolver>, depth: u16,) {
lookup_list: &[DnsRecord],
results: &mut Vec<DnsPacket>,
resolver: &mut Box<dyn DnsResolver>,
depth: u16,
) {
if depth > 10 { if depth > 10 {
return; return;
} }
@@ -78,6 +73,12 @@ fn resolve_cnames(
let new_unmatched = result2.get_unresolved_cnames(); let new_unmatched = result2.get_unresolved_cnames();
results.push(result2); results.push(result2);
resolve_cnames(&new_unmatched, results, resolver, depth + 1);
}
if let Ok(result2) = resolver.resolve(host, QueryType::AAAA, true) {
let new_unmatched = result2.get_unresolved_cnames();
results.push(result2);
resolve_cnames(&new_unmatched, results, resolver, depth + 1); resolve_cnames(&new_unmatched, results, resolver, depth + 1);
} }
} }
@@ -99,6 +100,7 @@ pub fn execute_query(context: Arc<ServerContext>, request: &DnsPacket) -> DnsPac
let mut packet = DnsPacket::new(); let mut packet = DnsPacket::new();
packet.header.id = request.header.id; packet.header.id = request.header.id;
packet.header.recursion_available = context.allow_recursive; packet.header.recursion_available = context.allow_recursive;
packet.header.recursion_desired = request.header.recursion_desired;
packet.header.response = true; packet.header.response = true;
if request.header.recursion_desired && !context.allow_recursive { if request.header.recursion_desired && !context.allow_recursive {
@@ -115,6 +117,9 @@ pub fn execute_query(context: Arc<ServerContext>, request: &DnsPacket) -> DnsPac
let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) { let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) {
Ok(result) => { Ok(result) => {
let rescode = result.header.rescode; let rescode = result.header.rescode;
if result.header.authoritative_answer {
packet.header.authoritative_answer = true;
}
let unmatched = result.get_unresolved_cnames(); let unmatched = result.get_unresolved_cnames();
results.push(result); results.push(result);