Implement SOCKS5 authentication

This commit is contained in:
B. Blechschmidt 2023-03-22 01:02:27 +01:00
parent c1aaec6159
commit d2aef08e3c
5 changed files with 244 additions and 121 deletions

View file

@ -1,6 +1,9 @@
use std::net::SocketAddr;
use clap::{Parser, ValueEnum};
use env_logger::Env;
use std::net::SocketAddr;
use tun2proxy::tun2proxy::Credentials;
use tun2proxy::{main_entry, ProxyType};
/// Tunnel interface to proxy
@ -18,6 +21,14 @@ struct Args {
/// Server address with format ip:port
#[clap(short, long, value_name = "ip:port")]
addr: SocketAddr,
/// Username for authentication
#[clap(long, value_name = "username")]
username: Option<String>,
/// Username for authentication
#[clap(long, value_name = "password")]
password: Option<String>,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
@ -32,14 +43,23 @@ fn main() {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let args = Args::parse();
let credentials = if args.username.is_some() || args.password.is_some() {
Credentials::new(
args.username.unwrap_or(String::from("")),
args.password.unwrap_or(String::from("")),
)
} else {
Credentials::none()
};
match args.proxy_type {
ArgProxyType::Socks5 => {
log::info!("SOCKS5 server: {}", args.addr);
main_entry(&args.tun, args.addr, ProxyType::Socks5);
main_entry(&args.tun, args.addr, ProxyType::Socks5, credentials);
}
ArgProxyType::Http => {
log::info!("HTTP server: {}", args.addr);
main_entry(&args.tun, args.addr, ProxyType::Http);
main_entry(&args.tun, args.addr, ProxyType::Http, credentials);
}
}
}