Configura tus propios servidores STUN y TURN para Discourse Voice

:warning: Si tu sitio está alojado por nosotros, esto ya está preconfigurado en tu sitio. Esta guía es para administradores que autoalojan Discourse.

Discourse Voice utiliza WebRTC para llamadas de voz y video. Incluye servidores STUN públicos para ayudar a los participantes a conectarse directamente. Los administradores pueden reemplazar esos servidores y agregar TURN para soportar redes donde las conexiones directas fallan.

Para un servidor dedicado a tu comunidad, recomendamos TURN con autenticación de secreto compartido y una configuración STUN vacía. Esto proporciona el descubrimiento de direcciones públicas y un respaldo de reenvío sin distribuir una contraseña TURN permanente.

Esta guía se aplica a las llamadas entre pares de Voice. Las salas que utilizan LiveKit usan la propia configuración ICE/TURN de LiveKit en su lugar. Aprende sobre la configuración de LiveKit para Voice.

¿Qué hacen STUN y TURN?

  • STUN ayuda a un navegador a descubrir su dirección IP y puerto públicos para que pueda intentar una conexión directa.
  • TURN reenvía los medios cuando no se puede establecer una conexión directa.

Una asignación TURN autenticada también devuelve la dirección pública del navegador. WebRTC puede usar esto como un candidato reflexivo de servidor, proporcionando el beneficio de descubrimiento de direcciones de STUN sin un servidor STUN separado. Especificación de TURN.

Con TURN de secreto compartido configurado, Voice permite tanto conexiones directas como reenviadas, incluso cuando su configuración STUN está vacía. Configurar solo servidores TURN no fuerza todas las llamadas a pasar por el reenvío. Configuración ICE de Voice.

1. Preparar un servidor TURN

Puedes usar un servicio TURN administrado que soporte autenticación de secreto compartido mediante la API REST de TURN, o ejecutar coturn tú mismo.

Para una configuración autoalojada, prepara:

  • Un servidor con una dirección IP pública y ancho de banda suficiente para llamadas reenviadas.
  • Un nombre de host como turn.example.com, que apunte directamente a ese servidor.
  • Acceso de firewall para su listener TURN y el rango de puertos UDP de reenvío.
  • Un certificado válido si ofreces TURN sobre TLS.

Los navegadores de los participantes se conectan directamente a TURN. Un proxy inverso HTTP ordinario o un proxy CDN no pueden transportar tráfico TURN.

Ejemplo de configuración de coturn

Genera un secreto aleatorio:

openssl rand -hex 32

Mantén el resultado privado. Ingresarás el mismo valor en coturn y en Discourse.

En un servidor con una dirección IP pública asignada directamente, usa lo siguiente como punto de partida en /etc/turnserver.conf:

listening-port=3478

fingerprint
realm=turn.example.com

use-auth-secret
static-auth-secret=REPLACE_WITH_YOUR_RANDOM_SECRET

# Deshabilita las solicitudes STUN independientes.
# Las asignaciones TURN autenticadas aún devuelven la dirección pública del cliente.
no-stun

min-port=49152
max-port=65535

no-multicast-peers

# Este ejemplo comienza sin TLS.
no-tls
no-dtls

Reemplaza el nombre de host y el secreto, protege el archivo de configuración y reinicia coturn. Elimina cualquier configuración no-auth o user= estática que entre en conflicto. El modo de secreto compartido de Coturn habilita el mecanismo de autenticación que necesita internamente. Referencia de configuración de Coturn.

Permite el tráfico entrante a:

Puerto Protocolo Propósito
3478 UDP y TCP Conexiones de navegador a TURN
49152–65535 UDP Medios reenviados

Permite también el tráfico saliente correspondiente. El rango de reenvío debe coincidir con min-port y max-port.

Si el servidor está detrás de NAT, configura el mapeo external-ip=PUBLIC_IP/PRIVATE_IP de coturn y reenvía los puertos del listener y de reenvío. Los puertos de reenvío deben mantener sus números a través de NAT. Opciones de despliegue de Coturn.

Agregar TLS para redes restrictivas

TURN sobre TLS proporciona otra opción de conexión para participantes cuyas redes bloquean UDP.

Elimina no-tls y configura:

tls-listening-port=5349
cert=/path/to/fullchain.pem
pkey=/path/to/privkey.pem

Abre 5349/TCP, asegúrate de que coturn pueda leer el certificado y la clave, y reinícialo después de las renovaciones del certificado.

Puedes usar 443/TCP en su lugar si ese puerto está disponible en el servidor TURN. Esto puede ayudar en redes restrictivas, aunque algunas redes también inspeccionan y bloquean el tráfico no HTTP en el puerto 443. El rango UDP de reenvío sigue siendo necesario cuando los navegadores llegan a TURN a través de TCP o TLS. Documentación del servidor Coturn.

2. Configurar Discourse

En Administración → Configuración, busca estas configuraciones de Voice:

Configuración Valor
voice_stun_servers Vacío — elimina las entradas predeterminadas
voice_turn_secret El valor utilizado para static-auth-secret de coturn
voice_turn_secret_servers Tus URI de TURN, separados por |
voice_turn_servers Vacío
voice_turn_username Vacío
voice_turn_credential Vacío

Para la configuración anterior, ingresa esto en voice_turn_secret_servers:

turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp

Si habilitaste TLS, agrega su punto final:

turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp|turns:turn.example.com:5349?transport=tcp

Usa URI turn: y turns:, sin //. Enumera solo los puntos finales que tu servidor realmente admite.

La lista voice_turn_secret_servers usa credenciales generadas a partir del secreto compartido. La lista separada voice_turn_servers usa un nombre de usuario y contraseña fijos. Definiciones de configuración de Voice.

Guarda las configuraciones y luego pide a los participantes que abandonen y vuelvan a unirse a las llamadas para obtener la nueva configuración.

3. Verificar la configuración

Prueba con dos participantes en redes diferentes, como banda ancha doméstica y datos móviles. Confirma que el audio funcione en ambas direcciones, luego prueba el video y el compartir pantalla.

En navegadores Chromium, abre chrome://webrtc-internals antes de unirse:

  • Un candidato srflx representa una dirección pública descubierta.
  • Un candidato relay representa un reenvío TURN disponible.
  • El par de candidatos seleccionado muestra la conexión que realmente transporta los medios.

Una llamada directa exitosa no demuestra que el reenvío funcione. Prueba también desde una red que requiera TURN, o usa un cliente de prueba WebRTC con iceTransportPolicy: "relay" y credenciales temporales.

Revisa los registros de coturn para asignaciones autenticadas exitosas. Las solicitudes sin credenciales válidas no deben obtener una asignación de reenvío. Un desafío de autenticación 401 inicial es normal; los fallos repetidos de autenticación requieren investigación.

Mantén el servidor dedicado a tu comunidad

El secreto compartido permanece en Discourse y en el servidor TURN. Los participantes reciben credenciales temporales en su lugar. Voice actualmente genera credenciales válidas para crear asignaciones durante 12 horas; una asignación establecida puede continuar mientras se renueva. Generación de credenciales de Voice.

Esto previene un reenvío abierto anónimo, pero las credenciales TURN no están vinculadas a un origen de navegador: un participante puede copiar y reutilizar sus credenciales temporales. Para limitar el abuso:

  • Restringe el acceso a Voice a los grupos previstos.
  • Monitorea el ancho de banda de reenvío y las cantidades de asignaciones.
  • Establece cuotas de asignación y límites de ancho de banda en coturn apropiados para tu comunidad.
  • Bloquea el acceso de reenvío a destinos privados, enlazados localmente y otros destinos internos alcanzables desde el host TURN.
  • Mantén coturn actualizado y rota el secreto compartido si se expone.

Usa un secreto dedicado para este despliegue de Discourse. Con no-stun habilitado, el servidor también deja de ofrecer el servicio STUN independiente anónimo. Autenticación y controles de acceso de Coturn.

Alternativas

Reemplazar solo los servidores STUN públicos

Establece voice_stun_servers en tus propias URI STUN, separadas por |:

stun:stun.example.com:3478

Deja las configuraciones TURN vacías si no necesitas un reenvío. STUN por sí solo no puede hacer que las llamadas funcionen en todas las redes. Un servidor coturn configurado con no-stun no puede servir este punto final.

Usar TURN con un nombre de usuario y contraseña fijos

Si tu proveedor no admite la autenticación de secreto compartido, configura voice_turn_servers, voice_turn_username y voice_turn_credential. Deja las configuraciones de secreto compartido vacías.

Los participantes reciben esas credenciales fijas, lo que las hace más fáciles de reutilizar fuera de tu sitio. Además, Voice actualmente fuerza conexiones de reenvío cuando se configuran servidores TURN estáticos y la lista STUN está vacía. Prefiere la autenticación de secreto compartido cuando tu proveedor la admita. Configuración ICE de Voice.

2 Me gusta