优化tun设置
This commit is contained in:
@@ -13,7 +13,7 @@ libloading = "0.7"
|
|||||||
widestring = "0.4"
|
widestring = "0.4"
|
||||||
once_cell = "1.8"
|
once_cell = "1.8"
|
||||||
itertools = "0.10.1"
|
itertools = "0.10.1"
|
||||||
|
rand = "0.8.5"
|
||||||
[dependencies.winapi]
|
[dependencies.winapi]
|
||||||
version = "0.3"
|
version = "0.3"
|
||||||
features = [
|
features = [
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ mod tun;
|
|||||||
mod ffi;
|
mod ffi;
|
||||||
mod netsh;
|
mod netsh;
|
||||||
mod route;
|
mod route;
|
||||||
|
|
||||||
use std::{io, net};
|
use std::{io, net};
|
||||||
|
use std::net::Ipv4Addr;
|
||||||
pub use tap::TapDevice;
|
pub use tap::TapDevice;
|
||||||
pub use tun::*;
|
pub use tun::*;
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ fn decode_utf16(string: &[u16]) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait IFace {
|
pub trait IFace {
|
||||||
fn shutdown(&self)->io::Result<()>;
|
fn shutdown(&self) -> io::Result<()>;
|
||||||
/// 获取接口索引
|
/// 获取接口索引
|
||||||
fn get_index(&self) -> io::Result<u32>;
|
fn get_index(&self) -> io::Result<u32>;
|
||||||
/// 获取名称
|
/// 获取名称
|
||||||
@@ -31,18 +31,15 @@ pub trait IFace {
|
|||||||
/// 设置名称
|
/// 设置名称
|
||||||
fn set_name(&self, new_name: &str) -> io::Result<()>;
|
fn set_name(&self, new_name: &str) -> io::Result<()>;
|
||||||
/// 设置ip
|
/// 设置ip
|
||||||
fn set_ip<IP>(&self, address: IP, mask: IP) -> io::Result<()>
|
fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()>;
|
||||||
where IP: Into<net::Ipv4Addr>;
|
|
||||||
/// 设置路由
|
/// 设置路由
|
||||||
fn add_route<IP>(&self, dest: IP,
|
fn add_route(&self, dest: Ipv4Addr,
|
||||||
netmask: IP,
|
netmask: Ipv4Addr,
|
||||||
gateway: IP, ) -> io::Result<()>
|
gateway: Ipv4Addr, metric: u16) -> io::Result<()>;
|
||||||
where IP: Into<net::Ipv4Addr>;
|
|
||||||
/// 删除路由
|
/// 删除路由
|
||||||
fn delete_route<IP>(&self, dest: IP,
|
fn delete_route(&self, dest: Ipv4Addr,
|
||||||
netmask: IP,
|
netmask: Ipv4Addr,
|
||||||
gateway: IP, ) -> io::Result<()>
|
gateway: Ipv4Addr, ) -> io::Result<()>;
|
||||||
where IP: Into<net::Ipv4Addr>;
|
|
||||||
/// 设置最大传输单元
|
/// 设置最大传输单元
|
||||||
fn set_mtu(&self, mtu: u16) -> io::Result<()>;
|
fn set_mtu(&self, mtu: u16) -> io::Result<()>;
|
||||||
/// 设置跃点
|
/// 设置跃点
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ use std::net::Ipv4Addr;
|
|||||||
/// 添加路由
|
/// 添加路由
|
||||||
pub fn add_route(index: u32, dest: Ipv4Addr,
|
pub fn add_route(index: u32, dest: Ipv4Addr,
|
||||||
netmask: Ipv4Addr,
|
netmask: Ipv4Addr,
|
||||||
gateway: Ipv4Addr, ) -> io::Result<()> {
|
gateway: Ipv4Addr, metric: u16) -> io::Result<()> {
|
||||||
let set_route = format!(
|
let set_route = format!(
|
||||||
"route add {:?} mask {:?} {:?} if {}",
|
"route add {:?} mask {:?} {:?} metric {} if {}",
|
||||||
dest, netmask, gateway, index
|
dest, netmask, gateway, metric, index
|
||||||
);
|
);
|
||||||
// 执行添加路由命令
|
// 执行添加路由命令
|
||||||
let out = std::process::Command::new("cmd")
|
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 {
|
if index == 0 {
|
||||||
return Err(io::Error::new(io::ErrorKind::Other, format!("网络接口索引错误: {:?}", index)));
|
return Err(io::Error::new(io::ErrorKind::Other, format!("网络接口索引错误: {:?}", index)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,19 +135,19 @@ impl IFace for TapDevice {
|
|||||||
netsh::set_interface_name(&name, new_name)
|
netsh::set_interface_name(&name, new_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_ip<IP>(&self, address: IP, mask: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()> {
|
||||||
let index = self.get_index()?;
|
let index = self.get_index()?;
|
||||||
netsh::set_interface_ip(index, &address.into(), &mask.into())
|
netsh::set_interface_ip(index, &address, &mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_route<IP>(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn add_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr, metric: u16) -> io::Result<()> {
|
||||||
let index = self.get_index()?;
|
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<IP>(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn delete_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> {
|
||||||
let index = self.get_index()?;
|
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<()> {
|
fn set_mtu(&self, mtu: u16) -> io::Result<()> {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::net::Ipv4Addr;
|
|||||||
use winapi::um::{handleapi, synchapi, winbase, winnt};
|
use winapi::um::{handleapi, synchapi, winbase, winnt};
|
||||||
|
|
||||||
use crate::{decode_utf16, encode_utf16, ffi, IFace, netsh, route};
|
use crate::{decode_utf16, encode_utf16, ffi, IFace, netsh, route};
|
||||||
|
use rand::Rng;
|
||||||
mod wintun_raw;
|
mod wintun_raw;
|
||||||
mod log;
|
mod log;
|
||||||
pub mod packet;
|
pub mod packet;
|
||||||
@@ -20,7 +20,7 @@ pub const MAX_POOL: usize = 256;
|
|||||||
|
|
||||||
|
|
||||||
pub struct TunDevice {
|
pub struct TunDevice {
|
||||||
pub(crate) luid:u64,
|
pub(crate) luid: u64,
|
||||||
pub(crate) index: u32,
|
pub(crate) index: u32,
|
||||||
/// The session handle given to us by WintunStartSession
|
/// The session handle given to us by WintunStartSession
|
||||||
pub(crate) session: wintun_raw::WINTUN_SESSION_HANDLE,
|
pub(crate) session: wintun_raw::WINTUN_SESSION_HANDLE,
|
||||||
@@ -44,11 +44,7 @@ pub struct TunDevice {
|
|||||||
unsafe impl Send for TunDevice {}
|
unsafe impl Send for TunDevice {}
|
||||||
|
|
||||||
unsafe impl Sync 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 {
|
impl TunDevice {
|
||||||
pub unsafe fn create<L>(library: L, pool: &str, name: &str) -> io::Result<Self>
|
pub unsafe fn create<L>(library: L, pool: &str, name: &str) -> io::Result<Self>
|
||||||
where L: Into<libloading::Library>, {
|
where L: Into<libloading::Library>, {
|
||||||
@@ -66,9 +62,13 @@ impl TunDevice {
|
|||||||
if name_utf16.len() > MAX_POOL {
|
if name_utf16.len() > MAX_POOL {
|
||||||
return Err(io::Error::new(io::ErrorKind::Other, format!("长度大于{}:{:?}", MAX_POOL, 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
|
//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
|
//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;
|
let guid_ptr = &guid_struct as *const wintun_raw::GUID;
|
||||||
|
|
||||||
log::set_default_logger_if_unset(&win_tun);
|
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);
|
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)?;
|
let index = ffi::luid_to_index(&std::mem::transmute(luid)).map(|index| index as u32)?;
|
||||||
Ok(TunDevice {
|
Ok(TunDevice {
|
||||||
luid:std::mem::transmute(luid),
|
luid: std::mem::transmute(luid),
|
||||||
index,
|
index,
|
||||||
session,
|
session,
|
||||||
win_tun,
|
win_tun,
|
||||||
@@ -155,6 +155,7 @@ pub struct Version {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
impl IFace for TunDevice {
|
impl IFace for TunDevice {
|
||||||
fn shutdown(&self) -> io::Result<()> {
|
fn shutdown(&self) -> io::Result<()> {
|
||||||
let _ = unsafe { synchapi::SetEvent(self.shutdown_event) };
|
let _ = unsafe { synchapi::SetEvent(self.shutdown_event) };
|
||||||
@@ -178,16 +179,16 @@ impl IFace for TunDevice {
|
|||||||
netsh::set_interface_name(&name, new_name)
|
netsh::set_interface_name(&name, new_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_ip<IP>(&self, address: IP, mask: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn set_ip(&self, address: Ipv4Addr, mask: Ipv4Addr) -> io::Result<()>{
|
||||||
netsh::set_interface_ip(self.get_index()?, &address.into(), &mask.into())
|
netsh::set_interface_ip(self.get_index()?, &address, &mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_route<IP>(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn add_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr, metric: u16) -> io::Result<()> {
|
||||||
route::add_route(self.get_index()?, dest.into(), netmask.into(), gateway.into())
|
route::add_route(self.get_index()?, dest, netmask, gateway, metric)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete_route<IP>(&self, dest: IP, netmask: IP, gateway: IP) -> io::Result<()> where IP: Into<Ipv4Addr> {
|
fn delete_route(&self, dest: Ipv4Addr, netmask: Ipv4Addr, gateway: Ipv4Addr) -> io::Result<()> {
|
||||||
route::delete_route(self.get_index()?, dest.into(), netmask.into(), gateway.into())
|
route::delete_route(self.get_index()?, dest, netmask, gateway)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_mtu(&self, mtu: u16) -> io::Result<()> {
|
fn set_mtu(&self, mtu: u16) -> io::Result<()> {
|
||||||
|
|||||||
Reference in New Issue
Block a user