diff --git a/src/blockchain/filter.rs b/src/blockchain/filter.rs index 238091d..0fdb5d7 100644 --- a/src/blockchain/filter.rs +++ b/src/blockchain/filter.rs @@ -155,7 +155,7 @@ impl DnsFilter for BlockchainFilter { // Create DnsPacket let mut packet = DnsPacket::new(); 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.authorities.push(DnsRecord::SOA { domain: zone, diff --git a/src/dns/server.rs b/src/dns/server.rs index eb18590..aa165f1 100644 --- a/src/dns/server.rs +++ b/src/dns/server.rs @@ -61,12 +61,7 @@ pub trait DnsServer { /// Utility function for resolving domains referenced in for example CNAME or SRV /// records. This usually spares the client from having to perform additional lookups. -fn resolve_cnames( - lookup_list: &[DnsRecord], - results: &mut Vec, - resolver: &mut Box, - depth: u16, -) { +fn resolve_cnames(lookup_list: &[DnsRecord], results: &mut Vec, resolver: &mut Box, depth: u16,) { if depth > 10 { return; } @@ -78,6 +73,12 @@ fn resolve_cnames( let new_unmatched = result2.get_unresolved_cnames(); 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); } } @@ -99,6 +100,7 @@ pub fn execute_query(context: Arc, request: &DnsPacket) -> DnsPac let mut packet = DnsPacket::new(); packet.header.id = request.header.id; packet.header.recursion_available = context.allow_recursive; + packet.header.recursion_desired = request.header.recursion_desired; packet.header.response = true; if request.header.recursion_desired && !context.allow_recursive { @@ -115,6 +117,9 @@ pub fn execute_query(context: Arc, request: &DnsPacket) -> DnsPac let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) { Ok(result) => { let rescode = result.header.rescode; + if result.header.authoritative_answer { + packet.header.authoritative_answer = true; + } let unmatched = result.get_unresolved_cnames(); results.push(result);