diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2023-11-15 17:21:01 +0100 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2023-11-16 17:04:39 +0100 |
| commit | 04d0d6a66098560fc4e53d9a2c1c34ead2c4914f (patch) | |
| tree | 2e9a9839e946fcbdeabc47f90a6ce06fc4b3b4ec | |
| parent | f82bb8c11187245a5770514a503592201374b2dc (diff) | |
| download | mullvadvpn-04d0d6a66098560fc4e53d9a2c1c34ead2c4914f.tar.xz mullvadvpn-04d0d6a66098560fc4e53d9a2c1c34ead2c4914f.zip | |
Let relay selector pick entry & exit nodes in `test_bridge`
We have seen `test_bridge` fail due to high latency if slow + far-away
servers were selected. Hopefully delegating the task of picking
appropriate entry & exit relays will help mitigate this.
| -rw-r--r-- | test/test-manager/src/tests/helpers.rs | 19 | ||||
| -rw-r--r-- | test/test-manager/src/tests/tunnel.rs | 94 |
2 files changed, 45 insertions, 68 deletions
diff --git a/test/test-manager/src/tests/helpers.rs b/test/test-manager/src/tests/helpers.rs index 74b07de44e..ea876bbbbe 100644 --- a/test/test-manager/src/tests/helpers.rs +++ b/test/test-manager/src/tests/helpers.rs @@ -449,25 +449,6 @@ pub fn unreachable_wireguard_tunnel() -> talpid_types::net::wireguard::Connectio } } -/// Find a relay from the daemon's relay list that matches `critera`. -/// -/// * `mullvad_client` - An interface to the Mullvad daemon. -/// * `critera` - A function used to determine which relays to include in random selection. -pub async fn relay<Filter>( - mullvad_client: &mut ManagementServiceClient, - criteria: Filter, -) -> Result<Relay, Error> -where - Filter: Fn(&Relay) -> bool, -{ - filter_relays(mullvad_client, criteria) - .await? - .pop() - .ok_or(Error::Other( - "No mathing bridge was found in the relay list".to_string(), - )) -} - /// Randomly select an entry and exit node from the daemon's relay list. /// The exit node is distinct from the entry node. /// diff --git a/test/test-manager/src/tests/tunnel.rs b/test/test-manager/src/tests/tunnel.rs index bedba2752f..1f1d61670e 100644 --- a/test/test-manager/src/tests/tunnel.rs +++ b/test/test-manager/src/tests/tunnel.rs @@ -202,27 +202,9 @@ pub async fn test_bridge( rpc: ServiceClient, mut mullvad_client: ManagementServiceClient, ) -> Result<(), Error> { - let entry = helpers::relay(&mut mullvad_client, |bridge| { - bridge.active && matches!(bridge.endpoint_data, RelayEndpointData::Bridge) - }) - .await?; - let exit = helpers::relay(&mut mullvad_client, |relay| { - relay.active && matches!(relay.endpoint_data, RelayEndpointData::Openvpn) - }) - .await?; - - log::info!( - "Selected entry bridge {entry}:{entry_ip} & exit relay {exit}:{exit_ip}", - entry = entry.hostname, - entry_ip = entry.ipv4_addr_in.to_string(), - exit = exit.hostname, - exit_ip = exit.ipv4_addr_in.to_string() - ); - // // Enable bridge mode // - log::info!("Updating bridge settings"); mullvad_client @@ -230,24 +212,22 @@ pub async fn test_bridge( .await .expect("failed to enable bridge mode"); - let bridge_settings = BridgeSettings::Normal(BridgeConstraints { - location: helpers::into_constraint(&entry), - ..Default::default() - }); - - set_bridge_settings(&mut mullvad_client, bridge_settings) - .await - .expect("failed to update bridge settings"); - - let relay_settings = RelaySettings::Normal(RelayConstraints { - location: helpers::into_constraint(&exit), - tunnel_protocol: Constraint::Only(TunnelType::OpenVpn), - ..Default::default() - }); + set_bridge_settings( + &mut mullvad_client, + BridgeSettings::Normal(BridgeConstraints::default()), + ) + .await + .expect("failed to update bridge settings"); - set_relay_settings(&mut mullvad_client, relay_settings) - .await - .expect("failed to update relay settings"); + set_relay_settings( + &mut mullvad_client, + RelaySettings::Normal(RelayConstraints { + tunnel_protocol: Constraint::Only(TunnelType::OpenVpn), + ..Default::default() + }), + ) + .await + .expect("failed to update relay settings"); // // Connect to VPN @@ -255,37 +235,53 @@ pub async fn test_bridge( log::info!("Connect to OpenVPN relay via bridge"); + connect_and_wait(&mut mullvad_client) + .await + .expect("connect_and_wait"); + + let tunnel = helpers::get_tunnel_state(&mut mullvad_client).await; + let (entry, exit) = match tunnel { + mullvad_types::states::TunnelState::Connected { endpoint, .. } => { + (endpoint.proxy.unwrap().endpoint, endpoint.endpoint) + } + _ => return Err(Error::DaemonError("daemon entered error state".to_string())), + }; + + log::info!( + "Selected entry bridge {entry_ip} & exit relay {exit_ip}", + entry_ip = entry.address.ip().to_string(), + exit_ip = exit.address.ip().to_string() + ); + + // Start recording outgoing packets. Their destination will be verified + // against the bridge's IP address later. let monitor = start_packet_monitor( - move |packet| packet.destination.ip() == entry.ipv4_addr_in, + move |packet| packet.destination.ip() == entry.address.ip(), MonitorOptions::default(), ) .await; - connect_and_wait(&mut mullvad_client) - .await - .expect("connect_and_wait"); - // - // Verify entry IP + // Verify exit IP // - log::info!("Verifying entry server"); + log::info!("Verifying exit server"); - let monitor_result = monitor.into_result().await.unwrap(); assert!( - !monitor_result.packets.is_empty(), - "detected no traffic to entry server", + helpers::using_mullvad_exit(&rpc).await, + "expected Mullvad exit IP" ); // - // Verify exit IP + // Verify entry IP // - log::info!("Verifying exit server"); + log::info!("Verifying entry server"); + let monitor_result = monitor.into_result().await.unwrap(); assert!( - helpers::using_mullvad_exit(&rpc).await, - "expected Mullvad exit IP" + !monitor_result.packets.is_empty(), + "detected no traffic to entry server", ); disconnect_and_wait(&mut mullvad_client).await?; |
