Conectar dos Asterisk entre sí mediante un enlace SIP o SIP Trunk es un proceso relativamente sencillo y que solo requiere de unas pocas líneas de configuración en los ficheros sip.conf y extensions.conf:
-
En el fichero extensions.conf: También conocido como el dialplan se configura lo que sucede cuando entra una llamada por el enlace con el otro Asterisk y se configura también en que casos las llamadas generadas en las extensiones del sistema deben de salir por dicho enlace. En los dos casos la configuración es sencilla y con un poco de experiencia en sistemas Asterisk es fácil entender el significado de cada una de las líneas de configuración, proponer modificaciones y resolver posibles errores.
-
En el fichero sip.conf: Se establece el enlace o trunk con el otro Asterisk, y aquí, a diferencia del fichero extensions.conf, aparecen unas líneas de configuración nada fáciles de entender a simple vista. La dificultad reside en las múltiples opciones que se deben de tener en cuenta a la hora de establecer un enlace con otro sistema Asterisk. Con el siguiente ejemplo práctico se pretende mostrar algunos de los diferentes casos de configuración de enlaces SIP entre sistemas Asterisk:
El sistema de pruebas se ha puesto en marcha sobre dos Asterisk ejecutándose sobre sendos Ubuntu Server 16.04 y todo ello virtualizado sobre VMware. Los softphones utilizados han sido los conocidos PhonerLite, Zoiper, MicroSIP y Blink.
Sistema de pruebas con dos Asterisk y dos softphones registrados en cada Asterisk
En primer lugar se ha creado un enlace SIP bidireccional entre ambos Asterisk conociendo para ello la dirección IP donde se encuentra cada uno de dichos Asterisk. Los ficheros sip.conf tienen el siguiente contenido:
Ficheros sip.conf para ambos Asterisk
En los ficheros sip.conf anteriores solo aparece el registro de las extensiones 601 y 701 y para las extensiones 602 y 702 el proceso es similar y no ofrece especial dificultad. La clave secret utilizada para registrar cada una de las extensiones puede ser cualquiera. Por otro lado, en el enlace SIP se ha marcado en color lo siguiente:
- En color rojo: El nombre del enlace y que se utilizará en llamadas salientes, en la aplicación Dial() dentro del fichero extensions.conf.
- En color verde: La dirección IP hacia donde tiene que apuntar el enlace, es decir, la dirección IP del otro Asterisk.
- En color azul: El nombre del context donde se recibirán las llamadas entrantes por dicho enlace. Este context deberá de existir en el fichero extensions.conf
En cuanto a los ficheros extensions.conf, un ejemplo básico de tratamiento de las llamadas entrantes y salientes por dicho enlace sería el mostrado a continuación:
Fichero extensions.conf para el Asterisk_A y el Asterisk_B
En ambos ficheros extensions.conf la configuración es la misma y las llamadas salientes a través del enlace creado lo hacen únicamente cuando marcamos un número de extensión del otro Asterisk:
- Para el Asterisk_A la llamada se saca por el enlace SIP cuando se cumple el patrón de marcado _70X
- Para el Asterisk_A la llamada se saca por el enlace SIP cuando se cumple el patrón de marcado _60X
Para las llamadas entrantes también en ambos ficheros la configuración es similar:
- Asterisk_A: Las llamadas que vienen por el trunk SIP entran en el dialplan a través del context Entrantes_Trunk_Asterisk_B.
- Asterisk_B: Las llamadas que vienen por el trunk SIP entran en el dialplan a través del context Entrantes_Trunk_Asterisk_A.
Con esto creado ya podemos comprobar con el comando sip show peers en ambos Asterisk que el enlace está creado y que las extensiones están correctamente registradas
sip show peers para el Asterisk_A y el Asterisk_B
Si ahora probamos a hacer llamadas desde un Asterisk al otro, veremos que el resultado es correcto en ambos casos, tanto del Asterisk_A hacia el Asterisk_B como desde el Asterisk_B hacia el Asterisk_A
Llamadas entre softphones a través del enlace SIP creado
En el enlace SIP creado se han utilizado direcciones IP absolutas para identificar a cada uno de los extremos del enlace, pero si se utilizan nombres de dominio, funciona exactamente igual. En un entorno de pruebas como este, con ambos Asterisk virtualizados sobre VMware, bastará con indicar en los respectivos ficheros hosts de cada uno de los Linux la correspondencia entre el nombre de dominio y la dirección IP real. En las siguientes capturas de pantalla se muestra otro ejemplo de comunicación de sistemas Asterisk donde los equipos han sido situados en las direcciones 192.168.1.100 y 192.168.1.150. Se han asignado los nombres de dominio Asterisk_A.com y Asterisk_B.com y en los ficheros hosts de ambos Linux (Ubuntu 14.04) se ha resuelto dichos nombres de dominio con las direcciones IP indicadas anteriormente.
Enlaces SIP utilizando nombres de dominio
Modificación en los ficheros hosts de Linux
Ahora bien, lo mismo que en la red de telefonía pública podemos recibir llamadas desde cualquier otro usuario sin que previamente hayamos acordado nada con él, en Asterisk también nos pueden llegar llamadas de otro Asterisk remoto, sin que hayamos creado un enlace SIP con el. En estos casos podemos permitir dichas llamadas o denegarlas:
- Llamadas permitidas: Si en el fichero sip.conf añadimos allowguest = yes las llamadas entrarán en el dialplan a través del context = default, donde las daremos el tratamiento que consideremos oportuno. Observar que al no haber un canal establecido, no hay un context creado donde puedan ser recibidas dichas llamadas y por eso irán siempre a un context por defecto, el context =default.
- Llamadas prohibidas: Si en el fichero sip.conf añadimos allowguest = no, aunque exista un context=default las llamadas serán automáticamente rechazadas.
La comprobación práctica se muestra a continuación. Para ello, en el sistema anterior hemos eliminado el enlace SIP en el Asterisk_B:
Enlace con el Asterisk_A fuera de servicio
Comprobación con sip show peers que no existe el enlace SIP con el Asterisk_A
Añadimos en extensions.conf el context [default], haciendo que, por ejemplo, cuando se llame a la extensión 701, suenen simultáneamente las extensiones 701 y 702
Llamada entrante al Asterisk_B través del context=default
Y efectivamente, cuando desde la extensión 601 marcamos el número 701, la llamada sale por el enlace creado en el Asterisk_A hacia el Asterisk_B y entra por el context=default, haciendo sonar en este caso las extensiones 701 y 702 a la vez (Atención: no olvidar colocar allowguest=yes en el fichero sip.conf del Asterisk_B).
Los enlaces SIP creados en los ejemplos anteriores contienen la dirección IP del Asterisk situado en el otro extremo del enlace, ya sea de forma explícita o con un nombre de dominio asociado a una dirección IP, pero cuando se establece un enlace SIP con un operador de VoIP esto no es lo más conveniente, ya que el operador de VoIP tendría que conocer las direcciones IP de cada uno de sus abonados. El problema sería especialmente grave para un operador de VoIP con miles o decenas de miles de abonados, máxime teniendo en cuenta que la mayoría de los clientes de ese operador contarán, con toda seguridad, con una dirección IP dinámica. En estos casos es mejor utilizar la función de registro mediante la cual los clientes o abonados se registran en el operador de VoIP a intervalos regulares, informando al operador de VoIP de la dirección IP que tienen en cada momento. Esta función de registro se hace desde la sección [general] del fichero sip.conf y un ejemplo de la misma se muestra a continuación:
Registro con el operador de VoIP sarevoz.com
La orden register puede llevar varios parámetros, entre ellos el identificador del usuario, un password y el dominio del SIP server donde nos vamos a registrar. Como se ha indicado anteriormente, el registro en un SIP server se efectúa a intervalos regulares, por lo que dicho SIP server conocerá en todo momento nuestra dirección IP actual y con esta información será capaz de enviarnos las llamadas que tenga para nosotros. Si no indicamos ningún otro parámetro, las llamadas entrantes serán enviadas a la extensión s o extensión de start, pero si se quiere, se puede hacer que todas las llamadas entrantes marquen una determinada extensión, añadiendo al final de la orden register dicho parámetro. En el dialplan es necesario programar que deberá hacer Asterisk cuando reciba una llamada entrante con esa extensión por el enlace SIP.
register => user:secret@domain/extensión
Orden register con el parámetro de la extensión donde se enviarán las llamadas
Modificación en el dialplan
En el ejemplo de la figura anterior aparece enmarcado en color azul lo que debe hacer Asterisk cuando recibe una llamada entrante con esa extensión, debiendo estar dentro del contexto a donde se dirigen las llamadas entrantes que provienen de nuestro operador de VoIP.
Respecto a las llamadas salientes desde nuestro Asterisk hacia el operador de VoIP, habitualmente es necesario indicar también el usuario y la contraseña o valor secret para que el operador admita esas llamadas entrantes.
Enlace SIP para las llamadas salientes al operador de VoIP
En la configuración anterior, la opción register le permite a nuestro proveedor de VoIP conocer la dirección IP donde estamos en cada momento y de esta forma, cada vez que dicho proveedor tenga una llamada entrante para nosotros, la enviará a nuestra dirección IP mediante el correspondiente INVITE. Puesto que los proveedores de VoIP acostumbran a tener una IP fija, no es necesario que ellos se registren ante un usuario y por eso la opción host=sarevoz.com es suficiente para que nuestro Asterisk conozca a que dirección IP tiene que enviar los paquetes INVITE cada vez que tiene una llamada saliente hacia el proveedor de VoIP.
El parámetro insecure = port, invite sirve para las dos siguientes cosas:
- que nuestro Asterisk acepte los INVITE que provienen del operador sin tener en cuenta el número de puerto desde el cual provienen.
- que nuestro Asterisk no solicite autenticación a los INVITE provenientes por ese enlace SIP, que serán las llamadas provenientes del operador. Como el operador no se registra contra nuestro Asterisk, no existe un valor secret por el que se le pueda preguntar, para confirmar su autenticidad.
Llamada entrante desde Sarenet con el parámetro insecure=port, invite
La misma llamada desde Sarenet sin el parámetro insecure=port, invite
Como se observa en las capturas de pantalla anteriores, con el parámetro insecure=port, invite en el fichero sip.conf, cuando viene un INVITE desde el operador por el enlace SIP, éste es aceptado y la llamada continúa su curso normal. Por el contrario, si no está el parámetro insecure=port, invite en el fichero sip.conf, el INVITE es rechazado con una respuesta de tipo 401 Unauthorized. En esa respuesta se incluye un valor nonce para solicitar la autenticación mediante el algoritmo MD5, pero el operador finaliza la llamada porque no puede realizar tal autenticación, al carecer de un número secret para ello.
Respuesta 401 Unauthorized, con el valor “nonce” para la autenticación con MD5
Buen día
las respuestas de los códigos SIP, donde se pueden configurar, soy nuevo en esto pero resulta que tengo un host para RTP que me envia un error a mi asterisk error 404, 481, 500 pero siempre mi asterisk propaga eso a los demás equipos como un 503.
Hola quisiera me me den una mano con el tema..
La idea es con una VPS (VM) de Azure y en Ubuntu con Script ADM par saber cómo hacer una cuenta SIP…
Hola quisiera me me den una mano con el tema..
La idea es con una VPS (VM) de Azure y en Ubuntu con Script ADM par saber cómo hacer una cuenta SIP
Hola Jerry
En freepbx puedes hacer sip trunk entre dos sistemas con freepbx sin ningún problema especial, ya que freepbx en realidad es un Asterisk con un entorno gráfico. Si buscas con un poco de cuidado, en Internet tienes un buen número de ejemplos de como hacerlo.
Un saludo
Enrique del Río
CIFP Tartanga
Erandio
Bizkaia
Buenas tardes, interesante post. Una pregunta, cómo puedo realizar el mismo procedimiento a través de freepbx (soy novato en esto)