diff --git a/Cargo.toml b/Cargo.toml index 5df6b93..2c82cb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,13 +28,23 @@ rayon = "1.10.0" readonly = "0.2.13" sha2 = "0.10.9" smol = "2.0.2" -tappers = "0.4.2" + [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["winsock2", "mswsock", "minwindef"] } +tappers = { version = "0.4.2", features = ["wintun"] } [target.'cfg(unix)'.dependencies] libc = "0.2" +tappers = "0.4.2" + +[target.x86_64-pc-windows-gnu] +linker = "/usr/bin/x86_64-w64-mingw32-gcc" +ar = "/usr/bin/x86_64-w64-mingw32-ar" + +[target.i686-pc-windows-gnu] +linker = "/usr/bin/i686-w64-mingw32-gcc" +ar = "/usr/bin/i686-w64-mingw32-ar" [features] diff --git a/src/client/tun.rs b/src/client/tun.rs index ff5ac30..314c1b1 100644 --- a/src/client/tun.rs +++ b/src/client/tun.rs @@ -1,9 +1,9 @@ -use std::sync::{Arc, RwLock}; - use pea_2_pea::*; use rand::RngCore; use rayon::prelude::*; use sha2::Digest; +use std::sync::{Arc, RwLock}; +use tappers::Interface; use crate::types::Network; @@ -11,15 +11,36 @@ pub fn create_tun_interface( private_ip: std::net::Ipv4Addr, if_name: Option, ) -> Result { - let mut tun_iface: tappers::Tun = tappers::Tun::new_named(tappers::Interface::new( - if_name.unwrap_or("pea0".to_owned()), + #[cfg(not(target_os = "windows"))] + let mut tun_iface: tappers::Tun = tappers::Tun::new_named(Interface::new( + &if_name.unwrap_or(DEFAULT_INTERFACE_NAME.to_owned()), )?)?; - let mut addr_req = tappers::AddAddressV4::new(private_ip); - addr_req.set_netmask(24); - let mut broadcast_addr_oct = private_ip.octets(); - broadcast_addr_oct[3] = 255; - addr_req.set_broadcast(std::net::Ipv4Addr::from(broadcast_addr_oct)); - tun_iface.add_addr(addr_req)?; + #[cfg(target_os = "windows")] + let mut tun_iface: tappers::Tun = tappers::Tun::new()?; + #[cfg(not(target_os = "windows"))] + { + let mut addr_req = tappers::AddAddressV4::new(private_ip); + addr_req.set_netmask(24); + let mut broadcast_addr_oct = private_ip.octets(); + broadcast_addr_oct[3] = 255; + addr_req.set_broadcast(std::net::Ipv4Addr::from(broadcast_addr_oct)); + tun_iface.add_addr(addr_req)?; + } + #[cfg(target_os = "windows")] + std::process::Command::new("netsh").args([ + "interface", + "ipv4", + "set", + "address", + &format!( + "name=\"{}\"", + tun_iface.name()?.name().into_string().unwrap() + ), + "static", + &private_ip.to_string(), + "255.255.255.0", + ]); + tun_iface.set_up()?; return Ok(tun_iface); } diff --git a/src/lib.rs b/src/lib.rs index e45b5ca..65c68a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,6 +15,8 @@ pub const MAPPING_SHOT_COUNT: u8 = 5; pub const DEFAULT_NETWORK_PREFIX: [u8; 3] = [172, 22, 44]; +pub const DEFAULT_INTERFACE_NAME: &str = "pea0"; + #[repr(u8)] #[allow(non_camel_case_types)] pub enum ServerMethods {