Vai al contenuto

Server relay (TURN)

Le connessioni puramente peer-to-peer a volte non riescono a stabilirsi, a causa di firewall o di NAT presso uno degli utenti o presso tutti. Per rimediarvi e superare i firewall più recalcitranti, si possono mettere in atto uno o più server TURN (Traversal Using Relay NAT).

Drovio Server supporta due modi di fornire i relay, che scegliete con webrtc.turn_provider.type in settings.conf:

type Relay Credenziali
shared_secret (predefinito) I vostri server coturn Calcolate localmente a partire da un segreto condiviso
cloudflare Cloudflare Realtime TURN Richieste all'API di Cloudflare

Ospitare il vostro coturn mantiene ogni pacchetto inoltrato sull'infrastruttura che padroneggiate e vi lascia scegliere le porte e i protocolli aperti. Cloudflare vi risparmia la macchina da installare, aggiornare e sorvegliare. Entrambi i modi sono descritti qui sotto.

Installazioni esistenti

shared_secret è il valore predefinito: un'installazione che non dichiara affatto turn_provider continua a comportarsi esattamente come prima.

Ospitare il vostro coturn

Usiamo coturn (github.com/coturn/coturn) per i nostri server TURN, come la maggior parte degli editori, tra cui Slack e Zoom. Coturn fa anche da server STUN, incaricato di rispondere alla domanda «qual è il mio indirizzo IP pubblico».

Macchina dedicata

Sconsigliamo di distribuire un server TURN sulla macchina che ospita già Drovio Server, per ragioni di sicurezza e di prestazioni.

Installare su Debian

Coturn è pacchettizzato per Debian, la cui versione 13 include una versione quasi aggiornata, e funziona tanto in x64 quanto in arm64, i comandi qui sotto essendo identici sui due. Passo dopo passo, su una macchina Debian 13 appena installata:

sudo apt update
sudo apt install coturn
sudo nano /etc/default/coturn
  • Decommentate TURNSERVER_ENABLED=1 e salvate.
  • Aprite il file di configurazione, vedere Configurare coturn qui sotto:
sudo nano /etc/turnserver.conf

Installare su RHEL

Coturn è disponibile tramite EPEL su RHEL 9 e 10. Passo dopo passo:

sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install coturn

Il primo comando attiva EPEL, qui nella sua versione per RHEL 9: adattate l'URL alla vostra versione.

Aprite poi il file di configurazione, vedere Configurare coturn qui sotto:

sudo nano /etc/coturn/turnserver.conf

Configurare coturn

Modificate turnserver.conf come segue.

Ascolto e rete:

  • listening-port e tls-listening-port devono valere 80 e 443 piuttosto che le porte predefinite, al fine di superare la maggior parte dei firewall.
  • listening-ip: l'IP pubblico, oppure l'IP privato se siete dietro un NAT, per esempio su AWS EC2.
  • relay-ip: identico a listening-ip.
  • external-ip: l'IP pubblico, unicamente quando listening-ip è un indirizzo privato dietro un NAT.
  • min-port=49152 e max-port=65535: l'intervallo di porte UDP che coturn alloca al traffico relayato. Aprite questo intervallo in UDP nel vostro firewall.

Autenticazione:

  • fingerprint deve essere decommentato.
  • static-auth-secret=MySeCrEt: sostituite con una lunga stringa casuale. È il segreto condiviso tra Drovio Server e coturn.
  • realm=turn.example.com: da sostituire; questo valore non ha bisogno di risolvere verso alcunché.
  • stale-nonce=600 deve essere decommentato.

Banda passante:

  • max-bps: numero massimo di byte al secondo e per sessione. Commentate la riga per non limitarla, oppure fissatela almeno al bitrate massimo configurato in settings.conf, sotto webrtc.service_quality.maximum. Attenzione, max-bps si esprime in byte al secondo mentre webrtc.service_quality.maximum si esprime in kbit al secondo: il valore predefinito di 10 Mbps corrisponde a 1 250 000 byte al secondo.

TLS (facoltativo, per il supporto di TURNS):

  • cert e pkey devono designare il vostro certificato e la vostra chiave privata. Se non avete bisogno di TURNS, saltate questa parte e usate solo la porta 80 nel designare questo server, vedere Configurare Drovio Server.
  • Valorizzate cipher-list con "ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM".
  • no-tlsv1 e no-tlsv1_1 devono essere decommentati.

Hardening:

  • no-multicast-peers deve essere decommentato. allow-loopback-peers deve restare commentato, dato che il loopback è rifiutato per impostazione predefinita da coturn 4.5.2.
  • no-tcp-relay deve essere decommentato: Drovio usa solo il relay UDP, e disattivare il relay TCP riduce la superficie di attacco.
  • denied-peer-ip=0.0.0.0/8, denied-peer-ip=10.0.0.0/8, denied-peer-ip=172.16.0.0/12, denied-peer-ip=192.168.0.0/16 e denied-peer-ip=127.0.0.0/8: impediscono al traffico relayato di raggiungere le reti private o di loopback.
  • no-software-attribute deve essere decommentato, il che maschera la versione di coturn nelle risposte.
  • no-rfc5780, no-stun-backward-compatibility e response-origin-only-with-rfc5780 devono essere decommentati. Disattivano funzioni STUN ereditate, qui inutili, e riducono l'esposizione.

Vorrete senza dubbio anche isolare questo server nella propria rete o VPC.

Interfaccia a riga di comando:

  • cli-ip=127.0.0.1, cli-port=5766 e cli-password=myclipassword: cambiate la password. Questa interfaccia serve a verificare i peer connessi, lanciando telnet localhost 5766, inserendo la password poi ps. Non esponete questa porta verso l'esterno.

Salvate, poi riavviate coturn:

sudo systemctl restart coturn

Il vostro server relay TURN, e STUN, è ormai operativo.

Configurare Drovio Server

Di ritorno sulla vostra istanza Drovio Server:

sudo nano /etc/drovio-server/settings.conf

Individuate webrtc, sostituite turn_servers_secret con il valore di static-auth-secret definito più sopra e adattate la configurazione qui sotto alle vostre esigenze, avendo cura di sostituire l'URL turn.example.com con quello o con l'IP della vostra macchina coturn:

"webrtc": {
  "turn_servers_secret": "MySeCrEt",
  "turn_servers_auth_timeout": 300,
  "ice_servers": [
    { "url": "stun:turn.example.com:443" },
    { "url": "turn:turn.example.com:443" },
    { "url": "turn:turn.example.com:443?transport=tcp" },
    { "url": "turns:turn.example.com:443" }
  ],
  "service_quality": {
    "minimum": 1000,
    "maximum": 10000
  }
}
  • La prima voce è lo STUN, che risponde solo alle richieste «qual è il mio indirizzo IP».
  • La seconda è il TURN classico in UDP sulla 443, senza strato TLS.
  • La terza è il TURN in TCP sulla 443, senza strato TLS.
  • La quarta è il TURNS in UDP sulla 443, con uno strato TLS supplementare.

Ciò dovrebbe funzionare con la maggior parte dei firewall recalcitranti. La sezione webrtc si applica a caldo, non c'è quindi nulla da riavviare: i nuovi relay sono presi in carico in qualche secondo.

Usare Cloudflare Realtime TURN

Cloudflare Realtime TURN è un servizio di relay gestito: non c'è alcuna macchina da installare, aggiornare o sorvegliare e ogni partecipante è servito dalla sede Cloudflare più vicina a lui. Cloudflare fattura il traffico inoltrato, fate riferimento alla sua pagina delle tariffe per gli importi in vigore.

Creare una chiave TURN

  1. Aprite la dashboard Cloudflare, poi Realtime → TURN.
  2. Create una chiave TURN e annotate il suo Key ID e il suo API token. Il token è mostrato una sola volta.

Puntare Drovio Server su Cloudflare

Sulla vostra istanza Drovio Server:

sudo nano /etc/drovio-server/settings.conf

Individuate webrtc, portate turn_provider a cloudflare e indicate i relay di Cloudflare in ice_servers:

"webrtc": {
  "turn_provider": {
    "type": "cloudflare",
    "cloudflare": {
      "key_id": "<il vostro key id>",
      "api_token": "<il vostro api token>",
      "ttl": 86400
    }
  },
  "ice_servers": [
    { "url": "stun:stun.cloudflare.com:3478" },
    { "url": "turn:turn.cloudflare.com:3478?transport=udp" },
    { "url": "turn:turn.cloudflare.com:3478?transport=tcp" },
    { "url": "turns:turn.cloudflare.com:443?transport=tcp" }
  ],
  "service_quality": {
    "minimum": 1000,
    "maximum": 10000
  }
}

turn_servers_secret e turn_servers_auth_timeout sono ignorati finché type vale cloudflare. Lasciateli al loro posto: riportare type a shared_secret ripristina la vostra installazione coturn senza alcuna altra modifica.

Come il resto della sezione webrtc, ciò si applica a caldo e non dovete riavviare Drovio Server.

Durata delle credenziali

ttl è la durata, in secondi, per la quale una credenziale trasmessa a un client resta valida.

  • Cloudflare rifiuta le credenziali che vivono più di 48 ore. I valori superiori sono riportati a questo limite.
  • Drovio Server rinnova la sua credenziale a metà di questa durata.
  • Un client chiede una credenziale una sola volta, all'apertura di una connessione, e mai più in seguito. Un ttl più corto della vostra riunione più lunga interrompe il relay in piena sessione. Conservate il valore predefinito salvo motivo contrario.

Se Cloudflare non può essere raggiunto durante il rinnovo, Drovio Server continua a servire la credenziale che già detiene fino alla sua vera scadenza e registra l'insuccesso.

Portata davanti ai firewall

Cloudflare risponde in UDP solo sulla porta 3478. La sua porta 443 è unicamente TCP, sotto uno strato TLS (turns:). Un partecipante dietro un firewall che non autorizza nulla oltre alla 443 in uscita ricade quindi su un relay TCP. Ciò aggiunge latenza e sopporta peggio la perdita di pacchetti rispetto all'UDP.

Se avete un firewall restrittivo che autorizza solo la porta 443 e le prestazioni contano, vorrete forse ospitare il vostro server coturn con la porta 443 in UDP.

Verificare il server relay

Aggiungere ice=relay alla stringa di query di un URL del client web obbliga tutte le connessioni di quella sessione a passare per un relay, in qualunque browser.

  1. Aprite l'applicazione Drovio e connettetevi.
  2. Usate l'icona a forma di fulmine per avviare una riunione istantanea.
  3. Copiate il link di invito, incollatelo in un browser e aggiungetevi ?ice=relay.
  4. Proseguite, inserite un nome visualizzato, senza scegliere di lanciare l'applicazione, e proseguite di nuovo.
  5. Dovreste vedere il vostro stesso schermo, a specchio quando guardate lo schermo condiviso.

Se ottenete soltanto un indicatore di caricamento, il relay non è raggiungibile o le sue credenziali sono rifiutate. La console del browser mostra inoltre un avviso, The url forces every connection through the TURN server, che conferma che il parametro è stato preso in carico.