Como configurar SIP y NAT

Imagen de isacnet

Tema: 

En varios foros y paginas web he visto que muchos preguntan cómo se podría tener la comunicación con asterisk detrás de un firewall con un NAT. Y en la mayoría de los casos y es lo que mas me ha disgustado, dicen escribeme a mi correo y te lo explico.

Pues bien, me canse de eso y este fin de semana me impuse la tarea de lograrlo y de verdad tras mucho leer finalmente en dos horas de lectura he logrado hacer que funcione sin mayores broncas y se los voy a compartir y ojalá lo divulguen a todos los de la comunidad.

Primero, busqué un ATA un Grandstream HT-488 que se lo compramos a Sibagal en Quito que tiene un puerto FXS y otro FXO, es pequeño y fácil de configurar, conecté un teléfono inalámbrico que tenía por alli, y parametricé el ATA para usar el puerto FXS (esta configuración es valida para todos los ATA Grandstream, antiguos y nuevos, inclusive para los teléfonos tipo BT-200, y la línea de teléfonos para el hogar de esa misma marca tipo GXP-3000 de vídeo, este último funciona super bien con video y voz, para otros ATA's deben verificar los parámetros coincidentes).

Para mi ejemplo, es necesario que el ATA se conecte directamente al enlace del proveedor

SIP Server: La IP publica del servidor donde se encuentra el NAT del Asterisk
Outbound Proxy: Vacío
SIP User ID: El número de la extensión previamente configurada en asterisk (yo uso frepbx ;) me revienta tener que hacerlo por comandos)
Authenticate ID: Aca tu puedes poner el mismo numero de extensión u otro diferente
Authenticate Password: un password!!! (por favor pongan passwords decentes, por lo menos 20 caracteres alfanumericos en mayusculas y minusculas)
Name: el nombre de la extensión

Send DTMF: via RTP (RFC2833)
NAT Traversal (STUN): Yes

Bien una vez parametrizado nuestro ATA vamso a configurar el Asterisk, pero antes un poco de lata

El problema con VoIP y NAT es que ambos extremos de la conversación tiene que ser capaces de iniciar una conexión entre sí. Considera la secuencia simplificada de los acontecimientos que se producen cuando el teléfono A llama al Telefono B con sus respectivos servidores SIP, PBX A y PBX B (pongo este ejemplo porque es el caso más típico).

PBX A envía una invitación a la SIP PBX B en nombre del teléfono A. En esta invitación aparece la dirección IP del teléfono A.

PBX B el Teléfono B invita a la conversación especificando la dirección IP del teléfono A como el otro extremo.

Si B acepta la llamada, responde a PBX B a PBX A con un reconocimiento de que incluye la dirección IP de B.

PBX A le da información al teléfono A sobre el teléfono B.

A envía audio usando el Protocolo de Tiempo Real (RTP) hacia B.

B envía audio usando RTP hacia A.

El NAT puede causar problemas en varios lugares. Si una de las PBX se encuentra detrás de una puerta de enlace NAT, la otra central no será capaz de contactar con ella sin una configuración de red adicional. Si uno o más de los teléfonos están detrás de una pasarela NAT, el otro teléfono estará tratando de enviar el audio a una dirección no enrutable. Esto da lugar a las llamadas fallidas o falta de audio (típico caso de los foros, "timbra el teléfono pero no me escuchan").

La situación más sencilla es cuando un cliente SIP está detrás de un gateway NAT se conecta a un servidor en Internet. El cliente crea la entrada de traducción para el tráfico SIP cuando se registra primero. Mientras haya una comunicación constante entre los los dos puntos por ejemplo un paquete por minuto, el canal seguirá abierto. La única configuración que se necesita es que el cliente utilice su dirección externa en todos los paquetes SDP. En los clientes que lo soportan, permiten STUN (Simple Traversal de la UDP a través de NAT), por lo que el cliente puede determinar la dirección externa de forma dinámica, o introducirlo manualmente. Asterisk no es compatible con STUN en este momento, por lo que toda la configuración NAT se debe hacer manualmente.

Ok ahora que tenemos claro la teoría vamos a configurar nuestro asterisk, estas configuraciones pueden variar de distribución en distribución pero ustedes son super despiertos y sabrán donde aplicarlas, en mi caso yo uso elastix.

Está demás mencionarlo, pero para aquellos que no tienen ni idea donde se encuentra el directorio asterisk se los mencionaré que en Elastix el directorio asterisk se encuentra en /etc/asterisk

Vamos a encontrar un archivo que se llama sip_nat.conf, alli debes poner las redes loclaes y la IP pública del servidor NAT, debes colocar lo siguiente

localnet=192.168.0.0/255.255.255.0 ; estas son las entradas de tu infraestructura interna, si tienes mas de una
localnet=192.168.1.0/255.255.255.0 ; troncalización, como es mi caso que tengo Guayaquil, Lima y Quito, es importante
localnet=172.16.4.0/255.255.255.0 ; poner todas la redes privadas para que no se confunda el asterisk en las llamadas
localnet=10.0.0.0/255.0.0.0 ; he puesto tambien mis enlaces solo por si acaso la red 10.0.0.0/8

externip=9.24.179.87 ; Aca va la IP pública del servidor NAT, en el caso de este ejemplo es una IP Falsa :)

En Elastix el FreePbx pone por defecto estas líneas en las configuraciones de las extensiones, pero siempre es mejor hechar un vistazo en sip_additional.conf

nat=yes ;Estas parametrizaciones deben estar en todas las extensiones
qualify=yes ;de la central asterisk, no son configuraciones globales, son individuales en cada extensión.

Existen otros archivos que nos van a servir de referencia para crear la reglas NAT como el archivo rtp.conf, alli nos va a dar una parametrización similar a esto:

;
; RTP Configuration
;
[general]
;
; RTP start and RTP end configure start and end addresses
;
rtpstart=10000
rtpend=20000

Asterisk necesita varios puertos RTP para funcionar correctamente. Por cada llamada se crean dos conexiones adicionales de RTP. Estos puertos y el puerto SIP entonces deberán comunicar los datos por el firewal. La sintaxis de iptables en el firewal no en el asterix es:

iptables -t nat -A PREROUTING -i eth0 -p udp -m udp --dport 10000:20000 -j DNAT --to-destination 192.168.0.10
iptables -t nat -A PREROUTING -i eth0 -p udp -m udp --dport 5060 -j DNAT --to-destination 192.168.0.10

En tu caso deberás cambiar la interface eth por la que estés usando en tu conexión pública. Fíjate que el NAT de los puertos puertos UDP coincidan con los que se especifican en la configuración del archivo rtp.conf. Muchos dicen que Linux está preparado para hacer el NAT de manera eficiente de las llamdas sip porque trae los módulos de ip_nat_sip y ip_conntrack_sip desde la versión 2.6.18 del núcleo y así evitarnos los pasos anteriores pero lamentablemente en la práctica se estrella sin éxito, obteniéndose tan solo comunicación unidireccional. En nuestro ejemplo funciona bidireccionalmente sin complicaciones y de manera limpia.

Otro tema a tratar es el asunto de los Codecs, deben definirse los codecs a usarse de manera uniforme.

Espero que este aporte sea de ayuda para algunos que como yo quieren tener una extensión de su oficina en cualquier parte.

Nota: Agradezco al mayorista Sibagal por su apoyo, con el prestamo de la central Rhyno, de sus ATA's y la buena voluntad de colaboradores para la realización de estas pruebas.

Comentarios

Elastix 2.2 RC

Buen dia, está solucion no funciona en elastix 2.2 rc1 y rc2, he intentado de muchas maneras y no logro que funcione. En versiones anteriores funciona de maravilla.

yo tampoco puedo estuchar nada en elastix 2.2 RC2

tampoco puedo escuchar nada y eso q configure el sipnat.conf y lo hice primero por freepbx/tools/asterisk sip settings. igualmente pongo los parametros correctamente y no se escucha nada y tengo otra central con elastix 2.03 y con el sipnat configurado y esa si se escucha perfectamente desde extensiones remotas el problema lo tengo en elastix 2.2 si me pudieran ayudar se los agradeceriiaaa enormemente gracias de antemano

atte david rodriguez
davidrodriguez24 arroba gmail punto com