From 39602c478e8f46de3e6c5bf67504db46414bffaa Mon Sep 17 00:00:00 2001 From: lbl <1791778603@qq.com> Date: Sun, 1 Mar 2026 10:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B7=AF=E5=BE=84=E6=8E=A2?= =?UTF-8?q?=E6=B5=8B=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt-core/src/protocol/ip_packet_protocol.rs | 4 ++++ vnt-core/src/tunnel_core/p2p/inbound.rs | 24 +++++++++++++++++++ .../src/tunnel_core/p2p/transport/task.rs | 18 +++++++------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/vnt-core/src/protocol/ip_packet_protocol.rs b/vnt-core/src/protocol/ip_packet_protocol.rs index 07bbb00..1a16c34 100644 --- a/vnt-core/src/protocol/ip_packet_protocol.rs +++ b/vnt-core/src/protocol/ip_packet_protocol.rs @@ -106,6 +106,8 @@ pub enum MsgType { RpcRes = 15, Quic = 17, + RelayProbe = 18, + RelayProbeReply = 19, } impl From for u8 { fn from(val: MsgType) -> Self { @@ -138,7 +140,9 @@ impl TryFrom for MsgType { 14 => MsgType::RpcReq, 15 => MsgType::RpcRes, + 16 => MsgType::RelayProbe, 17 => MsgType::Quic, + 18 => MsgType::RelayProbeReply, _ => { return Err(io::Error::new( io::ErrorKind::InvalidInput, diff --git a/vnt-core/src/tunnel_core/p2p/inbound.rs b/vnt-core/src/tunnel_core/p2p/inbound.rs index b39209b..8608dbc 100644 --- a/vnt-core/src/tunnel_core/p2p/inbound.rs +++ b/vnt-core/src/tunnel_core/p2p/inbound.rs @@ -261,6 +261,30 @@ impl P2pInboundHandler { } MsgType::PingTurn => {} MsgType::PongTurn => {} + MsgType::RelayProbe => { + let metric = ctx.max_ttl - ctx.ttl; + self.route_table + .add_route_if_absent(ctx.src_ip, Route::from_default_rt(route_key, metric)); + let mut packet = NetPacket::new(TransmissionBytes::zeroed_size( + HEAD_LENGTH, + self.packet_crypto.encrypt_reserve(), + ))?; + packet.set_msg_type(MsgType::RelayProbeReply); + packet.set_ttl(1); + packet.set_src_id(ctx.dest_ip.into()); + packet.set_dest_id(ctx.src_ip.into()); + self.packet_crypto.encrypt_in_place(&mut packet)?; + tunnel + .send_to(packet.into_bytes().into_buffer(), route_key.addr()) + .await?; + } + MsgType::RelayProbeReply => { + let metric = ctx.max_ttl - ctx.ttl; + self.route_table.add_route( + ctx.src_ip, + Route::from_default_rt(route_key, metric), + ); + } _ => {} } Ok(()) diff --git a/vnt-core/src/tunnel_core/p2p/transport/task.rs b/vnt-core/src/tunnel_core/p2p/transport/task.rs index 30fe54a..d0d1eb8 100644 --- a/vnt-core/src/tunnel_core/p2p/transport/task.rs +++ b/vnt-core/src/tunnel_core/p2p/transport/task.rs @@ -240,23 +240,21 @@ pub async fn relay_probe_task( }; for (relay_ip, route_key) in selected_peers { - // 构造Ping消息,目标是target_ip,但发送给relay_ip - let Ok(mut ping) = NetPacket::new(TransmissionBytes::zeroed_size( - HEAD_LENGTH + 8, + // 构造RelayProbe消息,目标是target_ip,但发送给relay_ip + let Ok(mut probe) = NetPacket::new(TransmissionBytes::zeroed_size( + HEAD_LENGTH, socket_manager.encrypt_reserve(), )) else { continue; }; - ping.set_msg_type(MsgType::Ping); - ping.set_ttl(2); // TTL设为2,允许中继一次 - ping.set_src_id(src.into()); - ping.set_dest_id((*target_ip).into()); - ping.set_payload(&crate::utils::time::now_ts_ms().to_be_bytes()) - .unwrap(); + probe.set_msg_type(MsgType::RelayProbe); + probe.set_ttl(2); // TTL设为2,允许中继一次 + probe.set_src_id(src.into()); + probe.set_dest_id((*target_ip).into()); // 发送给已打洞的客户端,让它中继到目标 - if let Err(e) = socket_manager.send_to(ping, &route_key).await { + if let Err(e) = socket_manager.send_to(probe, &route_key).await { log::debug!( "Failed to send relay probe to {} for target {}: {:?}", relay_ip,