summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2022-03-28 14:22:18 +0200
committerDavid Lönnhager <david.l@mullvad.net>2022-03-28 14:22:18 +0200
commit077a1f91b738195ec15731bb5cb8ec9608b66db2 (patch)
treed53690ab319c285655e48c4473ab98018d7c59ac
parentd701d5389115da2665d549c6af4798f3570d7eb4 (diff)
parent4cbea9153fdda45407015a183a3e8a805e1dcf95 (diff)
downloadmullvadvpn-077a1f91b738195ec15731bb5cb8ec9608b66db2.tar.xz
mullvadvpn-077a1f91b738195ec15731bb5cb8ec9608b66db2.zip
Merge branch 'fix-default-route-filter'
-rw-r--r--talpid-core/src/tunnel/wireguard/mod.rs29
1 files changed, 16 insertions, 13 deletions
diff --git a/talpid-core/src/tunnel/wireguard/mod.rs b/talpid-core/src/tunnel/wireguard/mod.rs
index 59098a00ca..817ad74eea 100644
--- a/talpid-core/src/tunnel/wireguard/mod.rs
+++ b/talpid-core/src/tunnel/wireguard/mod.rs
@@ -413,7 +413,7 @@ impl WireguardMonitor {
#[cfg(not(windows))]
tun_provider,
#[cfg(not(windows))]
- Self::get_tunnel_destinations(config),
+ Self::get_tunnel_destinations(config).flat_map(Self::replace_default_prefixes),
#[cfg(windows)]
setup_done_tx,
)
@@ -536,6 +536,7 @@ impl WireguardMonitor {
let (node_v4, node_v6) = Self::get_tunnel_nodes(iface_name, config);
Self::get_tunnel_destinations(config)
.filter(|allowed_ip| allowed_ip.prefix() == 0)
+ .flat_map(Self::replace_default_prefixes)
.map(move |allowed_ip| {
if allowed_ip.is_ipv4() {
RequiredRoute::new(allowed_ip, node_v4.clone())
@@ -547,26 +548,28 @@ impl WireguardMonitor {
/// Return routes for all allowed IPs.
fn get_tunnel_destinations(config: &Config) -> impl Iterator<Item = ipnetwork::IpNetwork> + '_ {
- let routes = config
+ config
.peers
.iter()
.flat_map(|peer| peer.allowed_ips.iter())
- .cloned();
+ .cloned()
+ }
+ /// Replace default (0-prefix) routes with more specific routes.
+ fn replace_default_prefixes(network: ipnetwork::IpNetwork) -> Vec<ipnetwork::IpNetwork> {
#[cfg(not(target_os = "linux"))]
- let routes = routes.flat_map(|allowed_ip| {
- if allowed_ip.prefix() == 0 {
- if allowed_ip.is_ipv4() {
- vec!["0.0.0.0/1".parse().unwrap(), "128.0.0.0/1".parse().unwrap()]
- } else {
- vec!["8000::/1".parse().unwrap(), "::/1".parse().unwrap()]
- }
+ if network.prefix() == 0 {
+ if network.is_ipv4() {
+ vec!["0.0.0.0/1".parse().unwrap(), "128.0.0.0/1".parse().unwrap()]
} else {
- vec![allowed_ip]
+ vec!["8000::/1".parse().unwrap(), "::/1".parse().unwrap()]
}
- });
+ } else {
+ vec![network]
+ }
- routes
+ #[cfg(target_os = "linux")]
+ vec![network]
}
fn tunnel_metadata(interface_name: &str, config: &Config) -> TunnelMetadata {