TURN
Updated 29 Avril 2020
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.
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
# 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