From c5743602584dd6ac356f6fa49db43ebcde773da3 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Wed, 14 Aug 2024 05:18:16 +0300 Subject: [PATCH] Changes to be committed: modified: Cargo.lock modified: Cargo.toml modified: src/tcp_client.rs modified: src/tcp_server.rs --- Cargo.lock | 304 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/tcp_client.rs | 2 +- src/tcp_server.rs | 56 ++++++++- 4 files changed, 361 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b390f2..3c43442 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -98,6 +98,28 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "atty" version = "0.2.14" @@ -139,6 +161,29 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.72", + "which", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -205,6 +250,15 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -251,6 +305,17 @@ dependencies = [ "inout", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "2.34.0" @@ -330,6 +395,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "env_logger" version = "0.9.3" @@ -343,6 +414,16 @@ dependencies = [ "termcolor", ] +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "futures" version = "0.3.30" @@ -490,6 +571,15 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "humantime" version = "2.1.0" @@ -535,6 +625,27 @@ dependencies = [ "serde", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.155" @@ -551,6 +662,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lock_api" version = "0.4.12" @@ -573,6 +690,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -594,6 +717,99 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "net-route" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9c8e9fc939c670a3e68756d9a3c83f336dacec28cda45448ea65f8243d6cb3" +dependencies = [ + "async-stream", + "bindgen", + "futures", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "rtnetlink", + "tokio", + "winapi", +] + +[[package]] +name = "netlink-packet-core" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +dependencies = [ + "anyhow", + "byteorder", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c171cd77b4ee8c7708da746ce392440cb7bcf618d122ec9ecc607b12938bf4" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "log", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "libc", +] + [[package]] name = "nix" version = "0.28.0" @@ -624,6 +840,16 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "object" version = "0.36.3" @@ -633,6 +859,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -674,6 +906,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "phf" version = "0.8.0" @@ -816,6 +1054,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.72", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -902,12 +1150,49 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rtnetlink" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b684475344d8df1859ddb2d395dd3dac4f8f3422a1aa0725993cb375fc5caba5" +dependencies = [ + "futures", + "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-packet-utils", + "netlink-proto", + "netlink-sys", + "nix 0.27.1", + "thiserror", + "tokio", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustvpn" version = "0.1.0" @@ -927,6 +1212,7 @@ dependencies = [ "futures", "generic-array", "log", + "net-route", "packet", "pnet", "rand", @@ -964,6 +1250,12 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1192,6 +1484,18 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 48aa078..2231422 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,4 +29,5 @@ tun2 = "2.0.5" packet = "0.1.4" ctrlc2 = "3.5" crossbeam-channel = "0.5.13" -pnet = "0.35.0" \ No newline at end of file +pnet = "0.35.0" +net-route = "0.4.4" diff --git a/src/tcp_client.rs b/src/tcp_client.rs index fe88f32..06e5d0c 100644 --- a/src/tcp_client.rs +++ b/src/tcp_client.rs @@ -115,7 +115,7 @@ pub async fn client_mode(remote_addr: String) { loop { if let Ok(bytes) = mx.recv() { let vpn_packet = VpnPacket::init(bytes); - let serialized_data = bincode::serialize(&vpn_packet).unwrap(); + let serialized_data = bincode::serialize::(&vpn_packet).unwrap(); //info!("Writing to sock: {:?}", serialized_data); sock_writer.write_all(&serialized_data).await.unwrap(); } diff --git a/src/tcp_server.rs b/src/tcp_server.rs index 9b3bbff..b968a0f 100644 --- a/src/tcp_server.rs +++ b/src/tcp_server.rs @@ -9,6 +9,7 @@ use std::sync::Arc; use std::net::SocketAddr; use std::collections::HashMap; use tokio::io::AsyncReadExt; +use std::process::Command; use crate::{VpnPacket, HEADER, TAIL}; @@ -17,10 +18,61 @@ pub async fn server_mode(bind_addr: String) { let mut config = tun2::Configuration::default(); config.address("10.8.0.1"); - config.netmask("255.255.255.0"); config.tun_name("tun0"); config.up(); + /* let mut route_output = Command::new("route") + .arg("add") + .arg("0.0.0.0") + .arg("mask") + .arg("128.0.0.0") + .arg("0.0.0.0") + .output() + .expect("Failed to execute IP ROUTE 1"); + + if !route_output.status.success() { + error!("Failed to set route: {}", String::from_utf8_lossy(&route_output.stderr)); + } + + route_output = Command::new("route") + .arg("add") + .arg("10.8.0.1") + .arg("mask") + .arg("255.255.255.255") + .arg("0.0.0.0") + .output() + .expect("Failed to execute IP ROUTE 2"); + + if !route_output.status.success() { + error!("Failed to set route: {}", String::from_utf8_lossy(&route_output.stderr)); + } + + route_output = Command::new("route") + .arg("add") + .arg("127.255.255.255") + .arg("mask") + .arg("255.255.255.255") + .arg("0.0.0.0") + .output() + .expect("Failed to execute IP ROUTE 3"); + + if !route_output.status.success() { + error!("Failed to set route: {}", String::from_utf8_lossy(&route_output.stderr)); + } + + route_output = Command::new("route") + .arg("add") + .arg("128.0.0.0") + .arg("mask") + .arg("128.0.0.0") + .arg("0.0.0.0") + .output() + .expect("Failed to execute IP ROUTE 4"); + + if !route_output.status.success() { + error!("Failed to set route: {}", String::from_utf8_lossy(&route_output.stderr)); + }*/ + #[cfg(target_os = "linux")] config.platform_config(|config| { config.packet_information(true); @@ -62,7 +114,7 @@ pub async fn server_mode(bind_addr: String) { loop { if let Ok(bytes) = thread_mx.recv() { let vpn_packet = VpnPacket::init(bytes); - let serialized_data = bincode::serialize(&vpn_packet).unwrap(); + let serialized_data = bincode::serialize::(&vpn_packet).unwrap(); sock_writer.write_all(&serialized_data).await.unwrap(); //info!("Wrote to sock: {:?}", serialized_data); }