mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-14 13:47:24 +08:00
fix udp proxy disconn unexpectedly (#321)
This commit is contained in:
@@ -4,6 +4,7 @@ use std::{
|
|||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crossbeam::atomic::AtomicCell;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use pnet::packet::{
|
use pnet::packet::{
|
||||||
ip::IpNextHeaderProtocols,
|
ip::IpNextHeaderProtocols,
|
||||||
@@ -49,6 +50,7 @@ struct UdpNatEntry {
|
|||||||
forward_task: Mutex<Option<JoinHandle<()>>>,
|
forward_task: Mutex<Option<JoinHandle<()>>>,
|
||||||
stopped: AtomicBool,
|
stopped: AtomicBool,
|
||||||
start_time: std::time::Instant,
|
start_time: std::time::Instant,
|
||||||
|
last_active_time: AtomicCell<std::time::Instant>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UdpNatEntry {
|
impl UdpNatEntry {
|
||||||
@@ -72,6 +74,7 @@ impl UdpNatEntry {
|
|||||||
forward_task: Mutex::new(None),
|
forward_task: Mutex::new(None),
|
||||||
stopped: AtomicBool::new(false),
|
stopped: AtomicBool::new(false),
|
||||||
start_time: std::time::Instant::now(),
|
start_time: std::time::Instant::now(),
|
||||||
|
last_active_time: AtomicCell::new(std::time::Instant::now()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +144,7 @@ impl UdpNatEntry {
|
|||||||
|
|
||||||
loop {
|
loop {
|
||||||
let (len, src_socket) = match timeout(
|
let (len, src_socket) = match timeout(
|
||||||
Duration::from_secs(30),
|
Duration::from_secs(120),
|
||||||
self.socket.recv_from(&mut udp_body),
|
self.socket.recv_from(&mut udp_body),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
@@ -167,6 +170,8 @@ impl UdpNatEntry {
|
|||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.mark_active();
|
||||||
|
|
||||||
if src_v4.ip().is_loopback() {
|
if src_v4.ip().is_loopback() {
|
||||||
src_v4.set_ip(virtual_ipv4);
|
src_v4.set_ip(virtual_ipv4);
|
||||||
}
|
}
|
||||||
@@ -189,6 +194,14 @@ impl UdpNatEntry {
|
|||||||
|
|
||||||
self.stop();
|
self.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn mark_active(&self) {
|
||||||
|
self.last_active_time.store(std::time::Instant::now());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_active(&self) -> bool {
|
||||||
|
self.last_active_time.load().elapsed().as_secs() < 180
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -287,6 +300,8 @@ impl UdpProxy {
|
|||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nat_entry.mark_active();
|
||||||
|
|
||||||
// TODO: should it be async.
|
// TODO: should it be async.
|
||||||
let dst_socket = if Some(ipv4.get_destination()) == self.global_ctx.get_ipv4() {
|
let dst_socket = if Some(ipv4.get_destination()) == self.global_ctx.get_ipv4() {
|
||||||
format!("127.0.0.1:{}", udp_packet.get_destination())
|
format!("127.0.0.1:{}", udp_packet.get_destination())
|
||||||
@@ -360,7 +375,7 @@ impl UdpProxy {
|
|||||||
loop {
|
loop {
|
||||||
tokio::time::sleep(Duration::from_secs(15)).await;
|
tokio::time::sleep(Duration::from_secs(15)).await;
|
||||||
nat_table.retain(|_, v| {
|
nat_table.retain(|_, v| {
|
||||||
if v.start_time.elapsed().as_secs() > 120 {
|
if !v.is_active() {
|
||||||
tracing::info!(?v, "udp nat table entry removed");
|
tracing::info!(?v, "udp nat table entry removed");
|
||||||
v.stop();
|
v.stop();
|
||||||
false
|
false
|
||||||
|
|||||||
Reference in New Issue
Block a user