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:
- 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.
Verificar el servidor de retransmisión¶
Para comprobar que el servidor de retransmisión funciona correctamente:
- Abra Firefox.
- Escriba
about:configen la barra de direcciones, acepte y continúe. - En la barra de búsqueda, escriba
relay. - Ponga
media.peerconnection.ice.relay_onlyentrue. - Abra la aplicación Drovio e inicie sesión.
- Use el icono con forma de sobre y haga clic en Invite by URL.
- Pegue el enlace de invitación en Firefox y continúe.
- Escriba un nombre para mostrar, sin elegir abrir la aplicación, y continúe en el navegador.
- Debería ver su propia pantalla, en espejo cuando mira la pantalla compartida.
- Abra una pestaña nueva en Firefox, sin cerrar la anterior, y escriba
about:webrtc. - Haga clic en Show details.
- Debería leer ICE State: succeeded, nominated: true, selected:
true, y ver relay mencionado junto a su dirección IP, en lugar de
host,srflxoprflx.
Vuelva a dejar el ajuste como estaba
No olvide devolver media.peerconnection.ice.relay_only a false.