Skip to content

Commit

Permalink
Prevent forwarded tcpip requests hanging indefinitely (#50209)
Browse files Browse the repository at this point in the history
The SSH channel was only being closed in the happy path once
proxying of data completed. This resulted in any connections being
made, and failing for any reason prior to that hanging until the
user terminated the request.

The behavior from the regular.Server was copied to the forward.Server
to ensure that the channel is always closed when handleDirectTCPIPRequest
terminates.
  • Loading branch information
rosstimothy committed Dec 13, 2024
1 parent 72d2084 commit 0fa3cdc
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions lib/srv/forward/sshserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"fmt"
"io"
"net"
"os"
"strings"
"time"

Expand Down Expand Up @@ -1062,8 +1063,12 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r
if err != nil {
s.log.Errorf("Unable to create connection context: %v.", err)
s.stderrWrite(ch, "Unable to create connection context.")
if err := ch.Close(); err != nil {
s.log.Warnf("Failed to close channel: %v", err)
}
return
}
scx.AddCloser(ch)
scx.RemoteClient = s.remoteClient
scx.ExecType = teleport.ChanDirectTCPIP
scx.SrcAddr = sshutils.JoinHostPort(req.Orig, req.OrigPort)
Expand Down Expand Up @@ -1095,8 +1100,8 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r
scx.WithError(err).Warn("Failed to emit port forward event.")
}

if err := utils.ProxyConn(ctx, ch, conn); err != nil {
s.log.WithError(err).Warn("Pailed proxying data for port forwarding connection.")
if err := utils.ProxyConn(ctx, ch, conn); err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, os.ErrClosed) {
s.log.WithError(err).Warn("Failed proxying data for port forwarding connection.")
}
}

Expand Down

0 comments on commit 0fa3cdc

Please sign in to comment.