NAT en Asterisk

El NAT (del inglés " Network Address Traslation ") es un mecanismo utilizado por routers IP para intercambiar paquetes entre dos redes con rangos de direcciones incompatibles. Sin NAT no existiría Internet tal y como lo conocemos hoy en día. Pero... ¿Cómo le afecta a la VoIP?

Superar la barrera NAT intermedia es uno de los grandes quebraderos de cabeza que tiene Asterisk ya que protocolos como SIP presentan muchos problemas cuando tienen que atravesarla. Con el tiempo, han ido surgiendo soluciones que intentan puentear este sistema aunque antes de analizarlas vamos a tener en cuenta un detalle fundamental y es que " sólo será necesario especificar el parámetro NAT cuando trabajamos con clientes SIP que no están en la misma red que nuestra centralita ".

Posibles valores dentro del sip.conf (se configura para aquellos peers para los que sea necesario):

  • nat = yes - Se trabaja según la RFC3581. Se permite trabajar con soporte simétrico RTP (Cuando un cliente SIP usa el mismo socket/puerto para enviar y recibir el flujo de datos RTP). A partir de asterisk 11 se sustituye por ' nat = force_rport,comedia '. Es la configuración más común.
  • nat = no - Se permite trabajar según la RFC3581 si el extremo remoto de la comunicación lo solicita pero se deshabilita en cualquier caso el soporte simétrico RTP.
  • nat = force_rport - Se fuerza a trabajar según la RFC3581 y se deshabilita el soporte simétrico RTP.
  • nat = comedia - Se permite trabajar según la RFC3581 si el extremo remoto de la comunicación lo solicita y se obliga a trabajar con soporte simétrico RTP.

Si nuestro servidor de Asterisk espera recibir mensajes SIP en el puerto 5060, tendremos que asegurarnos de que también se utiliza el 5060 en el NAT de nuestra red para reenviar estos mensajes y lo mismo ocurre con el rango de puertos RTP.


Trunking

En pocas palabras podríamos decir que el trunking es un mecanismo que nos permite comunicar nuestros clientes (pertenecientes a una red 'A') con otros clientes dentro de una red diferente, a la que llamaremos 'B', como si estuvieran dentro de nuestra misma red .

Cuando trabajamos con varias sedes (por ejemplo, una en Madrid y otra en Berlín), nos puede interesar tener dos servicios Asterisk (uno en cada sede) y comunicarlos entre sí mediante trunking. Si sólo tuviéramos un servidor de Asterisk en Madrid, y alguien de Berlín quisiera llamar a un compañero de su mismo edificio, la llamada tendría que ir a Madrid, ser procesada en el servidor de Madrid y volver a Berlín (lo que supone un tiempo de ida y vuelta relativamente alto y un esquema poco eficiente). En cambio, si configuramos servidores en ambos puntos, las llamadas de Berlín con destino Berlín SE OLVIDAN de lo que ocurre en Madrid con lo que ganamos velocidad, eficiencia o una mala calidad del servicio.

Tal y como se comentaba recientemente en el grupo de usuarios de Asterisk en español , el esquema del que podemos aprender más es el que tiene como extremos un servidor con Asterisk y con una dirección IP pública fija, y otro configurado con IP dinámica:

Equipo en Madrid - Tiene una IP Fija

[trunk-berlin]
type=friend
context=entrantes-berlin
host=dynamic
secret=password-berlin
fromuser=trunk-berlin
defaultuser=trunk-berlin
; ... resto de parámetros como dtmfmode, qualify, canreinvite, etc.


Equipo en Berlín - Tiene una IP Dinámica

[general]
...
register => asterisk-berlin:password-berlin@madrid.es/asterisk-berlin

[trunk-madrid]
type=friend
context=entrantes-madrid
host=madrid.es
fromdomain=madrid.es
insecure=port,invite
; ... resto de parámetros como dtmfmode, qualify, canreinvite, etc.


La idea del esquema es muy sencilla:

  • Si ambos servidores tienen IPs fijas - Entonces hacemos una definición del sip-trunk por IP sin necesidad de user/pass. El servidor de Asterisk de cada sede estará haciendo el registro por hostname/IP.
  • Si alguno de los servidores tiene una IP dinámica - Entonces será necesario o bien instalar un cliente como dyndns y configurar el trunking tal y como se hace cuando tenemos IPs fijas en ambos extremos; o bien hacer que el extremo con IP dinámica haga un register al extremo que la tiene fija (registers cruzados en caso de que ambos sean dinámicos aunque este esquema no es recomendable para ningún entorno en producción).