Skip to content

Commit 54f9fb6

Browse files
authored
Merge pull request #202 from screego/deny
feat: add `SCREEGO_TURN_DENY_PEERS`
2 parents e5864f3 + 5fda00e commit 54f9fb6

4 files changed

Lines changed: 43 additions & 2 deletions

File tree

config/config.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"crypto/rand"
55
"errors"
66
"fmt"
7+
"net"
78
"os"
89
"path/filepath"
910
"regexp"
@@ -63,6 +64,9 @@ type Config struct {
6364
TurnIPProvider ipdns.Provider `ignored:"true"`
6465
TurnPort string `ignored:"true"`
6566

67+
TurnDenyPeers []string `default:"0.0.0.0/8,127.0.0.1/8,::/128,::1/128,fe80::/10" split_words:"true"`
68+
TurnDenyPeersParsed []*net.IPNet `ignored:"true"`
69+
6670
CloseRoomWhenOwnerLeaves bool `default:"true" split_words:"true"`
6771
}
6872

@@ -218,6 +222,22 @@ func Get() (Config, []FutureLog) {
218222
}
219223
logs = append(logs, logDeprecated()...)
220224

225+
for _, cidrString := range config.TurnDenyPeers {
226+
_, cidr, err := net.ParseCIDR(cidrString)
227+
if err != nil {
228+
logs = append(logs, FutureLog{
229+
Level: zerolog.FatalLevel,
230+
Msg: fmt.Sprintf("Invalid SCREEGO_TURN_DENY_PEERS %q: %s", cidrString, err),
231+
})
232+
} else {
233+
config.TurnDenyPeersParsed = append(config.TurnDenyPeersParsed, cidr)
234+
}
235+
}
236+
logs = append(logs, FutureLog{
237+
Level: zerolog.InfoLevel,
238+
Msg: fmt.Sprintf("Deny turn peers within %q", config.TurnDenyPeersParsed),
239+
})
240+
221241
return config, logs
222242
}
223243

screego.config.development

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ SCREEGO_SECRET=secure
22
SCREEGO_LOG_LEVEL=debug
33
SCREEGO_CORS_ALLOWED_ORIGINS=http://localhost:3000
44
SCREEGO_USERS_FILE=./users
5+
SCREEGO_TURN_DENY_PEERS=

screego.config.example

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ SCREEGO_TURN_EXTERNAL_PORT=3478
6060
# Authentication secret for the external TURN server.
6161
SCREEGO_TURN_EXTERNAL_SECRET=
6262

63+
# Deny/ban peers within specific CIDRs to prevent TURN server users from
64+
# accessing machines reachable by the TURN server but not from the internet,
65+
# useful when the server is behind a NAT.
66+
#
67+
# Disallow internal ip addresses: https://en.wikipedia.org/wiki/Reserved_IP_addresses
68+
# SCREEGO_TURN_DENY_PEERS=0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.1/8,169.254.0.0/16,172.16.0.0/12,192.0.0.0/24,192.0.2.0/24,192.88.99.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,224.0.0.0/4,239.0.0.0/8,255.255.255.255/32,::/128,::1/128,64:ff9b:1::/48,100::/64,2001::/32,2002::/16,fc00::/7,fe80::/10
69+
#
70+
# By default denies local addresses.
71+
SCREEGO_TURN_DENY_PEERS=0.0.0.0/8,127.0.0.1/8,::/128,::1/128,fe80::/10
72+
6373
# If reverse proxy headers should be trusted.
6474
# Screego uses ip whitelisting for authentication
6575
# of TURN connections. When behind a proxy the ip is always the proxy server.

turn/server.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,24 @@ func newInternalServer(conf config.Config) (Server, error) {
9898
IPProvider: conf.TurnIPProvider,
9999
}
100100

101+
var permissions turn.PermissionHandler = func(clientAddr net.Addr, peerIP net.IP) bool {
102+
for _, cidr := range conf.TurnDenyPeersParsed {
103+
if cidr.Contains(peerIP) {
104+
return false
105+
}
106+
}
107+
108+
return true
109+
}
110+
101111
_, err = turn.NewServer(turn.ServerConfig{
102112
Realm: Realm,
103113
AuthHandler: svr.authenticate,
104114
ListenerConfigs: []turn.ListenerConfig{
105-
{Listener: tcpListener, RelayAddressGenerator: gen},
115+
{Listener: tcpListener, RelayAddressGenerator: gen, PermissionHandler: permissions},
106116
},
107117
PacketConnConfigs: []turn.PacketConnConfig{
108-
{PacketConn: udpListener, RelayAddressGenerator: gen},
118+
{PacketConn: udpListener, RelayAddressGenerator: gen, PermissionHandler: permissions},
109119
},
110120
})
111121
if err != nil {

0 commit comments

Comments
 (0)