From ce08be7a3124e30ed1b2d688f18cd8917658d794 Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Sun, 15 May 2022 11:49:01 +0800 Subject: [PATCH] set SO_LINGER (0) for misbehav clients before close() --- crates/shadowsocks-service/src/net/mon_stream.rs | 5 +++++ crates/shadowsocks-service/src/server/tcprelay.rs | 6 ++++++ 2 files changed, 11 insertions(+) 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(()); }