TURN

Updated 29 Avril 2020

TURN

Introduction

TURN (Traversal Using Relay NAT) est un protocole permettant à un nœud de recevoir des données entrantes derrière un NAT ou un pare-feu via une connexion TCP ou UDP. Cette fonction est particulièrement utile pour les nœuds se trouvant derrière des NATs symétriques, ou pour les pare-feux qui doivent recevoir des données en entrée lorsqu'ils se connectent à un nœud ou à un pair spécifique.

Une interaction entre deux utilisateurs d'une application WebRTC impliquant les serveurs STUN et TURN

Un serveur TURN est un serveur STUN avancé, ce qui signifie que tout TURN peut également faire fonction de STUN. STUN (Session Traversal Utilities, abgrégé en NAT) est un protocole de réseau conçu en vue de permettre au client se trouvant derrière un NAT ou plusieurs serveurs NAT de définir son adresse IP externe, la manière dont l'adresse et les noms de port seraient communiqués vers le réseau externe en fonction du numéro de port interne. Ces paramètres sont utilisés pour établir une connexion UDP entre deux hôtes qui sont tous deux derrière un routeur NAT.

Le serveur TURN est utilisé comme relais si la connexion directe est impossible, transformant ainsi une connexion p2p en une connexion serveur-client. WebRTC apporte une solution. Il utilise le protocole ICE - qui, à son tour, dépend de serveurs supplémentaires (STUN ou TURN). WebRTC est une technologie de navigateur Web permettant de connecter deux postes clients pour une transmission sonore et visuelle. Ses fonctionnalités principales sont la prise en charge intégrée par les navigateurs Web et la connexion des clients en tant qu'hôtes peer-to-peer (p2p), sans qu'aucun serveur supplémentaire ne soit nécessaire.

Établir une connexion p2p n'est pas une tâche triviale, car tous les ordinateurs n'ont pas d'adresse IP publique. La technologie NAT (Network Address Translation) a été conçue dans le but de créer des réseaux privés utilisés par des particuliers, pour éviter d'épuiser les adresses IPv4 disponibles, mais aussi pour des raisons de sécurité. Aujourd'hui, de nombreux routeurs domestiques prennent en charge la technologie NAT, ce qui permet à tous les appareils à la maison de rester connectés, même si les fournisseurs d'accès à Internet attribuent généralement une seule adresse IP à un réseau domestique. Toutes les adresses IP publiques sont uniques, alors que les adresses privées ne le sont pas. Voilà pourquoi les connexions p2p ne sont pas toujours faciles à utiliser.

Configurer LXC

Nous conseillons d'installer votre serveur TURN dans un conteneur dédié, après l'avoir configuré conformément au manuel.

Installer le serveur TURN

Installez le serveur coturn pour TURN :

emerge -a net-im/coturn

Obtenir le certificat Let's Encrypt

Obtenez le certificat de domaine pour turn.example.org, comme expliqué dans le manuel.

Configurer le serveur TURN

Copiez les réglages par défaut :

cp /etc/turnserver.conf.default /etc/turnserver.conf

Créez une clé secrète :

openssl rand -hex 16

4b85833c7fdf06130bd7398ac9af558b

Configurez maintenant votre serveur TURN

/etc/turnserver.conf
# TURN listener port for TLS (Default: 5349).
# Note: actually, "plain" TCP & UDP sessions can connect to the TLS & DTLS
# port(s), too - if allowed by configuration. The TURN server 
# "automatically" recognizes the type of traffic. Actually, two listening
# endpoints (the "plain" one and the "tls" one) are equivalent in terms of
# functionality; but we keep both endpoints to satisfy the RFC 5766 specs.
# For secure TCP connections, we currently support SSL version 3 and 
# TLS version 1.0, 1.1 and 1.2.
# For secure UDP connections, we support DTLS version 1.
#
tls-listening-port=443

# If the server is behind NAT, you need to specify the external IP address.
# If there is only one external address, specify it like this:
external-ip=1.2.3.4
# If you have multiple external addresses, you have to specify which
# internal address each corresponds to, like this. The first address is the
# external ip, and the second address is the corresponding internal IP.
#external-ip=172.17.19.131/10.0.0.11
#external-ip=172.17.18.132/10.0.0.12

# Fingerprints in TURN messages are required for WebRTC
fingerprint

# The long-term credential mechanism is required for WebRTC
lt-cred-mech

# Configure coturn to use the "TURN REST API" method for validating time-
# limited credentials. BigBlueButton will generate credentials in this
# format. Note that the static-auth-secret value specified here must match
# the configuration in BigBlueButton's turn-stun-servers.xml
# You can generate a new random value by running the command:
#   openssl rand -hex 16
use-auth-secret
static-auth-secret=4b85833c7fdf06130bd7398ac9af558b

# If the realm value is unspecified, it defaults to the TURN server hostname.
# You probably want to configure it to a domain name that you control to
# improve log output. There is no functional impact.
realm=example.com

# Configure TLS support.
# Adjust these paths to match the locations of your certificate files
cert=/etc/letsencrypt/live/turn.example.org/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.org/privkey.pem
# Limit the allowed ciphers to improve security
# Based on https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
cipher-list="ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS"

# Enable longer DH TLS key to improve security
dh2066

# All WebRTC-compatible web browsers support TLS 1.2 or later, so disable
# older protocols
no-tlsv1
no-tlsv1_1
#no-tlsv1_2

Important

Vous pouvez utiliser tout autre port. Vous avez cependant besoin du port 443 pour gérer certaines restrictions NAT.

Lancez le serveur TURN :

/etc/init.d/turnserver start

Ajoutez-le au démarrage automatique :

rc-update add turnserver