Commit 657a3912 authored by nanamicat's avatar nanamicat

init

parents
/.idea/
/target
This diff is collapsed.
[package]
name = "tun1"
version = "0.1.0"
edition = "2021"
[dependencies]
tun = "0.7"
socket2 = { version = "0.5.8", features = ["all"] }
#pnet = "0.35.0"
#pnet_macros = "0.35.0"
use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use std::error::Error;
use std::io::{BufRead, Write};
use std::mem::{transmute, MaybeUninit};
use std::{env, thread};
#[repr(C)]
pub struct Meta {
pub src_id: u8,
pub dst_id: u8,
pub reversed: u16,
}
struct Secret {
key: Vec<u8>,
}
impl Secret {
fn new(key: &String) -> Secret {
Secret {
key: key.as_bytes().to_vec(),
}
}
fn encrypt(&self, data: &mut [u8]) {
for (i, byte) in data.iter_mut().enumerate() {
*byte ^= self.key[i % self.key.len()];
}
}
fn decrypt(&self, data: &mut [u8]) {
self.encrypt(data);
}
}
fn main() -> Result<(), Box<dyn Error>> {
let local_id: u8 = env::var("LOCAL_ID")?.parse()?;
let remote_id: u8 = env::var("LOCAL_ID")?.parse()?;
let local_secret = Secret::new(&env::var("LOCAL_SECRET")?);
let remote_secret = Secret::new(&env::var("REMOTE_SECRET")?);
let mut config = tun::Configuration::default();
config
.address((10, 0, 0, 9))
.netmask((255, 255, 255, 0))
.destination((10, 0, 0, 1))
.up();
#[cfg(target_os = "linux")]
config.platform_config(|config| {
config.ensure_root_privileges(true);
});
let mut dev = tun::create(&config)?;
let (mut reader, mut writer) = dev.split();
// 创建用于接收的原始套接字,协议号为 144
let socket = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::from(144)))?;
let local_id = 0u8;
let remote_id = 0u8;
let inbound = thread::spawn(move || {
let mut recv_buf = [MaybeUninit::uninit(); 1500];
let mut addr: SockAddr;
loop {
match socket.recv_from(&mut recv_buf) {
Ok((len, 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);
// }
// }
}
Err(e) => {
eprintln!("接收数据包时出错: {:?}", e);
}
}
}
});
inbound.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