2021-09-02 11:30:23 +02:00
|
|
|
mod http;
|
2022-08-01 14:36:58 +00:00
|
|
|
mod socks5;
|
2021-09-02 11:30:23 +02:00
|
|
|
mod tun2proxy;
|
2022-08-01 14:36:58 +00:00
|
|
|
mod virtdevice;
|
2021-09-02 11:30:23 +02:00
|
|
|
|
|
|
|
use crate::http::HttpManager;
|
|
|
|
use crate::tun2proxy::TunToProxy;
|
2022-08-01 14:36:58 +00:00
|
|
|
use socks5::*;
|
2021-09-02 21:02:17 +02:00
|
|
|
use std::net::ToSocketAddrs;
|
2021-09-02 11:30:23 +02:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let matches = clap::App::new(env!("CARGO_PKG_NAME"))
|
|
|
|
.version(env!("CARGO_PKG_VERSION"))
|
|
|
|
.about("Tunnel interface to proxy.")
|
2022-08-01 14:36:58 +00:00
|
|
|
.arg(
|
|
|
|
clap::Arg::with_name("tun")
|
|
|
|
.short('t')
|
|
|
|
.long("tun")
|
|
|
|
.value_name("TUN")
|
|
|
|
.help("Name of the tun interface")
|
|
|
|
.required(true)
|
|
|
|
.takes_value(true),
|
|
|
|
)
|
|
|
|
.arg(
|
|
|
|
clap::Arg::with_name("socks5_server")
|
|
|
|
.help("SOCKS5 server to use")
|
|
|
|
.short('s')
|
|
|
|
.long("socks5")
|
|
|
|
.value_name("IP:PORT"),
|
|
|
|
)
|
|
|
|
.arg(
|
|
|
|
clap::Arg::with_name("http_server")
|
|
|
|
.help("HTTP server to use")
|
|
|
|
.short('h')
|
|
|
|
.long("http")
|
|
|
|
.value_name("IP:PORT"),
|
|
|
|
)
|
2021-09-02 11:30:23 +02:00
|
|
|
.get_matches();
|
|
|
|
|
2022-08-01 14:36:58 +00:00
|
|
|
if matches.value_of("socks5_server").is_some() && matches.value_of("http_server").is_some()
|
|
|
|
|| matches.value_of("socks5_server").is_none() && matches.value_of("http_server").is_none()
|
|
|
|
{
|
2021-09-02 11:30:23 +02:00
|
|
|
eprintln!("You need to specify exactly one server.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let tun_name = matches.value_of("tun").unwrap();
|
|
|
|
let mut ttp = TunToProxy::new(tun_name);
|
|
|
|
if let Some(addr) = matches.value_of("socks5_server") {
|
2022-08-01 14:36:58 +00:00
|
|
|
if let Ok(mut servers) = addr.to_socket_addrs() {
|
2021-09-02 21:02:17 +02:00
|
|
|
let server = servers.next().unwrap();
|
|
|
|
println!("SOCKS5 server: {}", server);
|
2021-09-02 11:30:23 +02:00
|
|
|
ttp.add_connection_manager(Box::new(Socks5Manager::new(server)));
|
|
|
|
} else {
|
|
|
|
eprintln!("Invalid server address.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if let Some(addr) = matches.value_of("http_server") {
|
2022-08-01 14:36:58 +00:00
|
|
|
if let Ok(mut servers) = addr.to_socket_addrs() {
|
2021-09-02 21:02:17 +02:00
|
|
|
let server = servers.next().unwrap();
|
|
|
|
println!("HTTP server: {}", server);
|
2021-09-02 11:30:23 +02:00
|
|
|
ttp.add_connection_manager(Box::new(HttpManager::new(server)));
|
|
|
|
} else {
|
|
|
|
eprintln!("Invalid server address.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ttp.run();
|
|
|
|
}
|