diff --git a/adapter/inbound/listen.go b/adapter/inbound/listen.go
index 1b86c811a7..318c9675db 100644
--- a/adapter/inbound/listen.go
+++ b/adapter/inbound/listen.go
@@ -3,6 +3,9 @@ package inbound
 import (
 	"context"
 	"net"
+	"sync"
+
+	"github.com/metacubex/mihomo/component/keepalive"
 
 	"github.com/metacubex/tfo-go"
 )
@@ -11,28 +14,47 @@ var (
 	lc = tfo.ListenConfig{
 		DisableTFO: true,
 	}
+	mutex sync.RWMutex
 )
 
 func SetTfo(open bool) {
+	mutex.Lock()
+	defer mutex.Unlock()
 	lc.DisableTFO = !open
 }
 
 func Tfo() bool {
+	mutex.RLock()
+	defer mutex.RUnlock()
 	return !lc.DisableTFO
 }
 
 func SetMPTCP(open bool) {
+	mutex.Lock()
+	defer mutex.Unlock()
 	setMultiPathTCP(&lc.ListenConfig, open)
 }
 
 func MPTCP() bool {
+	mutex.RLock()
+	defer mutex.RUnlock()
 	return getMultiPathTCP(&lc.ListenConfig)
 }
 
 func ListenContext(ctx context.Context, network, address string) (net.Listener, error) {
+	mutex.RLock()
+	defer mutex.RUnlock()
 	return lc.Listen(ctx, network, address)
 }
 
 func Listen(network, address string) (net.Listener, error) {
 	return ListenContext(context.Background(), network, address)
 }
+
+func init() {
+	keepalive.SetDisableKeepAliveCallback.Register(func(b bool) {
+		mutex.Lock()
+		defer mutex.Unlock()
+		keepalive.SetNetListenConfig(&lc.ListenConfig)
+	})
+}
diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go
index 7114045d63..15f081f2bf 100644
--- a/adapter/outbound/direct.go
+++ b/adapter/outbound/direct.go
@@ -6,7 +6,6 @@ import (
 	"os"
 	"strconv"
 
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/component/dialer"
 	"github.com/metacubex/mihomo/component/loopback"
 	"github.com/metacubex/mihomo/component/resolver"
@@ -38,7 +37,6 @@ func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ...
 	if err != nil {
 		return nil, err
 	}
-	N.TCPKeepAlive(c)
 	return d.loopBack.NewConn(NewConn(c, d)), nil
 }
 
diff --git a/adapter/outbound/http.go b/adapter/outbound/http.go
index b837e49a94..ebb1d67cc5 100644
--- a/adapter/outbound/http.go
+++ b/adapter/outbound/http.go
@@ -7,13 +7,11 @@ import (
 	"encoding/base64"
 	"errors"
 	"fmt"
-
 	"io"
 	"net"
 	"net/http"
 	"strconv"
 
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/component/ca"
 	"github.com/metacubex/mihomo/component/dialer"
 	"github.com/metacubex/mihomo/component/proxydialer"
@@ -76,7 +74,6 @@ func (h *Http) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metad
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", h.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go
index 88fb84566b..021fbc0a26 100644
--- a/adapter/outbound/shadowsocks.go
+++ b/adapter/outbound/shadowsocks.go
@@ -149,7 +149,6 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", ss.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go
index 07d780477a..437695b4c8 100644
--- a/adapter/outbound/shadowsocksr.go
+++ b/adapter/outbound/shadowsocksr.go
@@ -80,7 +80,6 @@ func (ssr *ShadowSocksR) DialContextWithDialer(ctx context.Context, dialer C.Dia
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", ssr.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
diff --git a/adapter/outbound/snell.go b/adapter/outbound/snell.go
index 76ed4be916..f6a4b4f9aa 100644
--- a/adapter/outbound/snell.go
+++ b/adapter/outbound/snell.go
@@ -6,7 +6,6 @@ import (
 	"net"
 	"strconv"
 
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/common/structure"
 	"github.com/metacubex/mihomo/component/dialer"
 	"github.com/metacubex/mihomo/component/proxydialer"
@@ -94,7 +93,6 @@ func (s *Snell) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", s.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
@@ -122,7 +120,6 @@ func (s *Snell) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met
 	if err != nil {
 		return nil, err
 	}
-	N.TCPKeepAlive(c)
 	c = streamConn(c, streamOption{s.psk, s.version, s.addr, s.obfsOption})
 
 	err = snell.WriteUDPHeader(c, s.version)
@@ -207,8 +204,7 @@ func NewSnell(option SnellOption) (*Snell, error) {
 			if err != nil {
 				return nil, err
 			}
-
-			N.TCPKeepAlive(c)
+			
 			return streamConn(c, streamOption{psk, option.Version, addr, obfsOption}), nil
 		})
 	}
diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go
index c17ee6a7a5..1908167abc 100644
--- a/adapter/outbound/socks5.go
+++ b/adapter/outbound/socks5.go
@@ -10,7 +10,6 @@ import (
 	"net/netip"
 	"strconv"
 
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/component/ca"
 	"github.com/metacubex/mihomo/component/dialer"
 	"github.com/metacubex/mihomo/component/proxydialer"
@@ -82,7 +81,6 @@ func (ss *Socks5) DialContextWithDialer(ctx context.Context, dialer C.Dialer, me
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", ss.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
@@ -128,7 +126,6 @@ func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata,
 		safeConnClose(c, err)
 	}(c)
 
-	N.TCPKeepAlive(c)
 	var user *socks5.User
 	if ss.user != "" {
 		user = &socks5.User{
diff --git a/adapter/outbound/ssh.go b/adapter/outbound/ssh.go
index 8b2776a663..9e23b463dd 100644
--- a/adapter/outbound/ssh.go
+++ b/adapter/outbound/ssh.go
@@ -77,7 +77,6 @@ func (s *sshClient) connect(ctx context.Context, cDialer C.Dialer, addr string)
 	if err != nil {
 		return nil, err
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go
index 938a885835..b3a611af05 100644
--- a/adapter/outbound/trojan.go
+++ b/adapter/outbound/trojan.go
@@ -9,7 +9,6 @@ import (
 	"net/http"
 	"strconv"
 
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/component/ca"
 	"github.com/metacubex/mihomo/component/dialer"
 	"github.com/metacubex/mihomo/component/proxydialer"
@@ -154,7 +153,6 @@ func (t *Trojan) DialContextWithDialer(ctx context.Context, dialer C.Dialer, met
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", t.addr, err)
 	}
-	N.TCPKeepAlive(c)
 
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
@@ -212,7 +210,6 @@ func (t *Trojan) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, me
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
 	}(c)
-	N.TCPKeepAlive(c)
 	c, err = t.plainStream(ctx, c)
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %w", t.addr, err)
@@ -314,7 +311,6 @@ func NewTrojan(option TrojanOption) (*Trojan, error) {
 			if err != nil {
 				return nil, fmt.Errorf("%s connect error: %s", t.addr, err.Error())
 			}
-			N.TCPKeepAlive(c)
 			return c, nil
 		}
 
diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go
index b18bf4dac6..7905887409 100644
--- a/adapter/outbound/vless.go
+++ b/adapter/outbound/vless.go
@@ -262,7 +262,6 @@ func (v *Vless) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 	}
-	N.TCPKeepAlive(c)
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
 	}(c)
@@ -327,7 +326,6 @@ func (v *Vless) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 	}
-	N.TCPKeepAlive(c)
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
 	}(c)
@@ -574,7 +572,6 @@ func NewVless(option VlessOption) (*Vless, error) {
 			if err != nil {
 				return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 			}
-			N.TCPKeepAlive(c)
 			return c, nil
 		}
 
diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go
index 7d5a7224e1..8797374dd8 100644
--- a/adapter/outbound/vmess.go
+++ b/adapter/outbound/vmess.go
@@ -312,7 +312,6 @@ func (v *Vmess) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 	}
-	N.TCPKeepAlive(c)
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
 	}(c)
@@ -373,7 +372,6 @@ func (v *Vmess) ListenPacketWithDialer(ctx context.Context, dialer C.Dialer, met
 	if err != nil {
 		return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 	}
-	N.TCPKeepAlive(c)
 	defer func(c net.Conn) {
 		safeConnClose(c, err)
 	}(c)
@@ -473,7 +471,6 @@ func NewVmess(option VmessOption) (*Vmess, error) {
 			if err != nil {
 				return nil, fmt.Errorf("%s connect error: %s", v.addr, err.Error())
 			}
-			N.TCPKeepAlive(c)
 			return c, nil
 		}
 
diff --git a/common/net/tcp_keepalive.go b/common/net/tcp_keepalive.go
deleted file mode 100644
index 047a1c05eb..0000000000
--- a/common/net/tcp_keepalive.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package net
-
-import (
-	"net"
-	"runtime"
-	"time"
-)
-
-var (
-	KeepAliveIdle     = 0 * time.Second
-	KeepAliveInterval = 0 * time.Second
-	DisableKeepAlive  = false
-)
-
-func TCPKeepAlive(c net.Conn) {
-	if tcp, ok := c.(*net.TCPConn); ok {
-		if runtime.GOOS == "android" || DisableKeepAlive {
-			_ = tcp.SetKeepAlive(false)
-		} else {
-			tcpKeepAlive(tcp)
-		}
-	}
-}
diff --git a/common/net/tcp_keepalive_go122.go b/common/net/tcp_keepalive_go122.go
deleted file mode 100644
index 1287316868..0000000000
--- a/common/net/tcp_keepalive_go122.go
+++ /dev/null
@@ -1,10 +0,0 @@
-//go:build !go1.23
-
-package net
-
-import "net"
-
-func tcpKeepAlive(tcp *net.TCPConn) {
-	_ = tcp.SetKeepAlive(true)
-	_ = tcp.SetKeepAlivePeriod(KeepAliveInterval)
-}
diff --git a/common/net/tcp_keepalive_go123.go b/common/net/tcp_keepalive_go123.go
deleted file mode 100644
index 2dd4754bbe..0000000000
--- a/common/net/tcp_keepalive_go123.go
+++ /dev/null
@@ -1,19 +0,0 @@
-//go:build go1.23
-
-package net
-
-import "net"
-
-func tcpKeepAlive(tcp *net.TCPConn) {
-	config := net.KeepAliveConfig{
-		Enable:   true,
-		Idle:     KeepAliveIdle,
-		Interval: KeepAliveInterval,
-	}
-	if !SupportTCPKeepAliveCount() {
-		// it's recommended to set both Idle and Interval to non-negative values in conjunction with a -1
-		// for Count on those old Windows if you intend to customize the TCP keep-alive settings.
-		config.Count = -1
-	}
-	_ = tcp.SetKeepAliveConfig(config)
-}
diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go
index 41f79b8e52..3dfd3159bb 100644
--- a/component/dialer/dialer.go
+++ b/component/dialer/dialer.go
@@ -12,6 +12,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/metacubex/mihomo/component/keepalive"
 	"github.com/metacubex/mihomo/component/resolver"
 	"github.com/metacubex/mihomo/log"
 )
@@ -144,6 +145,7 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po
 	}
 
 	dialer := netDialer.(*net.Dialer)
+	keepalive.SetNetDialer(dialer)
 	if opt.mpTcp {
 		setMultiPathTCP(dialer)
 	}
diff --git a/component/keepalive/tcp_keepalive.go b/component/keepalive/tcp_keepalive.go
new file mode 100644
index 0000000000..9b24c45ada
--- /dev/null
+++ b/component/keepalive/tcp_keepalive.go
@@ -0,0 +1,65 @@
+package keepalive
+
+import (
+	"net"
+	"runtime"
+	"time"
+
+	"github.com/metacubex/mihomo/common/atomic"
+	"github.com/metacubex/mihomo/common/utils"
+)
+
+var (
+	keepAliveIdle     = atomic.NewTypedValue[time.Duration](0 * time.Second)
+	keepAliveInterval = atomic.NewTypedValue[time.Duration](0 * time.Second)
+	disableKeepAlive  = atomic.NewBool(false)
+
+	SetDisableKeepAliveCallback = utils.NewCallback[bool]()
+)
+
+func SetKeepAliveIdle(t time.Duration) {
+	keepAliveIdle.Store(t)
+}
+
+func SetKeepAliveInterval(t time.Duration) {
+	keepAliveInterval.Store(t)
+}
+
+func KeepAliveIdle() time.Duration {
+	return keepAliveIdle.Load()
+}
+
+func KeepAliveInterval() time.Duration {
+	return keepAliveInterval.Load()
+}
+
+func SetDisableKeepAlive(disable bool) {
+	if runtime.GOOS == "android" {
+		setDisableKeepAlive(false)
+	} else {
+		setDisableKeepAlive(disable)
+	}
+}
+
+func setDisableKeepAlive(disable bool) {
+	disableKeepAlive.Store(disable)
+	SetDisableKeepAliveCallback.Emit(disable)
+}
+
+func DisableKeepAlive() bool {
+	return disableKeepAlive.Load()
+}
+
+func SetNetDialer(dialer *net.Dialer) {
+	setNetDialer(dialer)
+}
+
+func SetNetListenConfig(lc *net.ListenConfig) {
+	setNetListenConfig(lc)
+}
+
+func TCPKeepAlive(c net.Conn) {
+	if tcp, ok := c.(*net.TCPConn); ok && tcp != nil {
+		tcpKeepAlive(tcp)
+	}
+}
diff --git a/component/keepalive/tcp_keepalive_go122.go b/component/keepalive/tcp_keepalive_go122.go
new file mode 100644
index 0000000000..5d88827d71
--- /dev/null
+++ b/component/keepalive/tcp_keepalive_go122.go
@@ -0,0 +1,30 @@
+//go:build !go1.23
+
+package keepalive
+
+import "net"
+
+func tcpKeepAlive(tcp *net.TCPConn) {
+	if DisableKeepAlive() {
+		_ = tcp.SetKeepAlive(false)
+	} else {
+		_ = tcp.SetKeepAlive(true)
+		_ = tcp.SetKeepAlivePeriod(KeepAliveInterval())
+	}
+}
+
+func setNetDialer(dialer *net.Dialer) {
+	if DisableKeepAlive() {
+		dialer.KeepAlive = -1 // If negative, keep-alive probes are disabled.
+	} else {
+		dialer.KeepAlive = KeepAliveInterval()
+	}
+}
+
+func setNetListenConfig(lc *net.ListenConfig) {
+	if DisableKeepAlive() {
+		lc.KeepAlive = -1 // If negative, keep-alive probes are disabled.
+	} else {
+		lc.KeepAlive = KeepAliveInterval()
+	}
+}
diff --git a/component/keepalive/tcp_keepalive_go123.go b/component/keepalive/tcp_keepalive_go123.go
new file mode 100644
index 0000000000..4c08118b3b
--- /dev/null
+++ b/component/keepalive/tcp_keepalive_go123.go
@@ -0,0 +1,45 @@
+//go:build go1.23
+
+package keepalive
+
+import "net"
+
+func keepAliveConfig() net.KeepAliveConfig {
+	config := net.KeepAliveConfig{
+		Enable:   true,
+		Idle:     KeepAliveIdle(),
+		Interval: KeepAliveInterval(),
+	}
+	if !SupportTCPKeepAliveCount() {
+		// it's recommended to set both Idle and Interval to non-negative values in conjunction with a -1
+		// for Count on those old Windows if you intend to customize the TCP keep-alive settings.
+		config.Count = -1
+	}
+	return config
+}
+
+func tcpKeepAlive(tcp *net.TCPConn) {
+	if DisableKeepAlive() {
+		_ = tcp.SetKeepAlive(false)
+	} else {
+		_ = tcp.SetKeepAliveConfig(keepAliveConfig())
+	}
+}
+
+func setNetDialer(dialer *net.Dialer) {
+	if DisableKeepAlive() {
+		dialer.KeepAlive = -1 // If negative, keep-alive probes are disabled.
+		dialer.KeepAliveConfig.Enable = false
+	} else {
+		dialer.KeepAliveConfig = keepAliveConfig()
+	}
+}
+
+func setNetListenConfig(lc *net.ListenConfig) {
+	if DisableKeepAlive() {
+		lc.KeepAlive = -1 // If negative, keep-alive probes are disabled.
+		lc.KeepAliveConfig.Enable = false
+	} else {
+		lc.KeepAliveConfig = keepAliveConfig()
+	}
+}
diff --git a/common/net/tcp_keepalive_go123_unix.go b/component/keepalive/tcp_keepalive_go123_unix.go
similarity index 91%
rename from common/net/tcp_keepalive_go123_unix.go
rename to component/keepalive/tcp_keepalive_go123_unix.go
index 0ead7ca472..8033cc6c94 100644
--- a/common/net/tcp_keepalive_go123_unix.go
+++ b/component/keepalive/tcp_keepalive_go123_unix.go
@@ -1,6 +1,6 @@
 //go:build go1.23 && unix
 
-package net
+package keepalive
 
 func SupportTCPKeepAliveIdle() bool {
 	return true
diff --git a/common/net/tcp_keepalive_go123_windows.go b/component/keepalive/tcp_keepalive_go123_windows.go
similarity index 99%
rename from common/net/tcp_keepalive_go123_windows.go
rename to component/keepalive/tcp_keepalive_go123_windows.go
index 8f1e61f959..2462e80c36 100644
--- a/common/net/tcp_keepalive_go123_windows.go
+++ b/component/keepalive/tcp_keepalive_go123_windows.go
@@ -2,7 +2,7 @@
 
 // copy and modify from golang1.23's internal/syscall/windows/version_windows.go
 
-package net
+package keepalive
 
 import (
 	"errors"
diff --git a/config/config.go b/config/config.go
index 2a75ddd64e..27cde1fbd2 100644
--- a/config/config.go
+++ b/config/config.go
@@ -15,13 +15,13 @@ import (
 	"github.com/metacubex/mihomo/adapter/outbound"
 	"github.com/metacubex/mihomo/adapter/outboundgroup"
 	"github.com/metacubex/mihomo/adapter/provider"
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/common/utils"
 	"github.com/metacubex/mihomo/component/auth"
 	"github.com/metacubex/mihomo/component/cidr"
 	"github.com/metacubex/mihomo/component/fakeip"
 	"github.com/metacubex/mihomo/component/geodata"
 	mihomoHttp "github.com/metacubex/mihomo/component/http"
+	"github.com/metacubex/mihomo/component/keepalive"
 	P "github.com/metacubex/mihomo/component/process"
 	"github.com/metacubex/mihomo/component/resolver"
 	"github.com/metacubex/mihomo/component/resource"
@@ -697,12 +697,12 @@ func parseGeneral(cfg *RawConfig) (*General, error) {
 	resource.SetETag(cfg.ETagSupport)
 
 	if cfg.KeepAliveIdle != 0 {
-		N.KeepAliveIdle = time.Duration(cfg.KeepAliveIdle) * time.Second
+		keepalive.SetKeepAliveIdle(time.Duration(cfg.KeepAliveIdle) * time.Second)
 	}
 	if cfg.KeepAliveInterval != 0 {
-		N.KeepAliveInterval = time.Duration(cfg.KeepAliveInterval) * time.Second
+		keepalive.SetKeepAliveInterval(time.Duration(cfg.KeepAliveInterval) * time.Second)
 	}
-	N.DisableKeepAlive = cfg.DisableKeepAlive
+	keepalive.SetDisableKeepAlive(cfg.DisableKeepAlive)
 
 	// checkout externalUI exist
 	if cfg.ExternalUI != "" {
diff --git a/listener/http/server.go b/listener/http/server.go
index 48f12dc5f1..04f32f4ff5 100644
--- a/listener/http/server.go
+++ b/listener/http/server.go
@@ -4,7 +4,6 @@ import (
 	"net"
 
 	"github.com/metacubex/mihomo/adapter/inbound"
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/component/auth"
 	C "github.com/metacubex/mihomo/constant"
 	authStore "github.com/metacubex/mihomo/listener/auth"
@@ -55,8 +54,8 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 			inbound.WithSpecialRules(""),
 		}
 	}
-	l, err := inbound.Listen("tcp", addr)
 
+	l, err := inbound.Listen("tcp", addr)
 	if err != nil {
 		return nil, err
 	}
@@ -74,7 +73,6 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 				}
 				continue
 			}
-			N.TCPKeepAlive(conn)
 
 			getAuth := getAuth
 			if isDefault { // only apply on default listener
diff --git a/listener/mixed/mixed.go b/listener/mixed/mixed.go
index 12390061c0..ac3a0c5886 100644
--- a/listener/mixed/mixed.go
+++ b/listener/mixed/mixed.go
@@ -49,6 +49,7 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 			inbound.WithSpecialRules(""),
 		}
 	}
+
 	l, err := inbound.Listen("tcp", addr)
 	if err != nil {
 		return nil, err
@@ -85,8 +86,6 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 }
 
 func handleConn(conn net.Conn, tunnel C.Tunnel, getAuth func() auth.Authenticator, additions ...inbound.Addition) {
-	N.TCPKeepAlive(conn)
-
 	bufConn := N.NewBufferedConn(conn)
 	head, err := bufConn.Peek(1)
 	if err != nil {
diff --git a/listener/redir/tcp.go b/listener/redir/tcp.go
index 8474a8e215..47363182d0 100644
--- a/listener/redir/tcp.go
+++ b/listener/redir/tcp.go
@@ -4,7 +4,7 @@ import (
 	"net"
 
 	"github.com/metacubex/mihomo/adapter/inbound"
-	N "github.com/metacubex/mihomo/common/net"
+	"github.com/metacubex/mihomo/component/keepalive"
 	C "github.com/metacubex/mihomo/constant"
 )
 
@@ -37,10 +37,12 @@ func New(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener
 			inbound.WithSpecialRules(""),
 		}
 	}
+
 	l, err := net.Listen("tcp", addr)
 	if err != nil {
 		return nil, err
 	}
+
 	rl := &Listener{
 		listener: l,
 		addr:     addr,
@@ -68,6 +70,6 @@ func handleRedir(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition)
 		conn.Close()
 		return
 	}
-	N.TCPKeepAlive(conn)
+	keepalive.TCPKeepAlive(conn)
 	tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.REDIR, additions...))
 }
diff --git a/listener/shadowsocks/tcp.go b/listener/shadowsocks/tcp.go
index c38438142d..b150e4cbc1 100644
--- a/listener/shadowsocks/tcp.go
+++ b/listener/shadowsocks/tcp.go
@@ -59,7 +59,6 @@ func New(config LC.ShadowsocksServer, tunnel C.Tunnel, additions ...inbound.Addi
 					}
 					continue
 				}
-				N.TCPKeepAlive(c)
 				go sl.HandleConn(c, tunnel, additions...)
 			}
 		}()
diff --git a/listener/sing_shadowsocks/server.go b/listener/sing_shadowsocks/server.go
index 1cb798f7d0..5f2a4292e3 100644
--- a/listener/sing_shadowsocks/server.go
+++ b/listener/sing_shadowsocks/server.go
@@ -7,7 +7,6 @@ import (
 	"strings"
 
 	"github.com/metacubex/mihomo/adapter/inbound"
-	N "github.com/metacubex/mihomo/common/net"
 	"github.com/metacubex/mihomo/common/sockopt"
 	C "github.com/metacubex/mihomo/constant"
 	LC "github.com/metacubex/mihomo/listener/config"
@@ -153,7 +152,6 @@ func New(config LC.ShadowsocksServer, tunnel C.Tunnel, additions ...inbound.Addi
 					}
 					continue
 				}
-				N.TCPKeepAlive(c)
 
 				go sl.HandleConn(c, tunnel)
 			}
diff --git a/listener/sing_vmess/server.go b/listener/sing_vmess/server.go
index ce422b1652..7a0afa0b73 100644
--- a/listener/sing_vmess/server.go
+++ b/listener/sing_vmess/server.go
@@ -121,7 +121,6 @@ func New(config LC.VmessServer, tunnel C.Tunnel, additions ...inbound.Addition)
 					}
 					continue
 				}
-				N.TCPKeepAlive(c)
 
 				go sl.HandleConn(c, tunnel)
 			}
diff --git a/listener/socks/tcp.go b/listener/socks/tcp.go
index 3e98a60276..950384c1f9 100644
--- a/listener/socks/tcp.go
+++ b/listener/socks/tcp.go
@@ -48,6 +48,7 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 			inbound.WithSpecialRules(""),
 		}
 	}
+
 	l, err := inbound.Listen("tcp", addr)
 	if err != nil {
 		return nil, err
@@ -84,7 +85,6 @@ func NewWithAuthenticator(addr string, tunnel C.Tunnel, getAuth func() auth.Auth
 }
 
 func handleSocks(conn net.Conn, tunnel C.Tunnel, getAuth func() auth.Authenticator, additions ...inbound.Addition) {
-	N.TCPKeepAlive(conn)
 	bufConn := N.NewBufferedConn(conn)
 	head, err := bufConn.Peek(1)
 	if err != nil {
diff --git a/listener/tproxy/tproxy.go b/listener/tproxy/tproxy.go
index fa7e7dbe47..6056047a41 100644
--- a/listener/tproxy/tproxy.go
+++ b/listener/tproxy/tproxy.go
@@ -4,7 +4,7 @@ import (
 	"net"
 
 	"github.com/metacubex/mihomo/adapter/inbound"
-	N "github.com/metacubex/mihomo/common/net"
+	"github.com/metacubex/mihomo/component/keepalive"
 	C "github.com/metacubex/mihomo/constant"
 	"github.com/metacubex/mihomo/transport/socks5"
 )
@@ -33,7 +33,7 @@ func (l *Listener) Close() error {
 
 func (l *Listener) handleTProxy(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition) {
 	target := socks5.ParseAddrToSocksAddr(conn.LocalAddr())
-	N.TCPKeepAlive(conn)
+	keepalive.TCPKeepAlive(conn)
 	// TProxy's conn.LocalAddr() is target address, so we set from l.listener
 	additions = append([]inbound.Addition{inbound.WithInAddr(l.listener.Addr())}, additions...)
 	tunnel.HandleTCPConn(inbound.NewSocket(target, conn, C.TPROXY, additions...))
diff --git a/listener/tunnel/tcp.go b/listener/tunnel/tcp.go
index 794dc8ac62..7c916a38f5 100644
--- a/listener/tunnel/tcp.go
+++ b/listener/tunnel/tcp.go
@@ -5,7 +5,6 @@ import (
 	"net"
 
 	"github.com/metacubex/mihomo/adapter/inbound"
-	N "github.com/metacubex/mihomo/common/net"
 	C "github.com/metacubex/mihomo/constant"
 	"github.com/metacubex/mihomo/transport/socks5"
 )
@@ -35,7 +34,6 @@ func (l *Listener) Close() error {
 }
 
 func (l *Listener) handleTCP(conn net.Conn, tunnel C.Tunnel, additions ...inbound.Addition) {
-	N.TCPKeepAlive(conn)
 	tunnel.HandleTCPConn(inbound.NewSocket(l.target, conn, C.TUNNEL, additions...))
 }