Skip to content

Commit

Permalink
Disable DNS redirect when custom DNS is set to localhost
Browse files Browse the repository at this point in the history
  • Loading branch information
dlon committed Oct 18, 2024
1 parent 9fa4a82 commit 5532f1f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 5 deletions.
13 changes: 13 additions & 0 deletions talpid-core/src/dns/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,19 @@ impl ResolvedDnsConfig {
pub fn addresses(self) -> impl Iterator<Item = IpAddr> {
self.non_tunnel_config.into_iter().chain(self.tunnel_config)
}

/// Return whether the config contains only (and at least one) loopback addresses, and zero
/// non-loopback addresses
pub fn is_loopback(&self) -> bool {
let (loopback_addrs, non_loopback_addrs) = self
.tunnel_config
.iter()
.chain(self.non_tunnel_config.iter())
.copied()
.partition::<Vec<_>, _>(|ip| ip.is_loopback());

!loopback_addrs.is_empty() && non_loopback_addrs.is_empty()
}
}

/// Sets and monitors system DNS settings. Makes sure the desired DNS servers are being used.
Expand Down
1 change: 1 addition & 0 deletions talpid-core/src/firewall/macos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ impl Firewall {
policy: &FirewallPolicy,
) -> Result<Vec<pfctl::RedirectRule>> {
let redirect_rules = match policy {
FirewallPolicy::Connected { dns_config, .. } if dns_config.is_loopback() => vec![],
FirewallPolicy::Blocked {
dns_redirect_port, ..
}
Expand Down
14 changes: 9 additions & 5 deletions talpid-core/src/tunnel_state_machine/connected_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,15 @@ impl ConnectedState {

// On macOS, configure only the local DNS resolver
#[cfg(target_os = "macos")]
shared_values.runtime.block_on(
shared_values
.filtering_resolver
.enable_forward(dns_config.addresses().collect()),
);
if !dns_config.is_loopback() {
shared_values.runtime.block_on(
shared_values
.filtering_resolver
.enable_forward(dns_config.addresses().collect()),
);
} else {
log::debug!("Not enabling DNS forwarding since loopback is used");
}

Ok(())
}
Expand Down

0 comments on commit 5532f1f

Please sign in to comment.