safer handle_intranet
This commit is contained in:
parent
83c45d772f
commit
1c3a2e475d
@ -1011,6 +1011,11 @@ impl Config {
|
|||||||
CONFIG2.read().unwrap().socks.clone()
|
CONFIG2.read().unwrap().socks.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_proxy() -> bool {
|
||||||
|
Self::get_network_type() != NetworkType::Direct
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_network_type() -> NetworkType {
|
pub fn get_network_type() -> NetworkType {
|
||||||
match &CONFIG2.read().unwrap().socks {
|
match &CONFIG2.read().unwrap().socks {
|
||||||
None => NetworkType::Direct,
|
None => NetworkType::Direct,
|
||||||
|
@ -453,25 +453,41 @@ impl RendezvousMediator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_intranet(&self, fla: FetchLocalAddr, server: ServerPtr) -> ResultType<()> {
|
async fn handle_intranet(&self, fla: FetchLocalAddr, server: ServerPtr) -> ResultType<()> {
|
||||||
let relay_server = self.get_relay_server(fla.relay_server);
|
let relay_server = self.get_relay_server(fla.relay_server.clone());
|
||||||
if !is_ipv4(&self.addr) || config::is_disable_tcp_listen() {
|
// nat64, go relay directly, because current hbbs will crash if demangle ipv6 address
|
||||||
// nat64, go relay directly, because current hbbs will crash if demangle ipv6 address
|
if is_ipv4(&self.addr) && !config::is_disable_tcp_listen() && !Config::is_proxy() {
|
||||||
let uuid = Uuid::new_v4().to_string();
|
if let Err(err) = self
|
||||||
return self
|
.handle_intranet_(fla.clone(), server.clone(), relay_server.clone())
|
||||||
.create_relay(
|
.await
|
||||||
fla.socket_addr.into(),
|
{
|
||||||
relay_server,
|
log::debug!("Failed to handle intranet: {:?}, will try relay", err);
|
||||||
uuid,
|
} else {
|
||||||
server,
|
return Ok(());
|
||||||
true,
|
}
|
||||||
true,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
}
|
}
|
||||||
|
let uuid = Uuid::new_v4().to_string();
|
||||||
|
self.create_relay(
|
||||||
|
fla.socket_addr.into(),
|
||||||
|
relay_server,
|
||||||
|
uuid,
|
||||||
|
server,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn handle_intranet_(
|
||||||
|
&self,
|
||||||
|
fla: FetchLocalAddr,
|
||||||
|
server: ServerPtr,
|
||||||
|
relay_server: String,
|
||||||
|
) -> ResultType<()> {
|
||||||
let peer_addr = AddrMangle::decode(&fla.socket_addr);
|
let peer_addr = AddrMangle::decode(&fla.socket_addr);
|
||||||
log::debug!("Handle intranet from {:?}", peer_addr);
|
log::debug!("Handle intranet from {:?}", peer_addr);
|
||||||
let mut socket = connect_tcp(&*self.host, CONNECT_TIMEOUT).await?;
|
let mut socket = connect_tcp(&*self.host, CONNECT_TIMEOUT).await?;
|
||||||
let local_addr = socket.local_addr();
|
let local_addr = socket.local_addr();
|
||||||
|
// we saw invalid local_addr while using proxy, local_addr.ip() == "::1"
|
||||||
let local_addr: SocketAddr =
|
let local_addr: SocketAddr =
|
||||||
format!("{}:{}", local_addr.ip(), local_addr.port()).parse()?;
|
format!("{}:{}", local_addr.ip(), local_addr.port()).parse()?;
|
||||||
let mut msg_out = Message::new();
|
let mut msg_out = Message::new();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user