mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-04-22 23:09:09 +00:00
IPv6 enabled
This commit is contained in:
parent
e518355756
commit
d7861128f4
3 changed files with 24 additions and 9 deletions
|
@ -99,6 +99,7 @@ pub struct Options {
|
||||||
virtual_dns: Option<virtdns::VirtualDns>,
|
virtual_dns: Option<virtdns::VirtualDns>,
|
||||||
mtu: Option<usize>,
|
mtu: Option<usize>,
|
||||||
dns_over_tcp: bool,
|
dns_over_tcp: bool,
|
||||||
|
ipv6_enabled: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Options {
|
impl Options {
|
||||||
|
@ -118,6 +119,11 @@ impl Options {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_ipv6(mut self) -> Self {
|
||||||
|
self.ipv6_enabled = true;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn with_mtu(mut self, mtu: usize) -> Self {
|
pub fn with_mtu(mut self, mtu: usize) -> Self {
|
||||||
self.mtu = Some(mtu);
|
self.mtu = Some(mtu);
|
||||||
self
|
self
|
||||||
|
|
16
src/main.rs
16
src/main.rs
|
@ -29,6 +29,14 @@ struct Args {
|
||||||
#[arg(short, long, value_name = "method", value_enum, default_value = "virtual")]
|
#[arg(short, long, value_name = "method", value_enum, default_value = "virtual")]
|
||||||
dns: ArgDns,
|
dns: ArgDns,
|
||||||
|
|
||||||
|
/// Enable DNS over TCP
|
||||||
|
#[arg(long)]
|
||||||
|
dns_over_tcp: bool,
|
||||||
|
|
||||||
|
/// IPv6 enabled
|
||||||
|
#[arg(short = '6', long)]
|
||||||
|
ipv6_enabled: bool,
|
||||||
|
|
||||||
/// Routing and system setup
|
/// Routing and system setup
|
||||||
#[arg(short, long, value_name = "method", value_enum)]
|
#[arg(short, long, value_name = "method", value_enum)]
|
||||||
setup: Option<ArgSetup>,
|
setup: Option<ArgSetup>,
|
||||||
|
@ -40,10 +48,6 @@ struct Args {
|
||||||
/// Verbosity level
|
/// Verbosity level
|
||||||
#[arg(short, long, value_name = "level", value_enum, default_value = "info")]
|
#[arg(short, long, value_name = "level", value_enum, default_value = "info")]
|
||||||
verbosity: ArgVerbosity,
|
verbosity: ArgVerbosity,
|
||||||
|
|
||||||
/// Enable DNS over TCP
|
|
||||||
#[arg(long)]
|
|
||||||
dns_over_tcp: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
|
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
|
||||||
|
@ -87,6 +91,10 @@ fn main() -> ExitCode {
|
||||||
options = options.with_dns_over_tcp();
|
options = options.with_dns_over_tcp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if args.ipv6_enabled {
|
||||||
|
options = options.with_ipv6();
|
||||||
|
}
|
||||||
|
|
||||||
let interface = match args.tun_fd {
|
let interface = match args.tun_fd {
|
||||||
None => NetworkInterface::Named(args.tun.clone()),
|
None => NetworkInterface::Named(args.tun.clone()),
|
||||||
Some(fd) => {
|
Some(fd) => {
|
||||||
|
|
|
@ -184,7 +184,6 @@ struct ConnectionState {
|
||||||
udp_origin_dst: Option<SocketAddr>,
|
udp_origin_dst: Option<SocketAddr>,
|
||||||
udp_data_cache: LinkedList<Vec<u8>>,
|
udp_data_cache: LinkedList<Vec<u8>>,
|
||||||
udp_over_tcp_expiry: Option<::std::time::Instant>,
|
udp_over_tcp_expiry: Option<::std::time::Instant>,
|
||||||
is_tcp_dns: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) trait TcpProxy {
|
pub(crate) trait TcpProxy {
|
||||||
|
@ -494,7 +493,6 @@ impl<'a> TunToProxy<'a> {
|
||||||
let tcp_proxy_handler = manager.new_tcp_proxy(info, false)?;
|
let tcp_proxy_handler = manager.new_tcp_proxy(info, false)?;
|
||||||
let server_addr = manager.get_server_addr();
|
let server_addr = manager.get_server_addr();
|
||||||
let mut state = self.create_new_tcp_connection_state(server_addr, origin_dst, tcp_proxy_handler, false)?;
|
let mut state = self.create_new_tcp_connection_state(server_addr, origin_dst, tcp_proxy_handler, false)?;
|
||||||
state.is_tcp_dns = true;
|
|
||||||
state.udp_origin_dst = Some(SocketAddr::try_from(original_info.dst.clone())?);
|
state.udp_origin_dst = Some(SocketAddr::try_from(original_info.dst.clone())?);
|
||||||
self.connection_map.insert(info.clone(), state);
|
self.connection_map.insert(info.clone(), state);
|
||||||
|
|
||||||
|
@ -578,7 +576,9 @@ impl<'a> TunToProxy<'a> {
|
||||||
.tcp_proxy_handler
|
.tcp_proxy_handler
|
||||||
.consume_data(OutgoingDirection::ToClient, len + 2);
|
.consume_data(OutgoingDirection::ToClient, len + 2);
|
||||||
|
|
||||||
dns::remove_ipv6_entries(&mut message); // TODO: Configurable
|
if !self.options.ipv6_enabled {
|
||||||
|
dns::remove_ipv6_entries(&mut message);
|
||||||
|
}
|
||||||
|
|
||||||
to_send.push_back(message.to_vec()?);
|
to_send.push_back(message.to_vec()?);
|
||||||
if len + 2 == buf.len() {
|
if len + 2 == buf.len() {
|
||||||
|
@ -778,7 +778,6 @@ impl<'a> TunToProxy<'a> {
|
||||||
udp_origin_dst: None,
|
udp_origin_dst: None,
|
||||||
udp_data_cache: LinkedList::new(),
|
udp_data_cache: LinkedList::new(),
|
||||||
udp_over_tcp_expiry: None,
|
udp_over_tcp_expiry: None,
|
||||||
is_tcp_dns: false,
|
|
||||||
};
|
};
|
||||||
Ok(state)
|
Ok(state)
|
||||||
}
|
}
|
||||||
|
@ -929,7 +928,9 @@ impl<'a> TunToProxy<'a> {
|
||||||
|
|
||||||
let buf = if info.dst.port() == DNS_PORT {
|
let buf = if info.dst.port() == DNS_PORT {
|
||||||
let mut message = dns::parse_data_to_dns_message(&buf[header.len()..], false)?;
|
let mut message = dns::parse_data_to_dns_message(&buf[header.len()..], false)?;
|
||||||
dns::remove_ipv6_entries(&mut message); // TODO: Configurable
|
if !self.options.ipv6_enabled {
|
||||||
|
dns::remove_ipv6_entries(&mut message);
|
||||||
|
}
|
||||||
message.to_vec()?
|
message.to_vec()?
|
||||||
} else {
|
} else {
|
||||||
buf[header.len()..].to_vec()
|
buf[header.len()..].to_vec()
|
||||||
|
|
Loading…
Add table
Reference in a new issue