Skip to content

Commit 0c5b783

Browse files
jentfoogithub-actions
authored and
github-actions
committed
Limit GRPC Active streams
Originally there was a default limit of 100 max concurrent streams, however in 2017 the GRPC team removed this default: grpc/grpc-go#1624 With the recent HTTP/2 Rapid Reset DoS, it is now being encouraged to re-introduce a limit. The fix requires this value to be configured in fact: grpc/grpc-go#6703
1 parent 9b38f82 commit 0c5b783

File tree

6 files changed

+16
-2
lines changed

6 files changed

+16
-2
lines changed

lib/auth/grpcserver.go

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import (
7070
wanlib "github.com/gravitational/teleport/lib/auth/webauthn"
7171
"github.com/gravitational/teleport/lib/authz"
7272
"github.com/gravitational/teleport/lib/backend"
73+
"github.com/gravitational/teleport/lib/defaults"
7374
"github.com/gravitational/teleport/lib/events"
7475
"github.com/gravitational/teleport/lib/httplib"
7576
"github.com/gravitational/teleport/lib/joinserver"
@@ -5308,6 +5309,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) {
53085309
PermitWithoutStream: true,
53095310
},
53105311
),
5312+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
53115313
)
53125314
if err != nil {
53135315
return nil, trace.Wrap(err)

lib/defaults/defaults.go

+4
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ const (
100100
// By default all users use /bin/bash
101101
DefaultShell = "/bin/bash"
102102

103+
// GRPCMaxConcurrentStreams is the max GRPC streams that can be active at a time. Once the limit is reached new
104+
// RPC calls will queue until capacity is available.
105+
GRPCMaxConcurrentStreams = 1000
106+
103107
// HTTPMaxIdleConns is the max idle connections across all hosts.
104108
HTTPMaxIdleConns = 2000
105109

lib/observability/tracing/collector.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func NewCollector(cfg CollectorConfig) (*Collector, error) {
7878
c := &Collector{
7979
grpcLn: grpcLn,
8080
httpLn: httpLn,
81-
grpcServer: grpc.NewServer(grpc.Creds(creds)),
81+
grpcServer: grpc.NewServer(grpc.Creds(creds), grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams)),
8282
tlsConfing: tlsConfig,
8383
exportedC: make(chan struct{}, 1),
8484
}

lib/proxy/peer/server.go

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/gravitational/teleport/api/metadata"
3232
"github.com/gravitational/teleport/api/utils/grpc/interceptors"
3333
"github.com/gravitational/teleport/lib/auth"
34+
"github.com/gravitational/teleport/lib/defaults"
3435
"github.com/gravitational/teleport/lib/utils"
3536
)
3637

@@ -141,6 +142,7 @@ func NewServer(config ServerConfig) (*Server, error) {
141142
MinTime: peerKeepAlive,
142143
PermitWithoutStream: true,
143144
}),
145+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
144146
)
145147

146148
proto.RegisterProxyServiceServer(server, config.service)

lib/service/service.go

+3
Original file line numberDiff line numberDiff line change
@@ -4268,6 +4268,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error {
42684268
otelgrpc.StreamServerInterceptor(),
42694269
),
42704270
grpc.Creds(creds),
4271+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
42714272
)
42724273

42734274
connMonitor, err := srv.NewConnectionMonitor(srv.ConnectionMonitorConfig{
@@ -5930,6 +5931,7 @@ func (process *TeleportProcess) initPublicGRPCServer(
59305931
// available for some time.
59315932
MaxConnectionIdle: 10 * time.Second,
59325933
}),
5934+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
59335935
)
59345936
joinServiceServer := joinserver.NewJoinServiceGRPCServer(conn.Client)
59355937
proto.RegisterJoinServiceServer(server, joinServiceServer)
@@ -5989,6 +5991,7 @@ func (process *TeleportProcess) initSecureGRPCServer(cfg initSecureGRPCServerCfg
59895991
grpc.ChainUnaryInterceptor(authMiddleware.UnaryInterceptors()...),
59905992
grpc.ChainStreamInterceptor(authMiddleware.StreamInterceptors()...),
59915993
grpc.Creds(creds),
5994+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
59925995
)
59935996

59945997
kubeServer, err := kubegrpc.New(kubegrpc.Config{

lib/teleterm/apiserver/apiserver.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"google.golang.org/grpc"
2424

2525
api "github.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1"
26+
"github.com/gravitational/teleport/lib/defaults"
2627
"github.com/gravitational/teleport/lib/teleterm/apiserver/handler"
2728
"github.com/gravitational/teleport/lib/utils"
2829
)
@@ -41,7 +42,9 @@ func New(cfg Config) (*APIServer, error) {
4142
}
4243

4344
grpcServer := grpc.NewServer(cfg.TshdServerCreds,
44-
grpc.ChainUnaryInterceptor(withErrorHandling(cfg.Log)))
45+
grpc.ChainUnaryInterceptor(withErrorHandling(cfg.Log)),
46+
grpc.MaxConcurrentStreams(defaults.GRPCMaxConcurrentStreams),
47+
)
4548

4649
// Create Terminal service.
4750

0 commit comments

Comments
 (0)