Saltar a contenido

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:

sudo apt update
sudo apt install coturn
sudo nano /etc/default/coturn
  • Descomente TURNSERVER_ENABLED=1 y guarde.
  • Abra el fichero de configuración, consulte Configurar coturn más abajo:
sudo nano /etc/turnserver.conf

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:

sudo nano /etc/coturn/turnserver.conf

Configurar coturn

Modifique turnserver.conf de la siguiente manera.

Escucha y red:

  • listening-port y tls-listening-port deben valer 80 y 443 en 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 a listening-ip.
  • external-ip: la IP pública, únicamente cuando listening-ip es una dirección privada detrás de un NAT.
  • min-port=49152 y max-port=65535: el rango de puertos UDP que coturn asigna al tráfico retransmitido. Abra ese rango en UDP en su cortafuegos.

Autenticación:

  • fingerprint debe 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=600 debe 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 en settings.conf, bajo webrtc.service_quality.maximum. Atención, max-bps se expresa en bytes por segundo mientras que webrtc.service_quality.maximum se 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):

  • cert y pkey deben apuntar a su certificado y a su clave privada. Si no necesita TURNS, sáltese esta parte y utilice únicamente el puerto 80 al designar este servidor, consulte Configurar Drovio Server.
  • Rellene 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 y no-tlsv1_1 deben estar descomentados.

Endurecimiento:

  • no-multicast-peers debe estar descomentado. allow-loopback-peers debe seguir comentado, ya que el bucle local se rechaza de forma predeterminada desde coturn 4.5.2.
  • no-tcp-relay debe 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/16 y denied-peer-ip=127.0.0.0/8: impiden que el tráfico retransmitido alcance las redes privadas o de bucle local.
  • no-software-attribute debe estar descomentado, lo que oculta la versión de coturn en las respuestas.
  • no-rfc5780, no-stun-backward-compatibility y response-origin-only-with-rfc5780 deben 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=5766 y cli-password=myclipassword: cambie la contraseña. Esta interfaz sirve para comprobar los pares conectados, ejecutando telnet localhost 5766, escribiendo la contraseña y luego ps. No exponga este puerto hacia el exterior.

Guarde y reinicie coturn:

sudo systemctl restart coturn

Su servidor de retransmisión TURN, y STUN, ya está operativo.

Configurar Drovio Server

De vuelta en su instancia de Drovio Server:

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

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

  1. Abra el panel de Cloudflare y vaya a Realtime → TURN.
  2. 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:

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

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 ttl má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.

  1. Abra la aplicación Drovio e inicie sesión.
  2. Use el icono con forma de rayo para iniciar una reunión instantánea.
  3. Copie el enlace de invitación, péguelo en un navegador y añádale ?ice=relay.
  4. Continúe, escriba un nombre para mostrar, sin elegir abrir la aplicación, y continúe de nuevo.
  5. 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.