diff --git a/src/main.rs b/src/main.rs index a706373..b8b5d60 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2121,6 +2121,8 @@ async fn main() -> std::result::Result<(), Box> { let ip_tracker = ip_tracker.clone(); let beobachten = beobachten.clone(); let proxy_protocol_enabled = listener_proxy_protocol; + let real_peer_report = Arc::new(std::sync::Mutex::new(None)); + let real_peer_report_for_handler = real_peer_report.clone(); tokio::spawn(async move { let _permit = permit; @@ -2139,10 +2141,15 @@ async fn main() -> std::result::Result<(), Box> { ip_tracker, beobachten, proxy_protocol_enabled, + real_peer_report_for_handler, ) .run() .await { + let real_peer = match real_peer_report.lock() { + Ok(guard) => *guard, + Err(_) => None, + }; let peer_closed = matches!( &e, crate::error::ProxyError::Io(ioe) @@ -2177,15 +2184,41 @@ async fn main() -> std::result::Result<(), Box> { ); match (peer_closed, me_closed) { - (true, _) => debug!(peer = %peer_addr, error = %e, "Connection closed by client"), - (_, true) => warn!(peer = %peer_addr, error = %e, "Connection closed: Middle-End dropped session"), + (true, _) => { + if let Some(real_peer) = real_peer { + debug!(peer = %peer_addr, real_peer = %real_peer, error = %e, "Connection closed by client"); + } else { + debug!(peer = %peer_addr, error = %e, "Connection closed by client"); + } + } + (_, true) => { + if let Some(real_peer) = real_peer { + warn!(peer = %peer_addr, real_peer = %real_peer, error = %e, "Connection closed: Middle-End dropped session"); + } else { + warn!(peer = %peer_addr, error = %e, "Connection closed: Middle-End dropped session"); + } + } _ if route_switched => { - info!(peer = %peer_addr, error = %e, "Connection closed by controlled route cutover") + if let Some(real_peer) = real_peer { + info!(peer = %peer_addr, real_peer = %real_peer, error = %e, "Connection closed by controlled route cutover"); + } else { + info!(peer = %peer_addr, error = %e, "Connection closed by controlled route cutover"); + } } _ if is_expected_handshake_eof(&e) => { - info!(peer = %peer_addr, error = %e, "Connection closed during initial handshake") + if let Some(real_peer) = real_peer { + info!(peer = %peer_addr, real_peer = %real_peer, error = %e, "Connection closed during initial handshake"); + } else { + info!(peer = %peer_addr, error = %e, "Connection closed during initial handshake"); + } + } + _ => { + if let Some(real_peer) = real_peer { + warn!(peer = %peer_addr, real_peer = %real_peer, error = %e, "Connection closed with error"); + } else { + warn!(peer = %peer_addr, error = %e, "Connection closed with error"); + } } - _ => warn!(peer = %peer_addr, error = %e, "Connection closed with error"), } } }); diff --git a/src/proxy/client.rs b/src/proxy/client.rs index cbe59ce..4bc3751 100644 --- a/src/proxy/client.rs +++ b/src/proxy/client.rs @@ -321,6 +321,8 @@ pub struct ClientHandler; pub struct RunningClientHandler { stream: TcpStream, peer: SocketAddr, + real_peer_from_proxy: Option, + real_peer_report: Arc>>, config: Arc, stats: Arc, replay_checker: Arc, @@ -351,10 +353,14 @@ impl ClientHandler { ip_tracker: Arc, beobachten: Arc, proxy_protocol_enabled: bool, + real_peer_report: Arc>>, ) -> RunningClientHandler { + let normalized_peer = normalize_ip(peer); RunningClientHandler { stream, - peer, + peer: normalized_peer, + real_peer_from_proxy: None, + real_peer_report, config, stats, replay_checker, @@ -372,10 +378,8 @@ impl ClientHandler { } impl RunningClientHandler { - pub async fn run(mut self) -> Result<()> { + pub async fn run(self) -> Result<()> { self.stats.increment_connects_all(); - - self.peer = normalize_ip(self.peer); let peer = self.peer; let _ip_tracker = self.ip_tracker.clone(); debug!(peer = %peer, "New connection"); @@ -448,6 +452,10 @@ impl RunningClientHandler { "PROXY protocol header parsed" ); self.peer = normalize_ip(info.src_addr); + self.real_peer_from_proxy = Some(self.peer); + if let Ok(mut slot) = self.real_peer_report.lock() { + *slot = Some(self.peer); + } if let Some(dst) = info.dst_addr { local_addr = dst; }