diff --git a/cmd/client.go b/cmd/client.go index e934146..1cb4263 100644 --- a/cmd/client.go +++ b/cmd/client.go @@ -222,6 +222,11 @@ func client(config *clientConfig) { "src": addr.String(), "dst": reqAddr, }).Debugf("TUN %s closed for timeout", strings.ToUpper(addr.Network())) + } else if err.Error() == "deadline exceeded" && strings.HasPrefix(addr.Network(), "tcp") { + logrus.WithFields(logrus.Fields{ + "src": addr.String(), + "dst": reqAddr, + }).Debugf("TUN %s closed for timeout", strings.ToUpper(addr.Network())) } else { logrus.WithFields(logrus.Fields{ "error": err, diff --git a/pkg/tun/tcp.go b/pkg/tun/tcp.go index d0e8ce7..8a9ef9e 100644 --- a/pkg/tun/tcp.go +++ b/pkg/tun/tcp.go @@ -3,6 +3,7 @@ package tun import ( "errors" "fmt" + tun2socks "github.com/eycorsican/go-tun2socks/core" "github.com/tobyxdd/hysteria/pkg/acl" "github.com/tobyxdd/hysteria/pkg/utils" "net" @@ -65,10 +66,15 @@ func (s *Server) Handle(conn net.Conn, target *net.TCPAddr) error { } func (s *Server) relayTCP(clientConn, relayConn net.Conn) { - closeErr := utils.PipePairWithTimeout(clientConn, relayConn, s.Timeout) + closeErr := utils.PipePairWithTimeout(relayConn, clientConn, s.Timeout) if s.ErrorFunc != nil { s.ErrorFunc(clientConn.LocalAddr(), relayConn.RemoteAddr().String(), closeErr) } relayConn.Close() clientConn.Close() + if closeErr != nil && closeErr.Error() == "deadline exceeded" { + if clientConn, ok := clientConn.(tun2socks.TCPConn); ok { + clientConn.Abort() + } + } }