tun2proxy/src/main.rs

85 lines
2.2 KiB
Rust
Raw Normal View History

2023-03-22 11:17:28 +01:00
use clap::Parser;
2022-08-16 16:18:25 +02:00
use env_logger::Env;
2023-03-26 11:02:13 +02:00
use std::net::IpAddr;
2023-03-25 21:41:40 +01:00
use std::process::ExitCode;
2023-03-22 01:02:27 +01:00
2023-03-25 21:12:41 +01:00
use tun2proxy::setup::{get_default_cidrs, Setup};
use tun2proxy::Options;
use tun2proxy::{main_entry, Proxy};
2023-03-20 14:13:06 +08:00
/// Tunnel interface to proxy
#[derive(Parser)]
#[command(author, version, about = "Tunnel interface to proxy.", long_about = None)]
struct Args {
/// Name of the tun interface
2023-03-22 11:17:28 +01:00
#[arg(short, long, value_name = "name", default_value = "tun0")]
2023-03-20 14:13:06 +08:00
tun: String,
/// Proxy URL in the form proto://[username[:password]@]host:port
#[arg(short, long, value_parser = Proxy::from_url, value_name = "URL")]
proxy: Proxy,
/// DNS handling
#[arg(
short,
long,
value_name = "method",
value_enum,
default_value = "virtual"
)]
dns: ArgDns,
2023-03-25 21:12:41 +01:00
2023-03-26 00:46:59 +01:00
/// Routing and system setup
2023-03-25 21:12:41 +01:00
#[arg(short, long, value_name = "method", value_enum)]
2023-03-26 00:46:59 +01:00
setup: Option<ArgSetup>,
2023-03-26 11:02:13 +02:00
2023-03-26 11:07:06 +02:00
/// Public proxy IP used in routing setup
#[arg(long, value_name = "IP")]
2023-03-26 11:02:13 +02:00
setup_ip: Option<IpAddr>,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
enum ArgDns {
Virtual,
None,
2023-03-22 11:17:28 +01:00
}
2023-03-25 21:12:41 +01:00
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
enum ArgSetup {
Auto,
}
2023-03-25 21:41:40 +01:00
fn main() -> ExitCode {
2023-03-23 13:28:05 +01:00
dotenvy::dotenv().ok();
2023-03-22 11:17:28 +01:00
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let args = Args::parse();
let addr = args.proxy.addr;
let proxy_type = args.proxy.proxy_type;
log::info!("Proxy {proxy_type} server: {addr}");
let mut options = Options::new();
if args.dns == ArgDns::Virtual {
options = options.with_virtual_dns();
}
2023-03-25 21:12:41 +01:00
let mut setup: Setup;
2023-03-26 00:46:59 +01:00
if args.setup == Some(ArgSetup::Auto) {
2023-03-26 11:02:13 +02:00
let bypass_tun_ip = match args.setup_ip {
Some(addr) => addr,
None => args.proxy.addr.ip(),
};
setup = Setup::new(&args.tun, &bypass_tun_ip, get_default_cidrs());
2023-03-25 21:12:41 +01:00
if let Err(e) = setup.setup() {
log::error!("{e}");
2023-03-25 21:41:40 +01:00
return ExitCode::FAILURE;
2023-03-25 21:12:41 +01:00
}
}
2023-03-24 09:27:31 +08:00
if let Err(e) = main_entry(&args.tun, args.proxy, options) {
log::error!("{e}");
2023-03-25 21:41:40 +01:00
return ExitCode::FAILURE;
2023-03-24 09:27:31 +08:00
}
2023-03-25 21:41:40 +01:00
ExitCode::SUCCESS
2021-09-02 11:30:23 +02:00
}