From 8225cb7877a4b737113b5484e171ca812c387c33 Mon Sep 17 00:00:00 2001 From: vnt-dev <49143209+vnt-dev@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:49:18 +0800 Subject: [PATCH 1/5] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 74f7ee4..883f8f4 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,9 @@ vnt默认使用10.26.0.0/24网段,和本地网络适配器的ip冲突 对VNT有任何问题均可以加群联系作者 -QQ: 1034868233 +QQ群1: 1034868233(满人) + +QQ群2: 950473757 ### 赞助 From 09a315a0f1d9c49e5b3c6e3be89cf8c009fb1b29 Mon Sep 17 00:00:00 2001 From: lbl <49143209+lbl8603@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:09:30 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=BB=91=E5=AE=9A=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BD=91=E5=8D=A1=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- common/src/cli.rs | 21 ++++++---------- common/src/config/file_config.rs | 6 ++--- vnt-cli/Cargo.toml | 2 +- vnt/src/channel/socket/mod.rs | 27 ++++++++++----------- vnt/src/channel/socket/unix.rs | 33 ++++++++++++------------- vnt/src/channel/socket/windows.rs | 40 +++++++++++++++---------------- vnt/src/core/mod.rs | 10 ++++---- 8 files changed, 64 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf82e75..60343e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2190,7 +2190,7 @@ dependencies = [ [[package]] name = "vnt-cli" -version = "1.2.13" +version = "1.2.14" dependencies = [ "anyhow", "chrono", diff --git a/common/src/cli.rs b/common/src/cli.rs index ceee8d2..ef06a2c 100644 --- a/common/src/cli.rs +++ b/common/src/cli.rs @@ -76,7 +76,7 @@ pub fn parse_args_config() -> anyhow::Result, bool)> opts.optmulti("", "vnt-mapping", "vnt-mapping", ""); opts.optopt("f", "", "配置文件", ""); opts.optopt("", "compressor", "压缩算法", ""); - opts.optopt("", "local-ipv4", "指定本地ipv4网卡IP", ""); + opts.optopt("", "local-dev", "指定本地ipv4网卡名称", ""); opts.optflag("", "disable-stats", "关闭流量统计"); opts.optflag("", "allow-wg", "允许接入WireGuard"); //"后台运行时,查看其他设备列表" @@ -284,15 +284,8 @@ pub fn parse_args_config() -> anyhow::Result, bool)> #[cfg(feature = "port_mapping")] let port_mapping_list = matches.opt_strs("mapping"); let vnt_mapping_list = matches.opt_strs("vnt-mapping"); - let local_ipv4: Option = matches.opt_get("local-ipv4").unwrap(); - let local_ipv4 = local_ipv4 - .map(|v| Ipv4Addr::from_str(&v).expect(&format!("'--local-ipv4 {}' error", v))); - if let Some(local_ipv4) = local_ipv4 { - if local_ipv4.is_unspecified() || local_ipv4.is_broadcast() || local_ipv4.is_multicast() - { - return Err(anyhow::anyhow!("'--local-ipv4 {}' invalid", local_ipv4)); - } - } + let local_dev: Option = matches.opt_get("local-dev").unwrap(); + let disable_stats = matches.opt_present("disable-stats"); let allow_wire_guard = matches.opt_present("allow-wg"); let compressor = if let Some(compressor) = matches.opt_str("compressor").as_ref() { @@ -336,7 +329,7 @@ pub fn parse_args_config() -> anyhow::Result, bool)> compressor, !disable_stats, allow_wire_guard, - local_ipv4, + local_dev, )?; (config, vnt_mapping_list, cmd) }; @@ -383,7 +376,7 @@ fn get_description(key: &str, language: &str) -> String { ("--compressor-lz4 ", ("启用压缩,可选值lz4,例如 --compressor lz4", "Enable compression, option lz4, e.g., --compressor lz4")), ("--compressor-zstd ", ("启用压缩,可选值zstd<,level>,level为压缩级别,例如 --compressor zstd,10", "Enable compression, options zstd<,level>, level is compression level, e.g., --compressor zstd,10")), ("--vnt-mapping ", ("vnt地址映射,例如 --vnt-mapping tcp:80-10.26.0.10:80 映射目标是vnt网络或其子网中的设备", "VNT address mapping, e.g., --vnt-mapping tcp:80-10.26.0.10:80 maps to a device in VNT network or its subnet")), - ("--local-ipv4", ("本地出口网卡的ipv4地址", "IPv4 address of local export network card")), + ("--local-dev", ("本地出口网卡的名称", "name of local export network card")), ("--disable-stats", ("关闭流量统计", "Disable traffic statistics")), ("--allow-wg", ("允许接入WireGuard客户端", "Allow access to WireGuard client")), ("--list", ("后台运行时,查看其他设备列表", "View list of other devices when running in background")), @@ -572,8 +565,8 @@ fn print_usage(program: &str, _opts: Options) { green(get_description("--vnt-mapping ", &language).to_string()) ); println!( - " --local-ipv4 {}", - get_description("--local-ipv4", &language) + " --local-dev {}", + get_description("--local-dev", &language) ); println!( " --disable-stats {}", diff --git a/common/src/config/file_config.rs b/common/src/config/file_config.rs index 847dc8c..a86163e 100644 --- a/common/src/config/file_config.rs +++ b/common/src/config/file_config.rs @@ -48,7 +48,7 @@ pub struct FileConfig { pub disable_stats: bool, // 允许传递wg流量 pub allow_wire_guard: bool, - pub local_ipv4: Option, + pub local_dev: Option, } impl Default for FileConfig { @@ -94,7 +94,7 @@ impl Default for FileConfig { vnt_mapping: vec![], disable_stats: false, allow_wire_guard: false, - local_ipv4: None, + local_dev: None, } } } @@ -183,7 +183,7 @@ pub fn read_config(file_path: &str) -> anyhow::Result<(Config, Vec, bool compressor, !file_conf.disable_stats, file_conf.allow_wire_guard, - file_conf.local_ipv4, + file_conf.local_dev, )?; Ok((config, file_conf.vnt_mapping, file_conf.cmd)) diff --git a/vnt-cli/Cargo.toml b/vnt-cli/Cargo.toml index e2239af..87c8bcb 100644 --- a/vnt-cli/Cargo.toml +++ b/vnt-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vnt-cli" -version = "1.2.13" +version = "1.2.14" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/vnt/src/channel/socket/mod.rs b/vnt/src/channel/socket/mod.rs index 55e495f..ccd88ae 100644 --- a/vnt/src/channel/socket/mod.rs +++ b/vnt/src/channel/socket/mod.rs @@ -2,10 +2,6 @@ use anyhow::{anyhow, Context}; use network_interface::{NetworkInterface, NetworkInterfaceConfig}; use socket2::Protocol; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; -#[cfg(unix)] -pub use unix::*; -#[cfg(windows)] -pub use windows::*; #[cfg(unix)] mod unix; @@ -120,20 +116,23 @@ pub fn bind_udp( bind_udp_ops(addr, true, default_interface).with_context(|| format!("{}", addr)) } -pub fn get_interface(dest_ip: Ipv4Addr) -> anyhow::Result { +pub fn get_interface(dest_name: String) -> anyhow::Result<(LocalInterface, Ipv4Addr)> { let network_interfaces = NetworkInterface::show()?; for iface in network_interfaces { - for addr in iface.addr { - if let IpAddr::V4(ip) = addr.ip() { - if ip == dest_ip { - return Ok(LocalInterface { - index: iface.index, - #[cfg(unix)] - name: Some(iface.name), - }); + if iface.name == dest_name { + for addr in iface.addr { + if let IpAddr::V4(ip) = addr.ip() { + return Ok(( + LocalInterface { + index: iface.index, + #[cfg(unix)] + name: Some(iface.name), + }, + ip, + )); } } } } - Err(anyhow!("No network card with IP {} found", dest_ip)) + Err(anyhow!("No network card with name {} found", dest_name)) } diff --git a/vnt/src/channel/socket/unix.rs b/vnt/src/channel/socket/unix.rs index 4a7b50a..a10807f 100644 --- a/vnt/src/channel/socket/unix.rs +++ b/vnt/src/channel/socket/unix.rs @@ -1,9 +1,6 @@ -#[cfg(any(target_os = "linux", target_os = "macos"))] -use crate::channel::socket::get_interface; use crate::channel::socket::{LocalInterface, VntSocketTrait}; #[cfg(any(target_os = "linux", target_os = "macos"))] use anyhow::Context; -use std::net::Ipv4Addr; #[cfg(target_os = "linux")] impl VntSocketTrait for socket2::Socket { @@ -32,18 +29,18 @@ impl VntSocketTrait for socket2::Socket { } } -#[cfg(any(target_os = "linux", target_os = "macos"))] -pub fn get_best_interface(dest_ip: Ipv4Addr) -> anyhow::Result { - match get_interface(dest_ip) { - Ok(iface) => return Ok(iface), - Err(e) => { - log::warn!("not find interface e={:?},ip={}", e, dest_ip); - } - } - // 应该再查路由表找到默认路由的 - Ok(LocalInterface::default()) -} -#[cfg(target_os = "android")] -pub fn get_best_interface(_dest_ip: Ipv4Addr) -> anyhow::Result { - Ok(LocalInterface::default()) -} +// #[cfg(any(target_os = "linux", target_os = "macos"))] +// pub fn get_best_interface(dest_ip: Ipv4Addr) -> anyhow::Result { +// match get_interface(dest_ip) { +// Ok(iface) => return Ok(iface), +// Err(e) => { +// log::warn!("not find interface e={:?},ip={}", e, dest_ip); +// } +// } +// // 应该再查路由表找到默认路由的 +// Ok(LocalInterface::default()) +// } +// #[cfg(target_os = "android")] +// pub fn get_best_interface(_dest_ip: Ipv4Addr) -> anyhow::Result { +// Ok(LocalInterface::default()) +// } diff --git a/vnt/src/channel/socket/windows.rs b/vnt/src/channel/socket/windows.rs index a518178..5322099 100644 --- a/vnt/src/channel/socket/windows.rs +++ b/vnt/src/channel/socket/windows.rs @@ -1,11 +1,9 @@ use std::mem; -use std::net::Ipv4Addr; use std::os::windows::io::AsRawSocket; use windows_sys::core::PCSTR; -use windows_sys::Win32::NetworkManagement::IpHelper::GetBestInterfaceEx; use windows_sys::Win32::Networking::WinSock::{ - htonl, setsockopt, AF_INET, IPPROTO_IP, IP_UNICAST_IF, SOCKADDR, SOCKADDR_IN, SOCKET_ERROR, + htonl, setsockopt, IPPROTO_IP, IP_UNICAST_IF, SOCKET_ERROR, }; use crate::channel::socket::{LocalInterface, VntSocketTrait}; @@ -38,21 +36,21 @@ impl VntSocketTrait for socket2::Socket { } } -pub fn get_best_interface(dest_ip: Ipv4Addr) -> anyhow::Result { - // 获取最佳接口 - let index = unsafe { - let mut dest: SOCKADDR_IN = mem::zeroed(); - dest.sin_family = AF_INET as u16; - dest.sin_addr.S_un.S_addr = u32::from_ne_bytes(dest_ip.octets()); - - let mut index: u32 = 0; - if GetBestInterfaceEx(&dest as *const _ as *mut SOCKADDR, &mut index) != 0 { - Err(anyhow::anyhow!( - "Failed to GetBestInterfaceEx: {:?}", - std::io::Error::last_os_error() - ))?; - } - index - }; - Ok(LocalInterface { index }) -} +// pub fn get_best_interface(dest_ip: Ipv4Addr) -> anyhow::Result { +// // 获取最佳接口 +// let index = unsafe { +// let mut dest: SOCKADDR_IN = mem::zeroed(); +// dest.sin_family = AF_INET as u16; +// dest.sin_addr.S_un.S_addr = u32::from_ne_bytes(dest_ip.octets()); +// +// let mut index: u32 = 0; +// if GetBestInterfaceEx(&dest as *const _ as *mut SOCKADDR, &mut index) != 0 { +// Err(anyhow::anyhow!( +// "Failed to GetBestInterfaceEx: {:?}", +// std::io::Error::last_os_error() +// ))?; +// } +// index +// }; +// Ok(LocalInterface { index }) +// } diff --git a/vnt/src/core/mod.rs b/vnt/src/core/mod.rs index ab8b8b7..91c6f6e 100644 --- a/vnt/src/core/mod.rs +++ b/vnt/src/core/mod.rs @@ -94,7 +94,7 @@ impl Config { enable_traffic: bool, // 允许传递wg流量 allow_wire_guard: bool, - local_ipv4: Option, + local_dev: Option, ) -> anyhow::Result { #[cfg(windows)] #[cfg(feature = "integrated_tun")] @@ -163,12 +163,12 @@ impl Config { *dest = *mask & *dest; } in_ips.sort_by(|(dest1, _, _), (dest2, _, _)| dest2.cmp(dest1)); - let local_interface = if let Some(local_ip) = local_ipv4 { - let default_interface = crate::channel::socket::get_interface(local_ip)?; + let (local_interface, local_ipv4) = if let Some(local_dev) = local_dev { + let (default_interface, ip) = crate::channel::socket::get_interface(local_dev)?; log::info!("default_interface = {:?}", default_interface); - default_interface + (default_interface, Some(ip)) } else { - LocalInterface::default() + (LocalInterface::default(), None) }; Ok(Self { #[cfg(feature = "integrated_tun")] From c91d8a2734abe4cd6b9bbd3638b2bdb2a2e5000a Mon Sep 17 00:00:00 2001 From: lbl <49143209+lbl8603@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:11:16 +0800 Subject: [PATCH 3/5] log --- vnt/src/core/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vnt/src/core/mod.rs b/vnt/src/core/mod.rs index 91c6f6e..53defef 100644 --- a/vnt/src/core/mod.rs +++ b/vnt/src/core/mod.rs @@ -165,7 +165,7 @@ impl Config { in_ips.sort_by(|(dest1, _, _), (dest2, _, _)| dest2.cmp(dest1)); let (local_interface, local_ipv4) = if let Some(local_dev) = local_dev { let (default_interface, ip) = crate::channel::socket::get_interface(local_dev)?; - log::info!("default_interface = {:?}", default_interface); + log::info!("default_interface = {:?} local_ip= {ip}", default_interface); (default_interface, Some(ip)) } else { (LocalInterface::default(), None) From 8a66bbe1afda9c4f5b5931a59169ae475a348ab4 Mon Sep 17 00:00:00 2001 From: lbl <49143209+lbl8603@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:12:41 +0800 Subject: [PATCH 4/5] version=1.2.14 --- Cargo.lock | 8 ++++---- common/Cargo.toml | 2 +- vn-link-cli/Cargo.toml | 2 +- vn-link/Cargo.toml | 2 +- vnt/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60343e5..056d3d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,7 +307,7 @@ dependencies = [ [[package]] name = "common" -version = "1.2.13" +version = "1.2.14" dependencies = [ "anyhow", "chrono", @@ -2118,7 +2118,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vn-link" -version = "1.2.13" +version = "1.2.14" dependencies = [ "anyhow", "crossbeam-utils", @@ -2131,7 +2131,7 @@ dependencies = [ [[package]] name = "vn-link-cli" -version = "1.2.13" +version = "1.2.14" dependencies = [ "common", "log", @@ -2141,7 +2141,7 @@ dependencies = [ [[package]] name = "vnt" -version = "1.2.13" +version = "1.2.14" dependencies = [ "aes", "aes-gcm", diff --git a/common/Cargo.toml b/common/Cargo.toml index 27d0dfa..556836b 100644 --- a/common/Cargo.toml +++ b/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "common" -version = "1.2.13" +version = "1.2.14" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/vn-link-cli/Cargo.toml b/vn-link-cli/Cargo.toml index a5b43fa..16d03b4 100644 --- a/vn-link-cli/Cargo.toml +++ b/vn-link-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vn-link-cli" -version = "1.2.13" +version = "1.2.14" edition = "2021" [dependencies] diff --git a/vn-link/Cargo.toml b/vn-link/Cargo.toml index 2c2b343..ed97983 100644 --- a/vn-link/Cargo.toml +++ b/vn-link/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vn-link" -version = "1.2.13" +version = "1.2.14" edition = "2021" [dependencies] diff --git a/vnt/Cargo.toml b/vnt/Cargo.toml index 1289af0..6aa165e 100644 --- a/vnt/Cargo.toml +++ b/vnt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vnt" -version = "1.2.13" +version = "1.2.14" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 1165ee52c703cce0ac4da766d62c29bd9ffe8aec Mon Sep 17 00:00:00 2001 From: lbl <49143209+lbl8603@users.noreply.github.com> Date: Sun, 13 Oct 2024 12:36:37 +0800 Subject: [PATCH 5/5] v3 --- .github/workflows/rust.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index a6cf3d7..2b55203 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -86,7 +86,7 @@ jobs: OS: ${{ matrix.OS }} FEATURES: ${{ matrix.FEATURES }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Init submodules uses: snickerbockers/submodules-init@v4 - name: Cargo cache @@ -221,7 +221,7 @@ jobs: cd ./artifacts tar -czf vnt-$TARGET-$TAG.tar.gz * - name: Archive artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: vnt-cli path: | @@ -233,7 +233,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: vnt-cli path: ./artifacts