Implemented hosts-file support. You can resolve local names or block ads on DNS level!

This commit is contained in:
Revertron
2021-04-01 20:59:52 +02:00
parent 9b3bd780a1
commit 882d826c26
7 changed files with 3724 additions and 3 deletions
+21
View File
@@ -1,4 +1,5 @@
use std::sync::{Arc, Mutex};
use std::env;
use crate::{Context, Settings};
use crate::blockchain::filter::BlockchainFilter;
@@ -6,6 +7,7 @@ use crate::dns::server::{DnsServer, DnsUdpServer, DnsTcpServer};
use crate::dns::context::{ServerContext, ResolveStrategy};
#[allow(unused_imports)]
use log::{debug, error, info, LevelFilter, trace, warn};
use crate::dns::hosts::HostsFilter;
/// Starts UDP and TCP DNS-servers
pub fn start_dns_server(context: &Arc<Mutex<Context>>, settings: &Settings) {
@@ -35,6 +37,25 @@ fn create_server_context(context: Arc<Mutex<Context>>, settings: &Settings) -> A
true => { ResolveStrategy::Recursive }
false => { ResolveStrategy::Forward { upstreams: settings.dns.forwarders.clone() } }
};
// Add host filters
for host in &settings.dns.hosts {
if host == "system" {
if cfg!(target_os = "windows") {
if let Ok(root) = env::var("SYSTEMROOT") {
let filename = format!("{}{}", &root, "\\System32\\drivers\\etc\\hosts");
info!("Loading hosts from '{}'", &filename);
server_context.filters.push(Box::new(HostsFilter::new(&filename)));
}
} else {
let filename = "/etc/hosts";
info!("Loading hosts from '{}'", filename);
server_context.filters.push(Box::new(HostsFilter::new(filename)));
}
} else {
info!("Loading hosts from '{}'", &host);
server_context.filters.push(Box::new(HostsFilter::new(host)));
}
}
server_context.filters.push(Box::new(BlockchainFilter::new(context)));
match server_context.initialize() {
Ok(_) => {}