From 558be854be499f3f2801df3e9d3a886477da7296 Mon Sep 17 00:00:00 2001 From: Alessio Date: Tue, 14 Jun 2022 00:03:12 +0200 Subject: [PATCH] Add turn relay start and end port configuration (#733) --- config-sample.yaml | 3 +++ pkg/config/config.go | 28 +++++++++++++++++++++------- pkg/service/turn.go | 7 +++++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/config-sample.yaml b/config-sample.yaml index 4e436705a..634ba50d7 100644 --- a/config-sample.yaml +++ b/config-sample.yaml @@ -161,6 +161,9 @@ keys: # udp_port: 3478 # # defaults to 5349 - if not using a load balancer, this must be set to 443 # tls_port: 5349 +# # set UDP port range for TURN relay to connect to LiveKit SFU, by default it uses a any available port +# relay_range_start: 1024 +# relay_range_end: 30000 # # set external_tl to true if using a L4 load balancer to terminate TLS. when enabled, # # LiveKit expects unencrypted traffic on tls_port, and still advertise tls_port as a TURN/TLS candidate. # external_tls: true diff --git a/pkg/config/config.go b/pkg/config/config.go index b01da016f..598fbf58d 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -151,13 +151,15 @@ type LoggingConfig struct { } type TURNConfig struct { - Enabled bool `yaml:"enabled"` - Domain string `yaml:"domain"` - CertFile string `yaml:"cert_file"` - KeyFile string `yaml:"key_file"` - TLSPort int `yaml:"tls_port"` - UDPPort int `yaml:"udp_port"` - ExternalTLS bool `yaml:"external_tls"` + Enabled bool `yaml:"enabled"` + Domain string `yaml:"domain"` + CertFile string `yaml:"cert_file"` + KeyFile string `yaml:"key_file"` + TLSPort int `yaml:"tls_port"` + UDPPort int `yaml:"udp_port"` + RelayPortRangeStart uint16 `yaml:"relay_range_start,omitempty"` + RelayPortRangeEnd uint16 `yaml:"relay_range_end,omitempty"` + ExternalTLS bool `yaml:"external_tls"` } type WebHookConfig struct { @@ -276,6 +278,18 @@ func NewConfig(confString string, c *cli.Context) (*Config, error) { } } + // set defaults for Turn relay if none are set + if conf.TURN.RelayPortRangeStart == 0 || conf.TURN.RelayPortRangeEnd == 0 { + // to make it easier to run in dev mode/docker, default to two ports + if conf.Development { + conf.TURN.RelayPortRangeStart = 30000 + conf.TURN.RelayPortRangeEnd = 30002 + } else { + conf.TURN.RelayPortRangeStart = 30000 + conf.TURN.RelayPortRangeEnd = 40000 + } + } + if conf.RTC.NodeIP == "" { conf.RTC.NodeIP, err = conf.determineIP() if err != nil { diff --git a/pkg/service/turn.go b/pkg/service/turn.go index 1e9004bf5..a11bcdb20 100644 --- a/pkg/service/turn.go +++ b/pkg/service/turn.go @@ -42,12 +42,15 @@ func NewTurnServer(conf *config.Config, authHandler turn.AuthHandler) (*turn.Ser relayAddrGen := &turn.RelayAddressGeneratorPortRange{ RelayAddress: net.ParseIP(conf.RTC.NodeIP), Address: "0.0.0.0", - MinPort: turnMinPort, - MaxPort: turnMaxPort, + MinPort: turnConf.RelayPortRangeStart, + MaxPort: turnConf.RelayPortRangeEnd, MaxRetries: allocateRetries, } var logValues []interface{} + logValues = append(logValues, "turn.relay_range_start", turnConf.RelayPortRangeStart) + logValues = append(logValues, "turn.relay_range_end", turnConf.RelayPortRangeEnd) + if turnConf.TLSPort > 0 { if turnConf.Domain == "" { return nil, errors.New("TURN domain required")