Servidor de retransmisión (TURN)¶
Las conexiones puramente entre pares a veces no llegan a establecerse, por culpa de cortafuegos o de NAT en uno de los usuarios o en todos. Para remediarlo y franquear los cortafuegos más reticentes, se pueden desplegar uno o varios servidores TURN (Traversal Using Relay NAT).
Drovio Server admite dos formas de proporcionar retransmisores, que usted elige
con webrtc.turn_provider.type en settings.conf:
type |
Retransmisores | Credenciales |
|---|---|---|
shared_secret (por defecto) |
Sus propios servidores coturn | Calculadas localmente a partir de un secreto compartido |
cloudflare |
Cloudflare Realtime TURN | Solicitadas a la API de Cloudflare |
Alojar su propio coturn mantiene cada paquete retransmitido en la infraestructura que usted domina y le deja elegir los puertos y los protocolos abiertos. Cloudflare le ahorra la máquina que habría que instalar, actualizar y supervisar. Ambas formas se describen a continuación.
Despliegues existentes
shared_secret es el valor por defecto: un despliegue que no declara
turn_provider en absoluto sigue comportándose exactamente como antes.
Alojar su propio coturn¶
Utilizamos coturn (github.com/coturn/coturn) para nuestros servidores TURN, como la mayoría de los fabricantes, entre ellos Slack y Zoom. Coturn también hace las veces de servidor STUN, encargado de responder a la pregunta «cuál es mi dirección IP pública».
Máquina dedicada
Desaconsejamos desplegar un servidor TURN en la máquina que ya aloja Drovio Server, por razones de seguridad y de rendimiento.
Instalar en Debian¶
Coturn viene empaquetado para Debian, y la versión 13 incluye una versión casi al día, y funciona tanto en x64 como en arm64, siendo idénticos los comandos en ambos casos. Paso a paso, en una máquina Debian 13 recién instalada:
- Descomente
TURNSERVER_ENABLED=1y guarde. - Abra el fichero de configuración, consulte Configurar coturn más abajo:
Instalar en RHEL¶
Coturn está disponible mediante EPEL en RHEL 9 y 10. Paso a paso:
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install coturn
El primer comando activa EPEL, aquí en su versión para RHEL 9: adapte la URL a su versión.
Abra a continuación el fichero de configuración, consulte Configurar coturn más abajo:
Configurar coturn¶
Modifique turnserver.conf de la siguiente manera.
Escucha y red:
listening-portytls-listening-portdeben valer80y443en lugar de los puertos predeterminados, para franquear la mayoría de los cortafuegos.listening-ip: la IP pública, o la IP privada si está detrás de un NAT, por ejemplo en AWS EC2.relay-ip: idéntica alistening-ip.external-ip: la IP pública, únicamente cuandolistening-ipes una dirección privada detrás de un NAT.min-port=49152ymax-port=65535: el rango de puertos UDP que coturn asigna al tráfico retransmitido. Abra ese rango en UDP en su cortafuegos.
Autenticación:
fingerprintdebe estar descomentado.static-auth-secret=MySeCrEt: sustitúyalo por una cadena aleatoria larga. Es el secreto compartido entre Drovio Server y coturn.realm=turn.example.com: hay que sustituirlo; este valor no necesita resolver hacia nada.stale-nonce=600debe estar descomentado.
Ancho de banda:
max-bps: número máximo de bytes por segundo y por sesión. Comente la línea para no limitarlo, o fíjelo al menos en el caudal máximo configurado ensettings.conf, bajowebrtc.service_quality.maximum. Atención,max-bpsse expresa en bytes por segundo mientras quewebrtc.service_quality.maximumse expresa en kbits por segundo: el valor predeterminado de 10 Mbps corresponde a 1 250 000 bytes por segundo.
TLS (opcional, para la compatibilidad con TURNS):
certypkeydeben apuntar a su certificado y a su clave privada. Si no necesita TURNS, sáltese esta parte y utilice únicamente el puerto80al designar este servidor, consulte Configurar Drovio Server.- Rellene
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-tlsv1yno-tlsv1_1deben estar descomentados.
Endurecimiento:
no-multicast-peersdebe estar descomentado.allow-loopback-peersdebe seguir comentado, ya que el bucle local se rechaza de forma predeterminada desde coturn 4.5.2.no-tcp-relaydebe estar descomentado: Drovio solo usa la retransmisión UDP, y desactivar la retransmisión TCP reduce la superficie de ataque.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/16ydenied-peer-ip=127.0.0.0/8: impiden que el tráfico retransmitido alcance las redes privadas o de bucle local.no-software-attributedebe estar descomentado, lo que oculta la versión de coturn en las respuestas.no-rfc5780,no-stun-backward-compatibilityyresponse-origin-only-with-rfc5780deben estar descomentados. Desactivan funciones STUN heredadas, inútiles aquí, y reducen la exposición.
Seguramente también querrá aislar este servidor en su propia red o VPC.
Interfaz de línea de comandos:
cli-ip=127.0.0.1,cli-port=5766ycli-password=myclipassword: cambie la contraseña. Esta interfaz sirve para comprobar los pares conectados, ejecutandotelnet localhost 5766, escribiendo la contraseña y luegops. No exponga este puerto hacia el exterior.
Guarde y reinicie coturn:
Su servidor de retransmisión TURN, y STUN, ya está operativo.
Configurar Drovio Server¶
De vuelta en su instancia de Drovio Server:
Localice webrtc, sustituya turn_servers_secret por el valor de
static-auth-secret definido más arriba y adapte la configuración siguiente a
sus necesidades, procurando reemplazar la URL turn.example.com por la de su
máquina coturn o por su IP:
"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 primera entrada es el STUN, que solo responde a las peticiones «cuál es mi dirección IP».
- La segunda es el TURN clásico en UDP sobre 443, sin capa TLS.
- La tercera es el TURN en TCP sobre 443, sin capa TLS.
- La cuarta es el TURNS en UDP sobre 443, con una capa TLS adicional.
Esto debería funcionar con la mayoría de los cortafuegos reticentes. La sección
webrtc se aplica en caliente, así que no hay nada que reiniciar: los nuevos
servidores de retransmisión se tienen en cuenta en unos segundos.
Usar Cloudflare Realtime TURN¶
Cloudflare Realtime TURN es un servicio de retransmisión gestionado: no hay ninguna máquina que instalar, actualizar ni supervisar y cada participante es atendido por la sede de Cloudflare más cercana. Cloudflare factura el tráfico retransmitido, consulte su página de tarifas para conocer los importes vigentes.
Crear una clave TURN¶
- Abra el panel de Cloudflare y vaya a Realtime → TURN.
- Cree una clave TURN y anote su Key ID junto con su API token. El token solo se muestra una vez.
Apuntar Drovio Server a Cloudflare¶
En su instancia de Drovio Server:
Localice webrtc, ponga turn_provider en cloudflare y enumere los
retransmisores de Cloudflare en ice_servers:
"webrtc": {
"turn_provider": {
"type": "cloudflare",
"cloudflare": {
"key_id": "<su key id>",
"api_token": "<su 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 y turn_servers_auth_timeout se ignoran mientras type
valga cloudflare. Déjelos donde están: devolver type a shared_secret
restablece su instalación de coturn sin ninguna otra modificación.
Como el resto de la sección webrtc, esto se aplica en caliente y no tiene que
reiniciar Drovio Server.
Duración de las credenciales¶
ttl es el tiempo, en segundos, durante el cual una credencial entregada a un
cliente sigue siendo válida.
- Cloudflare rechaza las credenciales que viven más de 48 horas. Los valores superiores se ajustan a ese límite.
- Drovio Server renueva su credencial a mitad de esa duración.
- Un cliente pide una credencial una sola vez, al abrir una conexión, y nunca
después. Un
ttlmás corto que su reunión más larga corta la retransmisión en plena sesión. Conserve el valor predeterminado salvo que tenga un motivo para no hacerlo.
Si no se puede contactar con Cloudflare durante la renovación, Drovio Server sigue sirviendo la credencial que ya tiene hasta que caduque de verdad y registra el fallo.
Alcance frente a los cortafuegos¶
Cloudflare responde en UDP solo en el puerto 3478. Su puerto 443 es
únicamente TCP, bajo una capa TLS (turns:). Un participante detrás de un
cortafuegos que no permite nada más que el 443 de salida recae por tanto en una
retransmisión TCP. Eso añade latencia y soporta peor la pérdida de paquetes que
el UDP.
Si tiene un cortafuegos restrictivo que solo permite el puerto 443 y el rendimiento cuenta, quizá prefiera alojar su propio servidor coturn con el puerto 443 en UDP.
Verificar el servidor de retransmisión¶
Añadir ice=relay a la cadena de consulta de una URL del cliente web obliga a
todas las conexiones de esa sesión a pasar por una retransmisión, en cualquier
navegador.
- Abra la aplicación Drovio e inicie sesión.
- Use el icono con forma de rayo para iniciar una reunión instantánea.
- Copie el enlace de invitación, péguelo en un navegador y añádale
?ice=relay. - Continúe, escriba un nombre para mostrar, sin elegir abrir la aplicación, y continúe de nuevo.
- Debería ver su propia pantalla, en espejo cuando mira la pantalla compartida.
Si solo obtiene un indicador de carga, la retransmisión no es accesible o sus
credenciales se rechazan. La consola del navegador muestra además un aviso, The
url forces every connection through the TURN server, que confirma que el
parámetro se ha tenido en cuenta.