Commit 2fdc99d8 authored by nanamicat's avatar nanamicat

tcp

parent 2337b2b3
mod router; mod router;
use crate::router::{Meta, Router, META_SIZE, SECRET_LENGTH};
use crate::Schema::{TCP, UDP}; use crate::Schema::{TCP, UDP};
use crate::router::{META_SIZE, Meta, Router, SECRET_LENGTH};
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use crossbeam::epoch::{pin, Owned}; use crossbeam::epoch::{Owned, pin};
use crossbeam_utils::thread; use crossbeam_utils::thread;
use itertools::Itertools; use itertools::Itertools;
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
use socket2::Domain; use socket2::Domain;
use std::net::Shutdown; use std::net::Shutdown;
use std::sync::Arc;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use std::time::Duration; use std::time::Duration;
use std::{collections::HashMap, env, mem::MaybeUninit, sync::Arc}; use std::{collections::HashMap, env, mem::MaybeUninit};
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Config { pub struct Config {
...@@ -63,8 +64,7 @@ fn main() -> Result<()> { ...@@ -63,8 +64,7 @@ fn main() -> Result<()> {
let config = serde_json::from_str::<Config>(env::args().nth(1).context("need param")?.as_str())?; let config = serde_json::from_str::<Config>(env::args().nth(1).context("need param")?.as_str())?;
let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?; let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?;
let routers = Arc::new( let routers = config
config
.routers .routers
.iter() .iter()
.cloned() .cloned()
...@@ -73,8 +73,7 @@ fn main() -> Result<()> { ...@@ -73,8 +73,7 @@ fn main() -> Result<()> {
let remote_id = c.remote_id; let remote_id = c.remote_id;
Router::new(c, config.local_id).map(|r| (remote_id, r)) Router::new(c, config.local_id).map(|r| (remote_id, r))
}) })
.collect::<Result<HashMap<u8, Router>, _>>()?, .collect::<Result<HashMap<u8, Router>, _>>()?;
);
for (_, group) in &routers for (_, group) in &routers
.values() .values()
...@@ -89,7 +88,7 @@ fn main() -> Result<()> { ...@@ -89,7 +88,7 @@ fn main() -> Result<()> {
thread::scope(|s| { thread::scope(|s| {
// IP, UDP // IP, UDP
for router in routers.values().filter(|&r| !(r.config.schema != TCP)) { for router in routers.values().filter(|&r| r.config.schema != TCP) {
s.spawn(|_| { s.spawn(|_| {
router.handle_outbound_ip_udp(config.local_id); router.handle_outbound_ip_udp(config.local_id);
}); });
......
use crate::{ConfigRouter, Schema}; use crate::{ConfigRouter, Schema};
use anyhow::{bail, ensure, Error, Result}; use anyhow::{Error, Result, bail, ensure};
use base64::prelude::BASE64_STANDARD;
use base64::Engine; use base64::Engine;
use base64::prelude::BASE64_STANDARD;
use socket2::{Domain, Protocol, SockAddr, SockFilter, Socket, Type}; use socket2::{Domain, Protocol, SockAddr, SockFilter, Socket, Type};
use std::net::Shutdown; use std::net::Shutdown;
use std::sync::Arc;
use std::{ use std::{
ffi::c_void, ffi::c_void,
mem::MaybeUninit, mem::MaybeUninit,
...@@ -12,15 +13,13 @@ use std::{ ...@@ -12,15 +13,13 @@ use std::{
os::fd::{AsRawFd, FromRawFd}, os::fd::{AsRawFd, FromRawFd},
process::{Command, ExitStatus}, process::{Command, ExitStatus},
sync::atomic::Ordering, sync::atomic::Ordering,
sync::Arc,
}; };
use tun::Device; use tun::Device;
use crate::Schema::IP; use crossbeam::epoch::{Atomic, pin};
use crossbeam::epoch::{pin, Atomic};
use libc::{ use libc::{
setsockopt, sock_filter, sock_fprog, socklen_t, BPF_ABS, BPF_B, BPF_IND, BPF_JEQ, BPF_JMP, BPF_K, BPF_LD, BPF_LDX, BPF_MSH, BPF_RET, BPF_W, BPF_ABS, BPF_B, BPF_IND, BPF_JEQ, BPF_JMP, BPF_K, BPF_LD, BPF_LDX, BPF_MSH, BPF_RET, BPF_W, MSG_FASTOPEN, SO_ATTACH_REUSEPORT_CBPF, SOL_SOCKET, setsockopt,
MSG_FASTOPEN, SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, sock_filter, sock_fprog, socklen_t,
}; };
pub const SECRET_LENGTH: usize = 32; pub const SECRET_LENGTH: usize = 32;
...@@ -46,10 +45,10 @@ pub struct Router { ...@@ -46,10 +45,10 @@ pub struct Router {
pub config: ConfigRouter, pub config: ConfigRouter,
pub secret: [u8; SECRET_LENGTH], pub secret: [u8; SECRET_LENGTH],
pub tun: Device, pub tun: Device,
pub socket: Arc<Socket>, pub socket: Socket,
pub endpoint: Arc<Atomic<SockAddr>>, pub endpoint: Atomic<SockAddr>,
pub tcp_listener_connection: Arc<Atomic<Arc<Socket>>>, pub tcp_listener_connection: Atomic<Arc<Socket>>,
} }
impl Router { impl Router {
...@@ -63,8 +62,8 @@ impl Router { ...@@ -63,8 +62,8 @@ impl Router {
} }
} }
pub(crate) fn decrypt2(&self, data: &mut [u8], secret: &[u8; SECRET_LENGTH], range: Range<usize>) { pub(crate) fn decrypt2(&self, data: &mut [u8], secret: &[u8; SECRET_LENGTH], range: Range<usize>) {
for i in range { for (i, b) in data[range.clone()].iter_mut().enumerate() {
data[i] ^= secret[i % SECRET_LENGTH]; *b ^= secret[(range.start + i) % SECRET_LENGTH];
} }
} }
...@@ -253,7 +252,7 @@ impl Router { ...@@ -253,7 +252,7 @@ impl Router {
let packet = unsafe { std::slice::from_raw_parts_mut(recv_buf.as_mut_ptr().cast(), len) }; let packet = unsafe { std::slice::from_raw_parts_mut(recv_buf.as_mut_ptr().cast(), len) };
// if addr.is_ipv6() { println!("{:X?}", packet) } // if addr.is_ipv6() { println!("{:X?}", packet) }
// 只有 ipv4 raw 会给 IP报头 // 只有 ipv4 raw 会给 IP报头
let offset = if self.config.family == Domain::IPV4 && self.config.schema == IP { let offset = if self.config.family == Domain::IPV4 && self.config.schema == Schema::IP {
(packet[0] & 0x0f) as usize * 4 (packet[0] & 0x0f) as usize * 4
} else { } else {
0 0
...@@ -337,8 +336,8 @@ impl Router { ...@@ -337,8 +336,8 @@ impl Router {
Ok(Command::new("sh").args(["-c", config.up.as_str()]).status()?) Ok(Command::new("sh").args(["-c", config.up.as_str()]).status()?)
} }
fn create_endpoint(config: &ConfigRouter) -> Arc<Atomic<SockAddr>> { fn create_endpoint(config: &ConfigRouter) -> Atomic<SockAddr> {
let addr = match (config.endpoint.clone(), config.dst_port) match (config.endpoint.clone(), config.dst_port)
.to_socket_addrs() .to_socket_addrs()
.unwrap_or_default() .unwrap_or_default()
.filter(|a| match config.family { .filter(|a| match config.family {
...@@ -350,9 +349,7 @@ impl Router { ...@@ -350,9 +349,7 @@ impl Router {
{ {
None => Atomic::null(), None => Atomic::null(),
Some(addr) => Atomic::new(addr.into()), Some(addr) => Atomic::new(addr.into()),
}; }
Arc::new(addr)
} }
pub fn new(config: ConfigRouter, local_id: u8) -> Result<Router> { pub fn new(config: ConfigRouter, local_id: u8) -> Result<Router> {
...@@ -360,8 +357,8 @@ impl Router { ...@@ -360,8 +357,8 @@ impl Router {
secret: Self::create_secret(config.remote_secret.as_str())?, secret: Self::create_secret(config.remote_secret.as_str())?,
tun: Self::create_tun_device(&config)?, tun: Self::create_tun_device(&config)?,
endpoint: Self::create_endpoint(&config), endpoint: Self::create_endpoint(&config),
socket: Arc::new(Self::create_socket(&config, local_id)?), socket: Self::create_socket(&config, local_id)?,
tcp_listener_connection: Arc::new(Atomic::null()), tcp_listener_connection: Atomic::null(),
config, config,
}; };
......
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