Servidor Turn / Stun que son y como configurarlos

Cuando queremos utilizar una comunicación punto a punto (p2p), entre dos entidades (dispositivos, navegadores, programas, lo que sea), dentro del mar de internet, necesitamos conocer cual es su IP «aparente». Y digo aparente porque hay combinaciones de lo más peculiares; detrás de un router (nat), detrás de un router que abre puertos por Upnp, detrás de un CG-Nat (terminales móviles en 3G-4G-5G sería un ejemplo) y otros muchos vericuetos.

En este tipo de situaciones necesitamos saber que ip tenemos para el resto de la humanidad, comprobar si somos accesibles desde el exterior y en caso contrario necesitaremos de un servidor espejo que rebote la señal (o la «gire») a nuestra dirección.

Aquí necesitaremos un servidor STUN (Session Traversal of User Datagram Protocol) que nos permita saber que tan accesibles somos, y en caso de ser inaccesibles (detrás de un router por ejemplo conectado al wifi de casa o el del trabajo) necesitaremos entonces de los servicios de un servidor TURN (Traversal Using Relays around NAT) para que rebote la señal y así nos permita esa comunicación punto a punto.

Todo esto en un contexto de videoconferencia, con ambos servicios, podremos realizar la videoconferencia de un punto al otro utilizando ambos servidores, el que nos permite encontrarnos nuestra ip externa (STUN) y en caso de que necesitemos ayuda por no poder comunicar de manera directa, usaremos un TURN para rebotar en él la señal y los paquetes de datos, permitiendo de este modo la video conferencia. Lo mismo se podría aplicar para la transferencia de ficheros entre dos entidades.

Creo que es evidente que ambos servidores deben ser accesibles desde internet por cualquier solicitante. Si queremos instalar este servicio en nuestro servidor propio, tendremos no solo que instalar los programas adecuados, sino que además hemos de abrir los puertos indicados para el uso de este servicio.

En este caso nos vamos a centrar en la herramienta CoTurn (https://github.com/coturn/coturn) que nos permite proveer ambos servicios, y en la configuración de la misma para utilizarlo con nuestro servidor Nextcloud, para poder usar Nextcloud Talk (https://github.com/nextcloud/spreed). Todo dentro del contexto de una distribución tipo debian, ya sea Yunohost, Ubuntu o la misma Debian.

Instalación de CoTurn y configuración

sudo apt install coturn

Con este sencillo comando instalamos el servicio. Lo que tenemos que pasar es a configurarlo. Aunque hay mil guías de configuración, dado que lo vamos a usar para Nexcloud Talk para poder hacer videoconferencias, no nos detenemos en nada más que lo necesario. La configuración está extensamente documentada e indica todos los parametros que podemos usar. La tendremos disponible en «/etc/turnserver.conf». Primero tenemos que asegurarnos que se vuelva a cargar el servidor coturn con cada reinicio

sudo nano /etc/default/coturn

#
# Uncomment it if you want to have the turnserver running as
# an automatic system service daemon
#
TURNSERVER_ENABLED=1

Editando el archivo «/etc/default/coturn» dejamos el valor «TURNSERVER_ENABLED=1», guardar y salir. De este modo nos aseguramos que en el próximo arranque de la maquina tendremos el servidor disponible. Ahora nos vamos al servicio en sí.

sudo nano /etc/turnserver.conf

listening-port=3478 
tls-listening-port=5349
fingerprint
lt-cred-mech
use-auth-secret
static-auth-secret=secretocompartidoparaelservidorturn
realm=dominio.dlt
total-quota=100
bps-capacity=0
stale-nonce
cert=/etc/dondetengaselcertificado/crt.pem
pkey=/etc/dondetengaselcertificado/key.pem
no-stdout-log
log-file=/var/log/turn.log
syslog
simple-log
no-loopback-peers
no-multicast-peers

Aunque actualmente Spreed (el nombre interno de Nextcloud Talk) no usa TURN sobre TLS, en este caso estámos permitiendo que se haga su uso. Indicando donde tenemos el certificado para el dominio que hemos especificado en «realm», que es a su vez donde se indica el dominio en el que instalamos el servidor. Además en vez de un servicio con pares usuario/contraseña, estamos utilizando una contraseña única de acceso en el ejemplo «secretocompartidoparaelservidorturn», que por supuesto debemos cambiar por la que vamos a usar. «bps-capacity=0» quita las limitaciones de capacidad permitiendo que de todo lo que de de sí el servidor, se puede ajustar a la velocidad de subida de nuestra conexión o incluso un valor inferior para que no sature servicios terceros.

En el caso de discos duros ssd o de SBC que suelen utilizar memorias SD, sería recomendable que o suprimamos los logs («log-file…») o que montemos la partición /var en un disco duro convencional (por ejemplo enchufado por usb).

Configuración de Nextcloud Talk para el uso del servidor

En mi caso el dominio es «miradordemontepinar.net» y me he encargado antes ya de abrir los puertos en mi router, dirigiéndolos a la maquina que se va a encargar de este servicio.

Con esta simple configuración, tendremos disponible el servicio de Nexcloud Talk para poder hacer videoconferencias, sea cual sea la configuración IP, dado que el servidor coturn se encargará de «girar» o «rebotar» la señal entre los dispositivos que usemos. Por cuestiones de seguridad he tapado mi «static-auth-secret» que deberemos indicarle a Nextcloud Talk para que pueda usar el servidor.

No olvidemos nunca de reiniciar el servicio de CoTurn después de modificar la configuración, se puede reiniciar el servicio de manera muy fácil.

sudo systemctl restart coturn.service

Con esto quedaría el servicio disponible y usable.

Ref. https://help.nextcloud.com/t/setting-up-talk/27065

Ref. https://www.netways.de/blog/2017/08/16/setting-up-a-turn-server-for-nextcloud-video-calls/

Ref. https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>