Curso Asterisk (VI): Lidiando con el NAT

El enemigo público número uno del protocolo SIP son las tablas NAT. El NAT es la principal causa de problemas a la hora de montar nuestro servidor Asterisk. Desafortunadamente para nosotros, debido a la falta de IPs públicas de IPv4, lo normal en nuestros hogares es que estemos detrás de un NAT. Por lo tanto, si queremos montar nuestro Asterisk dentro de casa, tendremos que pelearnos con él.

Si haciendo pruebas se obtienen alguno de estos resultados, casi seguro que estemos experimentando problemas derivados de estar dentro de una red privada con NAT:

  • Audio sólo en un sentido
  • Ausencia total de audio en ambos sentidos
  • No puedes recibir llamadas
  • Las llamadas se cortan transcurridos 10-30 segundos desde el establecimiento

 Los escenarios posibles son los siguientes:

  • El servidor está detrás de un NAT
  • Sólo un extremo está detrás de un NAT
  • Ambos extremos están detrás de un NAT
  • Ambos extremos y el servidor están detrás de un NAT

El escenario más complicado es el último, donde uno de los extremos de la conversación está detrás de un NAT, el otro extremo está detrás de otro NAT diferente, y el servidor está detrás de un tercer NAT.

Las soluciones que se encuentran por Internet en ocasiones resultan confusas, incorrectas o incompletas. Personalmente me ha costado mucho tiempo y esfuerzo dar con la solución definitiva. Afortunadamente para vosotros, una vez que tienes el conocimiento no es tan complicado aplicarlo. Lo vamos a ver en dos apartados: solucionar los problemas de los extremos, y solucionar los problemas del servidor.

Extremos detrás de un NAT

Deberemos añadir las siguientes dos líneas en la sección [general] de la configuración SIP de nuestro Asterisk:

Y punto. No tiene más misterio.

Servidor detrás de un NAT

Tenemos que hacer dos cosas. Por un lado, debemos abrir en el router los puertos necesarios hacia la IP de nuestro servidor Asterisk.

Para ello, debemos consultar el contenido de “/etc/asterisk.rtp.conf” y fijarnos en los valores de los parámetros “rtpstart” y “rtpend”. Por ejemplo:

Según el ejemplo, debemos abrir en nuestro router el rango de puertos 10000-20000/UDP, además del 5060/UDP correspondiente al protocolo SIP. Consulta el manual de tu router para saber cómo abrir puertos hacia la IP de tu servidor Asterisk.

Por otro lado, necesitaremos un servicio de DNS dinámico del tipo No-IP o FreeDNS. Si no sabes cómo hacerlo, en Internet hay numerosas guías que lo explican muy bien.

Vamos a suponer que tenemos un dominio “ejemplo.no-ip.org” correctamente configurado, y que el rango privado de IPs de nuestra red es del tipo “192.168.0.x”.  Deberemos añadir las siguientes líneas en la sección [general] de la configuración SIP de nuestro Asterisk:

Gracias a esta configuración, nuestro servidor Asterisk sabe cuándo las peticiones surgen desde dentro de la propia red privada del servidor, y cuándo provienen del exterior. En este último caso, en lugar de encapsular la IP privada del servidor en los paquetes SIP, utiliza la IP pública a la que apunta el dominio especificado. De esta manera, el extremo obtiene la IP de contacto correcta y puede responder correctamente al servidor.

Ejemplo completo

Supongamos lo siguiente:

  • Queremos poder contactar con extremos que estén detrás de un NAT
  • Nuestro servidor Asterisk está detrás de un NAT
  • El rango de IPs privadas de nuestro servidor Asterisk es de la forma 192.168.0.x
  • Tenemos un dominio DNS dinámico “ejemplo.no-ip.org” correctamente configurado con la IP pública de nuestro Asterisk

Para cumplir con estos objetivos, deberíamos añadir las siguientes líneas a la sección “general” de nuestra configuración SIP:

Consideraciones adicionales

  • Si los clientes disponen de ellas, conviene activar las opciones STUN e ICE.

 

Índice del Curso Asterisk: