diff --git a/crates/shadowsocks-service/src/net/mon_stream.rs b/crates/shadowsocks-service/src/net/mon_stream.rs index d99b7f38..d889577d 100644 --- a/crates/shadowsocks-service/src/net/mon_stream.rs +++ b/crates/shadowsocks-service/src/net/mon_stream.rs @@ -35,6 +35,11 @@ impl MonProxyStream { pub fn get_mut(&mut self) -> &mut S { &mut self.stream } + + #[inline] + pub fn into_inner(self) -> S { + self.stream + } } impl AsyncRead for MonProxyStream diff --git a/crates/shadowsocks-service/src/server/tcprelay.rs b/crates/shadowsocks-service/src/server/tcprelay.rs index 9d87216f..09506293 100644 --- a/crates/shadowsocks-service/src/server/tcprelay.rs +++ b/crates/shadowsocks-service/src/server/tcprelay.rs @@ -132,6 +132,12 @@ impl TcpServerClient { #[cfg(feature = "aead-cipher-2022")] if self.method.is_aead_2022() { + // Set SO_LINGER(0) for misbehave clients, which will eventually receive RST. (ECONNRESET) + // This will also prevent the socket entering TIME_WAIT state. + + let stream = self.stream.into_inner().into_inner(); + let _ = stream.set_linger(Some(Duration::ZERO)); + return Ok(()); }