diff --git a/switch/win-tun-tap/Cargo.toml b/switch/win-tun-tap/Cargo.toml index 93f1e07..b79742f 100644 --- a/switch/win-tun-tap/Cargo.toml +++ b/switch/win-tun-tap/Cargo.toml @@ -13,7 +13,7 @@ libloading = "0.7" widestring = "0.4" once_cell = "1.8" itertools = "0.10.1" - +rand = "0.8.5" [dependencies.winapi] version = "0.3" features = [ diff --git a/switch/win-tun-tap/src/lib.rs b/switch/win-tun-tap/src/lib.rs index f8b69d1..c8b475d 100644 --- a/switch/win-tun-tap/src/lib.rs +++ b/switch/win-tun-tap/src/lib.rs @@ -5,8 +5,8 @@ mod tun; mod ffi; mod netsh; mod route; - use std::{io, net}; +use std::net::Ipv4Addr; pub use tap::TapDevice; pub use tun::*; @@ -23,7 +23,7 @@ fn decode_utf16(string: &[u16]) -> String { } pub trait IFace { - fn shutdown(&self)->io::Result<()>; + fn shutdown(&self) -> io::Result<()>; /// 获取接口索引 fn get_index(&self) -> io::Result; /// 获取名称 @@ -31,18 +31,15 @@ pub trait IFace { /// 设置名称 fn set_name(&self, new_name: &str) -> io::Result<()>; /// 设置ip - fn set_ip(&self, address: IP, mask: IP) -> io::Result<()> - where IP: Into; + fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()>; /// 设置路由 - fn add_route(&self, dest: IP, - netmask: IP, - gateway: IP, ) -> io::Result<()> - where IP: Into; + fn add_route(&self, dest: Ipv4Addr, + netmask: Ipv4Addr, + gateway: Ipv4Addr, metric: u16) -> io::Result<()>; /// 删除路由 - fn delete_route(&self, dest: IP, - netmask: IP, - gateway: IP, ) -> io::Result<()> - where IP: Into; + fn delete_route(&self, dest: Ipv4Addr, + netmask: Ipv4Addr, + gateway: Ipv4Addr, ) -> io::Result<()>; /// 设置最大传输单元 fn set_mtu(&self, mtu: u16) -> io::Result<()>; /// 设置跃点 diff --git a/switch/win-tun-tap/src/route.rs b/switch/win-tun-tap/src/route.rs index 3564f87..9cb0c33 100644 --- a/switch/win-tun-tap/src/route.rs +++ b/switch/win-tun-tap/src/route.rs @@ -4,10 +4,10 @@ use std::net::Ipv4Addr; /// 添加路由 pub fn add_route(index: u32, dest: Ipv4Addr, netmask: Ipv4Addr, - gateway: Ipv4Addr, ) -> io::Result<()> { + gateway: Ipv4Addr, metric: u16) -> io::Result<()> { let set_route = format!( - "route add {:?} mask {:?} {:?} if {}", - dest, netmask, gateway, index + "route add {:?} mask {:?} {:?} metric {} if {}", + dest, netmask, gateway, metric, index ); // 执行添加路由命令 let out = std::process::Command::new("cmd") @@ -23,7 +23,7 @@ pub fn add_route(index: u32, dest: Ipv4Addr, } /// 删除路由 -pub fn delete_route(index: u32, dest: Ipv4Addr,netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> { +pub fn delete_route(index: u32, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> { if index == 0 { return Err(io::Error::new(io::ErrorKind::Other, format!("网络接口索引错误: {:?}", index))); } diff --git a/switch/win-tun-tap/src/tap/mod.rs b/switch/win-tun-tap/src/tap/mod.rs index 27b05f2..5b5597a 100644 --- a/switch/win-tun-tap/src/tap/mod.rs +++ b/switch/win-tun-tap/src/tap/mod.rs @@ -135,19 +135,19 @@ impl IFace for TapDevice { netsh::set_interface_name(&name, new_name) } - fn set_ip(&self, address: IP, mask: IP) -> io::Result<()> where IP: Into { + fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()> { let index = self.get_index()?; - netsh::set_interface_ip(index, &address.into(), &mask.into()) + netsh::set_interface_ip(index, &address, &mask) } - fn add_route(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into { + fn add_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr, metric: u16) -> io::Result<()> { let index = self.get_index()?; - route::add_route(index, dest.into(), netmask.into(), gateway.into()) + route::add_route(index, dest, netmask, gateway,metric) } - fn delete_route(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into { + fn delete_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> { let index = self.get_index()?; - route::delete_route(index, dest.into(), netmask.into(), gateway.into()) + route::delete_route(index, dest, netmask, gateway) } fn set_mtu(&self, mtu: u16) -> io::Result<()> { diff --git a/switch/win-tun-tap/src/tun/mod.rs b/switch/win-tun-tap/src/tun/mod.rs index f6f03e6..4dbdf5a 100644 --- a/switch/win-tun-tap/src/tun/mod.rs +++ b/switch/win-tun-tap/src/tun/mod.rs @@ -4,7 +4,7 @@ use std::net::Ipv4Addr; use winapi::um::{handleapi, synchapi, winbase, winnt}; use crate::{decode_utf16, encode_utf16, ffi, IFace, netsh, route}; - +use rand::Rng; mod wintun_raw; mod log; pub mod packet; @@ -20,7 +20,7 @@ pub const MAX_POOL: usize = 256; pub struct TunDevice { - pub(crate) luid:u64, + pub(crate) luid: u64, pub(crate) index: u32, /// The session handle given to us by WintunStartSession pub(crate) session: wintun_raw::WINTUN_SESSION_HANDLE, @@ -44,11 +44,7 @@ pub struct TunDevice { unsafe impl Send for TunDevice {} unsafe impl Sync for TunDevice {} -winapi::DEFINE_GUID! { - GUID_NETWORK_ADAPTER, - 0x4d36e972, 0xe325, 0x11ce, - 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 -} + impl TunDevice { pub unsafe fn create(library: L, pool: &str, name: &str) -> io::Result where L: Into, { @@ -66,9 +62,13 @@ impl TunDevice { if name_utf16.len() > MAX_POOL { return Err(io::Error::new(io::ErrorKind::Other, format!("长度大于{}:{:?}", MAX_POOL, pool))); } + let mut guid_bytes: [u8; 16] = [0u8; 16]; + rand::thread_rng().fill(&mut guid_bytes); + let guid = u128::from_ne_bytes(guid_bytes); //SAFETY: guid is a unique integer so transmuting either all zeroes or the user's preferred //guid to the winapi guid type is safe and will allow the windows kernel to see our GUID - let guid_struct: wintun_raw::GUID = unsafe { std::mem::transmute(GUID_NETWORK_ADAPTER) }; + + let guid_struct: wintun_raw::GUID = unsafe { std::mem::transmute(guid) }; let guid_ptr = &guid_struct as *const wintun_raw::GUID; log::set_default_logger_if_unset(&win_tun); @@ -97,7 +97,7 @@ impl TunDevice { win_tun.WintunGetAdapterLUID(adapter, &mut luid as *mut wintun_raw::NET_LUID); let index = ffi::luid_to_index(&std::mem::transmute(luid)).map(|index| index as u32)?; Ok(TunDevice { - luid:std::mem::transmute(luid), + luid: std::mem::transmute(luid), index, session, win_tun, @@ -155,6 +155,7 @@ pub struct Version { // } // } + impl IFace for TunDevice { fn shutdown(&self) -> io::Result<()> { let _ = unsafe { synchapi::SetEvent(self.shutdown_event) }; @@ -178,16 +179,16 @@ impl IFace for TunDevice { netsh::set_interface_name(&name, new_name) } - fn set_ip(&self, address: IP, mask: IP) -> io::Result<()> where IP: Into { - netsh::set_interface_ip(self.get_index()?, &address.into(), &mask.into()) + fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()>{ + netsh::set_interface_ip(self.get_index()?, &address, &mask) } - fn add_route(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into { - route::add_route(self.get_index()?, dest.into(), netmask.into(), gateway.into()) + fn add_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr, metric: u16) -> io::Result<()> { + route::add_route(self.get_index()?, dest, netmask, gateway, metric) } - fn delete_route(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into { - route::delete_route(self.get_index()?, dest.into(), netmask.into(), gateway.into()) + fn delete_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> { + route::delete_route(self.get_index()?, dest, netmask, gateway) } fn set_mtu(&self, mtu: u16) -> io::Result<()> {