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).

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.

Verificare il server relay

Per verificare che il server relay funzioni correttamente:

  1. Lanciate Firefox.
  2. Inserite about:config nella barra degli indirizzi, accettate e continuate.
  3. Nella barra di ricerca, digitate relay.
  4. Portate media.peerconnection.ice.relay_only a true.
  5. Aprite l'applicazione Drovio e connettetevi.
  6. Usate l'icona a forma di busta e fate clic su Invite by URL.
  7. Incollate il link di invito in Firefox e proseguite.
  8. Inserite un nome visualizzato, senza scegliere di lanciare l'applicazione, e proseguite nel browser.
  9. Dovreste vedere il vostro stesso schermo, a specchio quando guardate lo schermo condiviso.
  10. Aprite una nuova scheda in Firefox, senza chiudere la precedente, e inserite about:webrtc.
  11. Fate clic su Show details.
  12. Dovreste leggere ICE State: succeeded, nominated: true, selected: true, e vedere relay menzionato accanto al vostro indirizzo IP, piuttosto che host, srflx o prflx.

Rimettete l'impostazione a posto

Non dimenticate di riportare media.peerconnection.ice.relay_only a false.