Skip to content

Commit 4e73fe1

Browse files
authored
Disable routing flag for wireguard mode (#487)
1 parent 4a51efa commit 4e73fe1

File tree

1 file changed

+45
-23
lines changed

1 file changed

+45
-23
lines changed

nym-vpn-core/nym-vpn-lib/src/tunnel_setup.rs

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
init_wireguard_config, MixnetExitConnectionInfo, MixnetVpn, SpecificVpn, WireguardVpn,
1212
};
1313
use crate::{routing, MixnetConnectionInfo, NymVpn};
14-
use futures::channel::oneshot;
14+
use futures::channel::{mpsc, oneshot};
1515
use futures::StreamExt;
1616
use ipnetwork::IpNetwork;
1717
use log::*;
@@ -23,7 +23,7 @@ use rand::rngs::OsRng;
2323
use talpid_core::dns::DnsMonitor;
2424
use talpid_core::firewall::Firewall;
2525
use talpid_routing::RouteManager;
26-
use talpid_tunnel::TunnelEvent;
26+
use talpid_tunnel::{TunnelEvent, TunnelMetadata};
2727
use tap::TapFallible;
2828

2929
pub struct TunnelSetup<T: TunnelSpecifcSetup> {
@@ -108,6 +108,24 @@ async fn init_firewall_dns(
108108
}
109109
}
110110

111+
async fn wait_interface_up(
112+
mut event_rx: mpsc::UnboundedReceiver<(TunnelEvent, oneshot::Sender<()>)>,
113+
) -> Result<TunnelMetadata> {
114+
loop {
115+
match event_rx.next().await {
116+
Some((TunnelEvent::InterfaceUp(_, _), _)) => {
117+
continue;
118+
}
119+
Some((TunnelEvent::Up(metadata), _)) => {
120+
break Ok(metadata);
121+
}
122+
Some((TunnelEvent::AuthFailed(_), _)) | Some((TunnelEvent::Down, _)) | None => {
123+
return Err(Error::BadWireguardEvent);
124+
}
125+
}
126+
}
127+
}
128+
111129
async fn setup_wg_tunnel(
112130
nym_vpn: &mut NymVpn<WireguardVpn>,
113131
route_manager: RouteManager,
@@ -153,12 +171,17 @@ async fn setup_wg_tunnel(
153171
.collect::<Vec<_>>(),
154172
);
155173
});
156-
exit_wireguard_config.0.peers.iter_mut().for_each(|peer| {
157-
peer.allowed_ips
158-
.append(&mut replace_default_prefixes(catch_all_ipv4()));
159-
peer.allowed_ips
160-
.append(&mut replace_default_prefixes(catch_all_ipv6()));
161-
});
174+
// If routing is disabled, we don't append the catch all routing rules
175+
if !nym_vpn.disable_routing {
176+
exit_wireguard_config.0.peers.iter_mut().for_each(|peer| {
177+
peer.allowed_ips
178+
.append(&mut replace_default_prefixes(catch_all_ipv4()));
179+
peer.allowed_ips
180+
.append(&mut replace_default_prefixes(catch_all_ipv6()));
181+
});
182+
} else {
183+
info!("Routing is disabled, skipping adding routes");
184+
}
162185
info!("Entry wireguard config: \n{entry_wireguard_config}");
163186
info!("Exit wireguard config: \n{exit_wireguard_config}");
164187
let (firewall, dns_monitor) = init_firewall_dns(
@@ -167,33 +190,32 @@ async fn setup_wg_tunnel(
167190
)
168191
.await?;
169192
std::env::set_var("TALPID_FORCE_USERSPACE_WIREGUARD", "1");
170-
let (wireguard_waiting_entry, mut event_rx) = create_wireguard_tunnel(
193+
let (wireguard_waiting_entry, event_rx) = create_wireguard_tunnel(
171194
&route_manager,
172195
nym_vpn.tun_provider.clone(),
173196
entry_wireguard_config,
174197
)
175198
.await?;
176199
// Wait for entry gateway routes to be finished before moving to exit gateway routes, as the two might race if
177200
// started one after the other
178-
loop {
179-
match event_rx.next().await {
180-
Some((TunnelEvent::InterfaceUp(_, _), _)) => {
181-
continue;
182-
}
183-
Some((TunnelEvent::Up(_), _)) => {
184-
break;
185-
}
186-
Some((TunnelEvent::AuthFailed(_), _)) | Some((TunnelEvent::Down, _)) | None => {
187-
return Err(Error::BadWireguardEvent);
188-
}
189-
}
190-
}
191-
let (wireguard_waiting_exit, _) = create_wireguard_tunnel(
201+
let metadata = wait_interface_up(event_rx).await?;
202+
info!(
203+
"Created entry tun device {device_name} with ip={device_ip:?}",
204+
device_name = metadata.interface,
205+
device_ip = metadata.ips
206+
);
207+
let (wireguard_waiting_exit, event_rx) = create_wireguard_tunnel(
192208
&route_manager,
193209
nym_vpn.tun_provider.clone(),
194210
exit_wireguard_config,
195211
)
196212
.await?;
213+
let metadata = wait_interface_up(event_rx).await?;
214+
info!(
215+
"Created exit tun device {device_name} with ip={device_ip:?}",
216+
device_name = metadata.interface,
217+
device_ip = metadata.ips
218+
);
197219
let entry = TunnelSetup {
198220
specific_setup: wireguard_waiting_entry,
199221
};

0 commit comments

Comments
 (0)