diff --git a/Cargo.lock b/Cargo.lock index 392de0b2..359150a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,21 +26,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "anstream" version = "0.6.18" @@ -120,9 +105,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "1b1244b10dcd56c92219da4e14caa97e312079e185f04ba3eea25061561dc0a0" dependencies = [ "proc-macro2", "quote", @@ -235,12 +220,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - [[package]] name = "byteorder" version = "1.5.0" @@ -255,9 +234,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -276,18 +255,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-targets", -] - [[package]] name = "clap" version = "4.5.23" @@ -431,11 +398,10 @@ dependencies = [ [[package]] name = "defguard-gateway" -version = "1.1.2" +version = "1.1.5" dependencies = [ "axum", "base64", - "chrono", "clap", "defguard_wireguard_rs", "env_logger", @@ -457,8 +423,8 @@ dependencies = [ [[package]] name = "defguard_wireguard_rs" -version = "0.6.1" -source = "git+https://github.com/DefGuard/wireguard-rs.git?rev=v0.6.1#d2ed20e3886fe3fb03b5d51764cafdbeb792c48e" +version = "0.7.0" +source = "git+https://github.com/DefGuard/wireguard-rs.git?rev=v0.7.0#943f9ff2970d13fe139212b954232f474642b213" dependencies = [ "base64", "libc", @@ -846,29 +812,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "icu_collections" version = "1.5.0" @@ -1064,16 +1007,6 @@ dependencies = [ "libc", ] -[[package]] -name = "js-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - [[package]] name = "libc" version = "0.2.169" @@ -1200,9 +1133,9 @@ dependencies = [ [[package]] name = "netlink-packet-route" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e5bda7ca0f9ac5e75b5debac3b75e29a8ac8e2171106a2c3bb466389a8dd83" +checksum = "483325d4bfef65699214858f097d504eb812c38ce7077d165f301ec406c3066e" dependencies = [ "anyhow", "bitflags", @@ -1269,15 +1202,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - [[package]] name = "num_threads" version = "0.1.7" @@ -1385,9 +1309,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" dependencies = [ "proc-macro2", "syn", @@ -1456,9 +1380,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1620,9 +1544,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -1670,18 +1594,18 @@ checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -1788,9 +1712,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.91" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -1828,12 +1752,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2252,60 +2177,6 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - [[package]] name = "windows" version = "0.52.0" @@ -2409,9 +2280,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index d725562a..2f10e183 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,17 +1,13 @@ [package] name = "defguard-gateway" -version = "1.1.2" +version = "1.1.5" edition = "2021" [dependencies] axum = { version = "0.7", features = ["macros"] } base64 = "0.22" -chrono = { version = "0.4", default-features = false, features = [ - "clock", - "std", -] } clap = { version = "4.5", features = ["derive", "env"] } -defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.6.1" } +defguard_wireguard_rs = { git = "https://github.com/DefGuard/wireguard-rs.git", rev = "v0.7.0" } env_logger = "0.11" gethostname = "0.5" log = "0.4" diff --git a/examples/server.rs b/examples/server.rs index 60d24862..fb057ab7 100644 --- a/examples/server.rs +++ b/examples/server.rs @@ -23,7 +23,7 @@ use tonic::{transport::Server, Request, Response, Status, Streaming}; pub struct HostConfig { name: String, - address: IpAddrMask, + addresses: Vec, host: Host, } @@ -68,7 +68,11 @@ impl From<&HostConfig> for proto::Configuration { .as_ref() .map(|key| key.to_string()) .unwrap_or_default(), - address: host_config.address.to_string(), + addresses: host_config + .addresses + .iter() + .map(|addr| addr.to_string()) + .collect(), port: host_config.host.listen_port as u32, peers: host_config .host @@ -138,13 +142,16 @@ pub async fn cli(tx: Sender, clients: Arc>) { if let Some(keyword) = token_iter.next() { match keyword { "a" | "addr" => { - if let Some(address) = token_iter.next() { - if let Ok(ipaddr) = address.parse() { - tx.send_modify(|config| config.address = ipaddr); - } else { - eprintln!("Parse error"); + let mut addresses = Vec::new(); + while let Some(address) = token_iter.next() { + match address.parse() { + Ok(ipaddr) => addresses.push(ipaddr), + Err(err) => eprintln!("Skipping {address}: {err}"), } } + if !addresses.is_empty() { + tx.send_modify(|config| config.addresses = addresses); + } } "c" | "peer" => { if let Some(key) = token_iter.next() { @@ -245,13 +252,13 @@ async fn main() -> Result<(), Box> { 50505, Key::try_from("JPcD7xOfOAULx+cTdgzB3dIv6nvqqbmlACYzxrfJ4Dw=").unwrap(), ), - address: "192.168.68.68".parse().unwrap(), + addresses: vec!["192.168.68.68".parse().unwrap()], }; let (config_tx, config_rx) = watch::channel(configuration); let clients = Arc::new(Mutex::new(HashMap::new())); tokio::select! { - _ = grpc(config_rx, clients.clone()) => eprintln!("grpc completed"), - _ = cli(config_tx, clients) => eprintln!("cli completed") + _ = grpc(config_rx, clients.clone()) => eprintln!("gRPC completed"), + _ = cli(config_tx, clients) => eprintln!("CLI completed") }; Ok(()) diff --git a/proto b/proto index 19814363..6197e062 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 1981436375b14606aa304ffc1b7b517a11f00eef +Subproject commit 6197e0622fe6118bb680810d5dc75ecb289d2d72 diff --git a/src/gateway.rs b/src/gateway.rs index 2e860693..d5261841 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -1,6 +1,7 @@ use std::{ collections::HashMap, fs::read_to_string, + str::FromStr, sync::{ atomic::{AtomicBool, Ordering}, Arc, Mutex, @@ -34,7 +35,7 @@ use crate::{ }, VERSION, }; -use defguard_wireguard_rs::WireguardInterfaceApi; +use defguard_wireguard_rs::{net::IpAddrMask, WireguardInterfaceApi}; const TEN_SECS: Duration = Duration::from_secs(10); @@ -43,16 +44,22 @@ const TEN_SECS: Duration = Duration::from_secs(10); struct InterfaceConfiguration { name: String, prvkey: String, - address: String, + addresses: Vec, port: u32, } impl From for InterfaceConfiguration { fn from(config: Configuration) -> Self { + // Try to convert an array of `String`s to `IpAddrMask`, leaving out the failed ones. + let addresses = config + .addresses + .into_iter() + .filter_map(|s| IpAddrMask::from_str(&s).ok()) + .collect(); Self { name: config.name, prvkey: config.prvkey, - address: config.address, + addresses, port: config.port, } } @@ -242,8 +249,8 @@ impl Gateway { /// network and peers data. fn configure(&mut self, new_configuration: Configuration) -> Result<(), GatewayError> { debug!( - "Received configuration, reconfiguring WireGuard interface {} (address: {})", - new_configuration.name, new_configuration.address + "Received configuration, reconfiguring WireGuard interface {} (addresses: {:?})", + new_configuration.name, new_configuration.addresses ); trace!( "Received configuration: {:?}", @@ -262,8 +269,8 @@ impl Gateway { .unwrap() .configure_interface(&new_configuration.clone().into())?; info!( - "Reconfigured WireGuard interface {} (address: {})", - new_configuration.name, new_configuration.address + "Reconfigured WireGuard interface {} (addresses: {:?})", + new_configuration.name, new_configuration.addresses ); trace!( "Reconfigured WireGuard interface. Configuration: {:?}", @@ -469,7 +476,7 @@ mod tests { let old_config = InterfaceConfiguration { name: "gateway".to_string(), prvkey: "FGqcPuaSlGWC2j50TBA4jHgiefPgQQcgTNLwzKUzBS8=".to_string(), - address: "10.6.1.1/24".to_string(), + addresses: vec!["10.6.1.1/24".parse().unwrap()], port: 50051, }; @@ -517,7 +524,7 @@ mod tests { let new_config = InterfaceConfiguration { name: "gateway".to_string(), prvkey: "FGqcPuaSlGWC2j50TBA4jHgiefPgQQcgTNLwzKUzBS8=".to_string(), - address: "10.6.1.2/24".to_string(), + addresses: vec!["10.6.1.2/24".parse().unwrap()], port: 50051, }; let new_peers = old_peers.clone(); diff --git a/src/lib.rs b/src/lib.rs index a486d25f..8fef5c67 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ pub mod proto { #[macro_use] extern crate log; -use std::{process, str::FromStr, time::SystemTime}; +use std::{process::Command, str::FromStr, time::SystemTime}; use config::Config; use defguard_wireguard_rs::{host::Peer, net::IpAddrMask, InterfaceConfiguration}; @@ -49,7 +49,7 @@ pub fn execute_command(command: &str) -> Result<(), GatewayError> { let mut command_parts = command.split_whitespace(); if let Some(command) = command_parts.next() { - let output = process::Command::new(command) + let output = Command::new(command) .args(command_parts) .output() .map_err(|err| { @@ -82,10 +82,16 @@ pub fn execute_command(command: &str) -> Result<(), GatewayError> { impl From for InterfaceConfiguration { fn from(config: proto::Configuration) -> Self { let peers = config.peers.into_iter().map(Peer::from).collect(); + // Try to convert an array of `String`s to `IpAddrMask`, leaving out the failed ones. + let addresses = config + .addresses + .into_iter() + .filter_map(|s| IpAddrMask::from_str(&s).ok()) + .collect(); InterfaceConfiguration { name: config.name, prvkey: config.prvkey, - address: config.address, + addresses, port: config.port, peers, mtu: None,