From 903a3b155001dcbc0743271ecca4a2ad53ca683f Mon Sep 17 00:00:00 2001 From: Revertron Date: Thu, 9 Sep 2021 18:18:03 +0200 Subject: [PATCH] Fixed OPT record forwarding. --- alfis.toml | 6 ++++-- src/dns/client.rs | 5 ++++- src/dns/protocol.rs | 12 +++++++++++- src/dns/server.rs | 10 +++++----- src/main.rs | 3 ++- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/alfis.toml b/alfis.toml index 1a9c021..b00d90f 100644 --- a/alfis.toml +++ b/alfis.toml @@ -23,9 +23,11 @@ listen = "127.0.0.1:53" # How many threads to spawn by DNS server threads = 50 # AdGuard DNS servers to filter ads and trackers -forwarders = ["https://dns.adguard.com/dns-query", "94.140.14.14:53", "94.140.15.15:53"] +forwarders = ["https://dns.adguard.com/dns-query"] +#forwarders = ["94.140.14.14:53", "94.140.15.15:53"] # Cloudflare servers -#forwarders = ["https://cloudflare-dns.com/dns-query", "1.1.1.1:53", "1.0.0.1:53"] +#forwarders = ["https://cloudflare-dns.com/dns-query"] +#forwarders = ["1.1.1.1:53", "1.0.0.1:53"] # Bootstrap DNS-servers to resolve domains of DoH providers bootstraps = ["9.9.9.9:53", "94.140.14.140:53"] diff --git a/src/dns/client.rs b/src/dns/client.rs index e705f4c..e877f78 100644 --- a/src/dns/client.rs +++ b/src/dns/client.rs @@ -369,7 +369,9 @@ impl HttpsDnsClient { let agent = ureq::AgentBuilder::new() .user_agent(&client_name) - .timeout(std::time::Duration::from_secs(3)) + .timeout(std::time::Duration::from_secs(5)) + .max_idle_connections_per_host(8) + .max_idle_connections(16) .resolver(move |addr: &str| { let addr = match addr.find(":") { Some(index) => addr[0..index].to_string(), @@ -468,6 +470,7 @@ impl DnsClient for HttpsDnsClient { } Err(e) => warn!("DoH error: {}", &e.to_string()) } + warn!("Lookup of {} failed", qname); Err(ClientError::LookupFailed) } } diff --git a/src/dns/protocol.rs b/src/dns/protocol.rs index f865716..d795587 100644 --- a/src/dns/protocol.rs +++ b/src/dns/protocol.rs @@ -422,7 +422,17 @@ impl DnsRecord { buffer.write_u8(*b)?; } } - DnsRecord::OPT { .. } => {} + DnsRecord::OPT { packet_len, flags, ref data } => { + buffer.write_u8(0)?; + buffer.write_u16(QueryType::OPT.to_num())?; + buffer.write_u16(packet_len)?; + buffer.write_u32(flags)?; + buffer.write_u16(data.len() as u16)?; + + for b in data.as_bytes() { + buffer.write_u8(*b)?; + } + } DnsRecord::UNKNOWN { .. } => { println!("Skipping record: {:?}", self); } diff --git a/src/dns/server.rs b/src/dns/server.rs index 1b13056..405540e 100644 --- a/src/dns/server.rs +++ b/src/dns/server.rs @@ -113,9 +113,9 @@ pub fn execute_query(context: Arc, request: &DnsPacket) -> DnsPac packet.questions.push(question.clone()); let mut resolver = context.create_resolver(Arc::clone(&context)); - let rescode = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) { + let res_code = match resolver.resolve(&question.name, question.qtype, request.header.recursion_desired) { Ok(result) => { - let rescode = result.header.rescode; + let res_code = result.header.rescode; if result.header.authoritative_answer { packet.header.authoritative_answer = true; } @@ -125,7 +125,7 @@ pub fn execute_query(context: Arc, request: &DnsPacket) -> DnsPac resolve_cnames(&unmatched, &mut results, &mut resolver, 0); - rescode + res_code } Err(err) => { error!("Failed to resolve {:?} {}: {:?}", question.qtype, question.name, err); @@ -133,7 +133,7 @@ pub fn execute_query(context: Arc, request: &DnsPacket) -> DnsPac } }; - packet.header.rescode = rescode; + packet.header.rescode = res_code; for result in results { for rec in result.answers { @@ -246,7 +246,7 @@ impl DnsServer for DnsUdpServer { Ok(x) => x, Err(err) => { if let Some(code) = err.raw_os_error() { - if code == 10004 { + if code == 10004 || code == 10093 { debug!("UDP service loop has finished"); break; } diff --git a/src/main.rs b/src/main.rs index 12fc870..167c560 100644 --- a/src/main.rs +++ b/src/main.rs @@ -229,10 +229,11 @@ fn setup_logger(opt_matches: &Matches) { .add_filter_ignore_str("mio::poll") .add_filter_ignore_str("rustls::client") .add_filter_ignore_str("ureq::") - .set_thread_level(LevelFilter::Off) + .set_thread_level(LevelFilter::Error) .set_location_level(LevelFilter::Off) .set_target_level(LevelFilter::Error) .set_time_level(LevelFilter::Error) + .set_time_format_str("%F %T%.3f") .set_time_to_local(true) .build(); match opt_matches.opt_str("l") {