Skip to content

Commit

Permalink
[v9] BUGFIX | Teleport ALPN Proxy doesn't respect HTTP CONNECT Proxy (
Browse files Browse the repository at this point in the history
  • Loading branch information
smallinsky committed Jan 10, 2023
1 parent 236ccb4 commit 888af7d
Showing 1 changed file with 11 additions and 31 deletions.
42 changes: 11 additions & 31 deletions lib/srv/alpnproxy/local_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,18 @@ package alpnproxy
import (
"context"
"crypto/tls"
"io"
"net"
"net/http"
"net/http/httputil"
"time"

"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/gravitational/trace"
log "github.com/sirupsen/logrus"
"golang.org/x/crypto/ssh"

apiclient "github.com/gravitational/teleport/api/client"
"github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/lib/srv/alpnproxy/common"
"github.com/gravitational/teleport/lib/utils"
"github.com/gravitational/teleport/lib/utils/aws"
Expand Down Expand Up @@ -149,43 +151,21 @@ func (l *LocalProxy) GetAddr() string {
func (l *LocalProxy) handleDownstreamConnection(ctx context.Context, downstreamConn net.Conn, serverName string) error {
defer downstreamConn.Close()

upstreamConn, err := tls.Dial("tcp", l.cfg.RemoteProxyAddr, &tls.Config{
const defaultKeepAlive = time.Second * 15
dialer := apiclient.NewDialer(ctx, defaultKeepAlive, defaults.DefaultDialTimeout)
conn, err := dialer.DialContext(ctx, "tcp", l.cfg.RemoteProxyAddr)
if err != nil {
return trace.Wrap(err)
}
upstreamConn := tls.Client(conn, &tls.Config{
NextProtos: l.cfg.GetProtocols(),
InsecureSkipVerify: l.cfg.InsecureSkipVerify,
ServerName: serverName,
Certificates: l.cfg.Certs,
})
if err != nil {
return trace.Wrap(err)
}
defer upstreamConn.Close()

errC := make(chan error, 2)
go func() {
defer downstreamConn.Close()
defer upstreamConn.Close()
_, err := io.Copy(downstreamConn, upstreamConn)
errC <- err
}()
go func() {
defer downstreamConn.Close()
defer upstreamConn.Close()
_, err := io.Copy(upstreamConn, downstreamConn)
errC <- err
}()

var errs []error
for i := 0; i < 2; i++ {
select {
case <-ctx.Done():
return trace.NewAggregate(append(errs, ctx.Err())...)
case err := <-errC:
if err != nil && !utils.IsOKNetworkError(err) {
errs = append(errs, err)
}
}
}
return trace.NewAggregate(errs...)
return trace.Wrap(utils.ProxyConn(ctx, downstreamConn, upstreamConn))
}

func (l *LocalProxy) Close() error {
Expand Down

0 comments on commit 888af7d

Please sign in to comment.