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

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.

Verificar el servidor de retransmisión

Para comprobar que el servidor de retransmisión funciona correctamente:

  1. Abra Firefox.
  2. Escriba about:config en la barra de direcciones, acepte y continúe.
  3. En la barra de búsqueda, escriba relay.
  4. Ponga media.peerconnection.ice.relay_only en true.
  5. Abra la aplicación Drovio e inicie sesión.
  6. Use el icono con forma de sobre y haga clic en Invite by URL.
  7. Pegue el enlace de invitación en Firefox y continúe.
  8. Escriba un nombre para mostrar, sin elegir abrir la aplicación, y continúe en el navegador.
  9. Debería ver su propia pantalla, en espejo cuando mira la pantalla compartida.
  10. Abra una pestaña nueva en Firefox, sin cerrar la anterior, y escriba about:webrtc.
  11. Haga clic en Show details.
  12. Debería leer ICE State: succeeded, nominated: true, selected: true, y ver relay mencionado junto a su dirección IP, en lugar de host, srflx o prflx.

Vuelva a dejar el ajuste como estaba

No olvide devolver media.peerconnection.ice.relay_only a false.