mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-06-19 23:50:55 +00:00
Merge branch 'master' of https://github.com/sujiacong/tun2proxy
This commit is contained in:
commit
87c2b666ab
4 changed files with 40 additions and 13 deletions
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "tun2proxy"
|
name = "tun2proxy"
|
||||||
version = "0.5.1"
|
version = "0.5.4"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/tun2proxy/tun2proxy"
|
repository = "https://github.com/tun2proxy/tun2proxy"
|
||||||
|
|
10
src/args.rs
10
src/args.rs
|
@ -107,6 +107,14 @@ pub struct Args {
|
||||||
/// Daemonize for unix family or run as Windows service
|
/// Daemonize for unix family or run as Windows service
|
||||||
#[arg(long)]
|
#[arg(long)]
|
||||||
pub daemonize: bool,
|
pub daemonize: bool,
|
||||||
|
|
||||||
|
/// Exit immediately when fatal error occurs, useful for running as a service
|
||||||
|
#[arg(long)]
|
||||||
|
pub exit_on_fatal_error: bool,
|
||||||
|
|
||||||
|
/// Maximum number of sessions to be handled concurrently
|
||||||
|
#[arg(long, value_name = "number", default_value = "200")]
|
||||||
|
pub max_sessions: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn validate_tun(p: &str) -> Result<String> {
|
fn validate_tun(p: &str) -> Result<String> {
|
||||||
|
@ -149,6 +157,8 @@ impl Default for Args {
|
||||||
verbosity: ArgVerbosity::Info,
|
verbosity: ArgVerbosity::Info,
|
||||||
virtual_dns_pool: IpCidr::from_str("198.18.0.0/15").unwrap(),
|
virtual_dns_pool: IpCidr::from_str("198.18.0.0/15").unwrap(),
|
||||||
daemonize: false,
|
daemonize: false,
|
||||||
|
exit_on_fatal_error: false,
|
||||||
|
max_sessions: 200,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use tun2proxy::{Args, BoxError};
|
use tun2proxy::{Args, BoxError};
|
||||||
|
|
||||||
#[tokio::main]
|
fn main() -> Result<(), BoxError> {
|
||||||
async fn main() -> Result<(), BoxError> {
|
|
||||||
dotenvy::dotenv().ok();
|
dotenvy::dotenv().ok();
|
||||||
let args = Args::parse_args();
|
let args = Args::parse_args();
|
||||||
|
|
||||||
|
@ -24,11 +23,16 @@ async fn main() -> Result<(), BoxError> {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rt = tokio::runtime::Builder::new_multi_thread().enable_all().build()?;
|
||||||
|
rt.block_on(main_async(args))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn main_async(args: Args) -> Result<(), BoxError> {
|
||||||
let default = format!("{:?},hickory_proto=warn", args.verbosity);
|
let default = format!("{:?},hickory_proto=warn", args.verbosity);
|
||||||
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(default)).init();
|
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(default)).init();
|
||||||
|
|
||||||
let shutdown_token = tokio_util::sync::CancellationToken::new();
|
let shutdown_token = tokio_util::sync::CancellationToken::new();
|
||||||
let join_handle = tokio::spawn({
|
let main_loop_handle = tokio::spawn({
|
||||||
let shutdown_token = shutdown_token.clone();
|
let shutdown_token = shutdown_token.clone();
|
||||||
async move {
|
async move {
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
|
@ -51,14 +55,20 @@ async fn main() -> Result<(), BoxError> {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ctrlc2::set_async_handler(async move {
|
let ctrlc_fired = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false));
|
||||||
|
let ctrlc_fired_clone = ctrlc_fired.clone();
|
||||||
|
let ctrlc_handel = ctrlc2::set_async_handler(async move {
|
||||||
log::info!("Ctrl-C received, exiting...");
|
log::info!("Ctrl-C received, exiting...");
|
||||||
|
ctrlc_fired_clone.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||||
shutdown_token.cancel();
|
shutdown_token.cancel();
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
if let Err(err) = join_handle.await {
|
main_loop_handle.await?;
|
||||||
log::error!("main_entry error {}", err);
|
|
||||||
|
if ctrlc_fired.load(std::sync::atomic::Ordering::SeqCst) {
|
||||||
|
log::info!("Ctrl-C fired, waiting the handler to finish...");
|
||||||
|
ctrlc_handel.await.map_err(|err| err.to_string())?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
19
src/lib.rs
19
src/lib.rs
|
@ -68,8 +68,6 @@ pub mod win_svc;
|
||||||
|
|
||||||
const DNS_PORT: u16 = 53;
|
const DNS_PORT: u16 = 53;
|
||||||
|
|
||||||
const MAX_SESSIONS: u64 = 200;
|
|
||||||
|
|
||||||
static TASK_COUNT: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0);
|
static TASK_COUNT: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0);
|
||||||
use std::sync::atomic::Ordering::Relaxed;
|
use std::sync::atomic::Ordering::Relaxed;
|
||||||
|
|
||||||
|
@ -260,10 +258,15 @@ where
|
||||||
ip_stack_stream?
|
ip_stack_stream?
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let max_sessions = args.max_sessions as u64;
|
||||||
match ip_stack_stream {
|
match ip_stack_stream {
|
||||||
IpStackStream::Tcp(tcp) => {
|
IpStackStream::Tcp(tcp) => {
|
||||||
if TASK_COUNT.load(Relaxed) > MAX_SESSIONS {
|
if TASK_COUNT.load(Relaxed) > max_sessions {
|
||||||
log::warn!("Too many sessions that over {MAX_SESSIONS}, dropping new session");
|
if args.exit_on_fatal_error {
|
||||||
|
log::info!("Too many sessions that over {max_sessions}, exiting...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
log::warn!("Too many sessions that over {max_sessions}, dropping new session");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1);
|
log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1);
|
||||||
|
@ -286,8 +289,12 @@ where
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
IpStackStream::Udp(udp) => {
|
IpStackStream::Udp(udp) => {
|
||||||
if TASK_COUNT.load(Relaxed) > MAX_SESSIONS {
|
if TASK_COUNT.load(Relaxed) > max_sessions {
|
||||||
log::warn!("Too many sessions that over {MAX_SESSIONS}, dropping new session");
|
if args.exit_on_fatal_error {
|
||||||
|
log::info!("Too many sessions that over {max_sessions}, exiting...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
log::warn!("Too many sessions that over {max_sessions}, dropping new session");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1);
|
log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue