Configurare TURN

Questo documento illustra come configurare un server TURN per BigBlueButton per consentire la connessione agli utenti dietro firewall restrittivi.

Imposta un server TURN

BigBlueButton richiede normalmente un'ampia gamma di porte UDP per essere disponibile per la comunicazione WebRTC. In alcuni siti con limitazioni di rete o ambienti di sviluppo, come quelli dietro NAT o un firewall che limita le connessioni UDP in uscita, gli utenti potrebbero non essere in grado di effettuare connessioni UDP in uscita al server BigBlueButton.

Il protocollo TURN è progettato per consentire ai flussi di comunicazione basati su UDP come WebRTC di bypassare NAT o firewall facendo in modo che il client si connetta al server TURN e quindi il server TURN si connetta alla destinazione per loro conto.

Inoltre, il server TURN implementa anche il protocollo STUN, utilizzato per consentire connessioni UDP dirette attraverso alcuni tipi di firewall che altrimenti potrebbero non funzionare.

L'utilizzo di un server TURN sotto il tuo controllo migliora il successo delle connessioni a BigBlueButton e migliora anche la privacy degli utenti, poiché non invieranno più informazioni sull'indirizzo IP a un server STUN pubblico.

Hardware richiesto

Il protocollo TURN non richiede un uso intensivo della CPU o della memoria. Inoltre, poiché viene utilizzato solo durante la configurazione della connessione (per STUN) e come ripiego per gli utenti che altrimenti non sarebbero in grado di connettersi, i requisiti di larghezza di banda non sono particolarmente elevati. Per un numero moderato di server BigBlueButton, di solito è sufficiente un singolo piccolo VPS.

Avere più indirizzi IP può migliorare i risultati quando si utilizza STUN con determinati tipi di firewall, ma di solito non è necessario.

Avere il server dietro NAT (ad esempio, su Amazon EC2) va bene, ma tutte le connessioni UDP e TCP in entrata su qualsiasi porta devono essere inoltrate e non firewallate.

Software richiesto

Si consiglia di utilizzare un'installazione server minima di Ubuntu 18.04. Il software coturn richiede la porta 443 per il suo uso esclusivo nella nostra configurazione consigliata, il che significa che il server non può avere alcun software dashboard o altre applicazioni web in esecuzione.

coturn è già disponibile nei repository di pacchetti di Ubuntu per la versione 18.04 e successive e può essere installato con apt-get:

$ sudo apt-get update
$ sudo apt-get install coturn

Nota: il coturn non si avvia automaticamente fino a quando non viene applicata la configurazione (vedi sotto).

Voce DNS richiesta

È necessario configurare un nome di dominio completo che risolva l'indirizzo IP esterno del server di turno. Userai questo nome di dominio per generare un certificato TLS utilizzando Let's Encrypt (sezione successiva).

Porte richieste

Sul server coturn, è necessario avere le seguenti porte (oltre alla porta 22) disponibili per i client BigBlueButton per la connessione (porta 3478 e 443) e per coturn per connettersi al server BigBlueButton (49152-65535).

Porti Protocollo Descrizione
3478 TCP / UDP porta di ascolto coturn
443 TCP / UDP Porta di ascolto TLS
49152-65535 UDP gamma di porte relè

Generazione di certificati TLS

È possibile utilizzare certbot da Encrypt Let e facilmente generare certificati TLS liberi. Per impostare, certbot immettere i seguenti comandi sul server TURN (non sul server BigBlueButton).

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

È quindi possibile eseguire un comando certbot  come il seguente per generare il certificato, sostituendo turn.example.com con il nome di dominio del server TURN:

$ sudo certbot certonly --standalone --preferred-challenges http \
    --deploy-hook "systemctl restart coturn" \
    -d turn.example.com

Le versioni correnti del comando certbot configurano il rinnovo automatico per impostazione predefinita. Si noti che quando certbot rinnova il certificato, riavvierà coturn in modo che coturn inizierà a utilizzare i file del certificato aggiornati. Ciò interromperà tutte le connessioni TURN in corso. Potresti voler modificare la pianificazione dei rinnovi di certbot o disabilitare il rinnovo automatico se questo è un problema.

Configura coturn

La configurazione coturn è memorizzata nel file /etc/turnserver.conf. Sono disponibili molte opzioni, tutte documentate nei commenti in quel file. Includiamo di seguito una configurazione di esempio con commenti che indicano le impostazioni consigliate, con alcune note nelle posizioni in cui è richiesta la personalizzazione.

Puoi replicare il contenuto /etc/turnserver.conf con questo file e apportare due modifiche:

  • Sostituisci turn.example.comcon il nome host del tuo server TURN e
  • Sostituisci <random value>con un valore casuale per un segreto condiviso (le istruzioni per generare un nuovo segreto sono in un commento nel file).
# Example coturn configuration for BigBlueButton

# These are the two network ports used by the TURN server which the client
# may connect to. We enable the standard unencrypted port 3478 for STUN,
# as well as port 443 for TURN over TLS, which can bypass firewalls.
listening-port=3478
tls-listening-port=443

# If the server has multiple IP addresses, you may wish to limit which
# addresses coturn is using. Do that by setting this option (it can be
# specified multiple times). The default is to listen on all addresses.
# You do not normally need to set this option.
#listening-ip=172.17.19.101

# 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=172.17.19.120
# 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=<random value>

# 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.com/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.com/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

# Log to a single filename (rather than new log files each startup). You'll
# want to install a logrotate configuration (see below)
log-file=/var/log/coturn.log

# To enable single filename logs you need to enable the simple-log flag
simple-log

Configura rotazione registro

Per ruotare i registri per coturn, installare il seguente file di configurazione in/etc/logrotate.d/coturn

/var/log/coturn.log
{
    rotate 30
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
    systemctl kill -sHUP coturn.service
    endscript
}

Abilitazione del servizio coturn

Il pacchetto ubuntu per coturn richiede la modifica di un file per abilitare l'avvio. Modifica il file /etc/default/coturn e assicurati che la riga seguente non sia commentata:

TURNSERVER_ENABLED=1

È quindi possibile avviare il servizio di coturn eseguendo

$ systemctl start coturn

Configurare BigBlueButton per utilizzare il server coturn

È necessario configurare bbb-web in modo che fornisca l'elenco dei server di turno al browser web. Modifica il file /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml utilizzando i contenuti seguenti e apporta le modifiche:

  • sostituire entrambe le istanze di turn.example.comcon il nome host del server TURN e
  • sostituisci <random value>con il segreto che hai configurato in turnserver.conf.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="stun0" class="org.bigbluebutton.web.services.turn.StunServer">
        <constructor-arg index="0" value="stun:turn.example.com"/>
    </bean>


    <bean id="turn0" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="<random value>"/>
        <constructor-arg index="1" value="turns:turn.example.com:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>
    
    <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="<random value>"/>
        <constructor-arg index="1" value="turn:turn.example.com:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>

    <bean id="stunTurnService"
            class="org.bigbluebutton.web.services.turn.StunTurnService">
        <property name="stunServers">
            <set>
                <ref bean="stun0"/>
            </set>
        </property>
        <property name="turnServers">
            <set>
                <ref bean="turn0"/>
                <ref bean="turn1"/>
            </set>
        </property>
    </bean>
</beans>

Riavvia il tuo server BigBlueButton per applicare le modifiche.

D'ora in avanti, quando gli utenti si connettono dietro un firewall restrittivo che impedisce le connessioni UDP in uscita, il server TURN consentirà a BigBlueButton di connettersi a FreeSWITCH e Kurento tramite il server TURN attraverso la porta 443 del firewall.