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:
- Decommentate
TURNSERVER_ENABLED=1e salvate. - Aprite il file di configurazione, vedere Configurare coturn qui sotto:
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:
Configurare coturn¶
Modificate turnserver.conf come segue.
Ascolto e rete:
listening-portetls-listening-portdevono valere80e443piuttosto 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 alistening-ip.external-ip: l'IP pubblico, unicamente quandolistening-ipè un indirizzo privato dietro un NAT.min-port=49152emax-port=65535: l'intervallo di porte UDP che coturn alloca al traffico relayato. Aprite questo intervallo in UDP nel vostro firewall.
Autenticazione:
fingerprintdeve 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=600deve 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 insettings.conf, sottowebrtc.service_quality.maximum. Attenzione,max-bpssi esprime in byte al secondo mentrewebrtc.service_quality.maximumsi 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):
certepkeydevono designare il vostro certificato e la vostra chiave privata. Se non avete bisogno di TURNS, saltate questa parte e usate solo la porta80nel designare questo server, vedere Configurare Drovio Server.- Valorizzate
cipher-listcon"ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS:!AESCCM". no-tlsv1eno-tlsv1_1devono essere decommentati.
Hardening:
no-multicast-peersdeve essere decommentato.allow-loopback-peersdeve restare commentato, dato che il loopback è rifiutato per impostazione predefinita da coturn 4.5.2.no-tcp-relaydeve 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/16edenied-peer-ip=127.0.0.0/8: impediscono al traffico relayato di raggiungere le reti private o di loopback.no-software-attributedeve essere decommentato, il che maschera la versione di coturn nelle risposte.no-rfc5780,no-stun-backward-compatibilityeresponse-origin-only-with-rfc5780devono 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=5766ecli-password=myclipassword: cambiate la password. Questa interfaccia serve a verificare i peer connessi, lanciandotelnet localhost 5766, inserendo la password poips. Non esponete questa porta verso l'esterno.
Salvate, poi riavviate coturn:
Il vostro server relay TURN, e STUN, è ormai operativo.
Configurare Drovio Server¶
Di ritorno sulla vostra istanza Drovio Server:
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¶
- Aprite la dashboard Cloudflare, poi Realtime → TURN.
- 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:
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
ttlpiù 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.
- Aprite l'applicazione Drovio e connettetevi.
- Usate l'icona a forma di fulmine per avviare una riunione istantanea.
- Copiate il link di invito, incollatelo in un browser e aggiungetevi
?ice=relay. - Proseguite, inserite un nome visualizzato, senza scegliere di lanciare l'applicazione, e proseguite di nuovo.
- 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.