Commit 474d54a0 authored by nanamicat's avatar nanamicat

not work

parent c03cebc2
......@@ -2,6 +2,15 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "async-channel"
version = "2.3.1"
......@@ -230,12 +239,27 @@ dependencies = [
"slab",
]
[[package]]
name = "glob"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "ipnet"
version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708"
[[package]]
name = "ipnetwork"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e"
dependencies = [
"serde",
]
[[package]]
name = "libc"
version = "0.2.167"
......@@ -276,6 +300,12 @@ dependencies = [
"libc",
]
[[package]]
name = "no-std-net"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65"
[[package]]
name = "parking"
version = "2.2.1"
......@@ -305,6 +335,97 @@ dependencies = [
"futures-io",
]
[[package]]
name = "pnet"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "682396b533413cc2e009fbb48aadf93619a149d3e57defba19ff50ce0201bd0d"
dependencies = [
"ipnetwork",
"pnet_base",
"pnet_datalink",
"pnet_packet",
"pnet_sys",
"pnet_transport",
]
[[package]]
name = "pnet_base"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7"
dependencies = [
"no-std-net",
]
[[package]]
name = "pnet_datalink"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e79e70ec0be163102a332e1d2d5586d362ad76b01cec86f830241f2b6452a7b7"
dependencies = [
"ipnetwork",
"libc",
"pnet_base",
"pnet_sys",
"winapi",
]
[[package]]
name = "pnet_macros"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13325ac86ee1a80a480b0bc8e3d30c25d133616112bb16e86f712dcf8a71c863"
dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.90",
]
[[package]]
name = "pnet_macros_support"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eed67a952585d509dd0003049b1fc56b982ac665c8299b124b90ea2bdb3134ab"
dependencies = [
"pnet_base",
]
[[package]]
name = "pnet_packet"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c96ebadfab635fcc23036ba30a7d33a80c39e8461b8bd7dc7bb186acb96560f"
dependencies = [
"glob",
"pnet_base",
"pnet_macros",
"pnet_macros_support",
]
[[package]]
name = "pnet_sys"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d4643d3d4db6b08741050c2f3afa9a892c4244c085a72fcda93c9c2c9a00f4b"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "pnet_transport"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f604d98bc2a6591cf719b58d3203fd882bdd6bf1db696c4ac97978e9f4776bf"
dependencies = [
"libc",
"pnet_base",
"pnet_packet",
"pnet_sys",
]
[[package]]
name = "proc-macro2"
version = "1.0.92"
......@@ -323,6 +444,55 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "serde"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.90",
]
[[package]]
name = "slab"
version = "0.4.9"
......@@ -405,6 +575,8 @@ dependencies = [
name = "tun1"
version = "0.1.0"
dependencies = [
"pnet",
"pnet_macros",
"socket2",
"tun",
]
......@@ -415,6 +587,28 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.52.0"
......
......@@ -6,5 +6,5 @@ edition = "2021"
[dependencies]
tun = "0.7"
socket2 = { version = "0.5.8", features = ["all"] }
#pnet = "0.35.0"
#pnet_macros = "0.35.0"
pnet = "0.35.0"
pnet_macros = "0.35.0"
use pnet::packet::ipv4::Ipv4Packet;
use pnet::packet::Packet;
use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use std::error::Error;
use std::io::{BufRead, Read, Write};
use std::mem::MaybeUninit;
use std::mem::{transmute, MaybeUninit};
use std::sync::{Arc, Mutex};
use std::{env, thread};
use std::net::SocketAddrV4;
use std::net::{SocketAddr, SocketAddrV4};
use std::net::UdpSocket;
#[repr(C)]
pub struct Meta {
......@@ -38,13 +44,21 @@ fn main() -> Result<(), Box<dyn Error>> {
let remote_id: u8 = env::var("REMOTE_ID")?.parse()?;
let local_secret = Secret::new(&env::var("LOCAL_SECRET")?);
let remote_secret = Secret::new(&env::var("REMOTE_SECRET")?);
let mut remote_address: &SockAddr;
let remote_addr: Arc<Mutex<Option<SockAddr>>> = Arc::new(Mutex::new(
match env::var("REMOTE_ADDR") {
Ok(addr_str) => {
let parsed = addr_str.parse::<SocketAddr>()?;
Some(parsed.into())
}
Err(_) => None,
}
));
let mut config = tun::Configuration::default();
config
.address((10, 0, 0, 9))
.address((10, 0, 0, local_id))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 1))
.destination((10, 0, 0, remote_id))
.up();
#[cfg(target_os = "linux")]
......@@ -53,29 +67,36 @@ fn main() -> Result<(), Box<dyn Error>> {
});
let dev = tun::create(&config)?;
let (mut reader, writer) = dev.split();
let (mut reader, mut writer) = dev.split();
// 创建用于接收的原始套接字,协议号为 144
let socket = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::from(144)))?;
let socket_arc = Arc::new(Mutex::new(socket));
let socket_for_inbound = Arc::clone(&socket_arc);
let remote_addr_clone = Arc::clone(&remote_addr);
let inbound = thread::spawn(move || {
let mut recv_buf = [MaybeUninit::uninit(); 1500];
let mut addr: SockAddr;
loop {
match socket.recv_from(&mut recv_buf) {
let sock_guard = socket_for_inbound.lock().unwrap();
match sock_guard.recv_from(&mut recv_buf) {
Ok((len, addr1)) => {
remote_address = &addr1;
println!("recv from {:?}", recv_buf);
// if let Some(packet) = Ipv4Packet::new(unsafe { transmute(&recv_buf[..len]) }) {
// let (meta1, payload) = packet.payload().split_at_mut(size_of::<Meta>());
// let meta: &Meta = unsafe { transmute(&meta1) };
// if meta.src_id == remote_id && meta.dst_id == local_id && meta.reversed == 0
// {
// addr = addr1;
// remote_secret.encrypt(payload);
// writer.write_all(payload);
// }
// }
let recv_buf2: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) };
if let Some(packet) = Ipv4Packet::new(recv_buf2) {
let header_length = packet.get_header_length() as usize * 4;
let (header, data) = recv_buf2.split_at_mut(header_length);
let (meta1, payload) = data.split_at_mut(size_of::<Meta>());
let meta: &Meta = unsafe { transmute(&meta1) };
if meta.src_id == remote_id && meta.dst_id == local_id && meta.reversed == 0
{
let mut addr_lock = remote_addr_clone.lock().unwrap();
*addr_lock = Some(addr1);
local_secret.decrypt(payload);
writer.write(payload);
}
}
}
Err(e) => {
eprintln!("接收数据包时出错: {:?}", e);
......@@ -85,13 +106,38 @@ fn main() -> Result<(), Box<dyn Error>> {
});
let outbound = thread::spawn(move || {
let mut recv_buf = [0u8; 1500-20-4];
let mut recv_buf = [0u8; 1500 - 20];
let meta = Meta {
src_id: local_id,
dst_id: remote_id,
reversed: 0,
};
let meta_size = size_of::<Meta>();
unsafe {
let meta_bytes =
std::slice::from_raw_parts(&meta as *const Meta as *const u8, meta_size);
recv_buf[..meta_size].copy_from_slice(meta_bytes);
}
loop {
match reader.read(&mut recv_buf) {
match reader.read(&mut recv_buf[meta_size..]) {
Ok(len) => {
println!("recv from {:?}", recv_buf);
socket.send_to(&recv_buf, &remote_address);
println!("recv from {:?}", &recv_buf[meta_size..meta_size + len]);
let maybe_remote = remote_addr.lock().unwrap().clone();
println!("1");
if let Some(ref remote) = maybe_remote {
println!("2");
let sock_guard = socket_arc.lock().unwrap();
println!("3");
remote_secret.encrypt(&mut recv_buf[meta_size..meta_size + len]);
println!("4");
if let Err(e) = sock_guard.send_to(&recv_buf[..meta_size + len], remote) {
println!("5");
eprintln!("Error sending packet: {:?}", e);
}
} else {
eprintln!("No remote address available; packet discarded.");
}
}
Err(_) => {}
}
......@@ -100,6 +146,6 @@ fn main() -> Result<(), Box<dyn Error>> {
inbound.join();
outbound.join();
Ok(())
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment