Curso Asterisk (V): Interconexión con proveedores VoIP

Ha llegado el momento de que nuestra centralita Asterisk pueda comunicarse con el exterior. Mediante el uso de proveedores de telefonía VoIP podremos realizar llamadas a la Red de Telefonía Conmutada, y también que nos puedan llamar desde ella. Aquí empieza el verdadero potencial de Asterisk.

Podemos separar los proveedores VoIP en dos categorías diferenciadas en función del servicio que proporcionan:

  • Proveedores de minutos: Permiten realizar llamadas hacia la Red de Telefonía Conmutada, cobrándonos por tiempo u ofreciéndonos tarifas planas de llamadas. Las tarifas son variadas, pero podemos encontrar precios de 1 cent/minuto o incluso menos a destinos tanto nacionales como internacionales.
  • Proveedores de DID: Nos proporcionan un número de teléfono de la Red de Telefonía Conmutada donde cualquier persona nos pueda llamar, y nos entregan las llamadas  a nuestro Asterisk. Normalmente se alquilan por meses, y tienen un coste entre 2 y 10€/mes según el proveedor y el tipo de número. Por ejemplo, podemos tener un DID de numeración fija de Madrid del tipo “91 xxx xx xx”, o de cualquier otra provincia española. También podemos alquilar números de países extranjeros para que nos llamen desde allí a precio de llamada local.

Y por supuesto, podemos encontrar proveedores que ofrezcan los dos servicios al mismo tiempo.

Para configurar un proveedor VoIP tendremos que hacer algunos cambios en nuestra configuración:

  • En “sip.conf”
    1. Añadir una nueva sección con los datos de nuestro proveedor (IP, puerto, username, password y codecs a utilizar).
    2. Añadir la línea de registro. De la misma manera que nuestras extensiones internas se registran con nuestro Asterisk, nuestro Asterisk se tiene que registrar con el proveedor externo. El registro realiza una autenticación con nuestra cuenta en el servidor VoIP del proveedor.
  • En “extensions.conf”
    1. Añadir contextos para los proveedores de DID, es decir, aquellos que sí van a interactuar con nuestro sistema para entregarnos llamadas.
    2. Los proveedores que sólo nos ofrezcan minutos no necesitan interactuar con nosotros, así que por seguridad siempre les asignaremos un contexto de rechazo. En nuestros ejemplos, el contexto “general” es un contexto de rechazo.
    3. Añadiremos las reglas de llamada para los destinos que nos interesen, modificando los contextos de aquellos usuarios que queramos que tengan salida al exterior.

 

DANDO DE ALTA LOS PROVEEDORES VOiP

Para que resulte más ilustrativo y práctico vamos a centrar los ejemplos en dos proveedores reales, probablemente dos de los más utilizados en España:

Proveedor Propósito
Netelip Proveedor tanto de DIDs (recibir llamadas) como de minutos (hacer llamadas).
FreeVoIPDeal Proveedor exclusivamente de minutos.

No me voy a centrar en el proceso de alta en las correspondientes webs, ya que se escapa de los propósitos de este curso, y además es sencillo. Vamos a suponer que hemos creado una cuenta y tenemos el nombre de usuario y clave de ambos proveedores.

Netelip

Tenemos que añadir la siguiente sección al archivo de configuración sip.conf, poniendo vuestros datos correspondientes en los campos “username” y “secret”.

A continuación pasaremos a describir los diferentes campos:

Campo Descripción

type

Con los proveedores usaremos siempre el tipo de cuenta "peer".
host El nombre o la IP del servidor SIP de nuestro proveedor.
fromdomain Establece el dominio asociado a nuestra cuenta de usuario. Este dato nos lo proporciona el proveedor.
username Nombre de usuario de nuestra cuenta SIP en el proveedor.
secret Password de nuestra cuenta SIP.
insecure El término resulta más preocupante de lo que debería. Insecure permite cambiar algunos aspectos de la autenticación, normalmente para permitir llamadas entrantes desde proveedores. En este caso, "port" indica que la autenticación se haga exclusivamente en base a IP, sin tener en cuenta el puerto; e "invite" indica que no se necesita autenticación con usuario/password para hablar con nosotros.
context El contexto donde se enviarán las llamadas entrantes desde este proveedor.
canreinvite Estableciendo a "no" obligamos a que el audio de las llamadas pasen obligatoriamente por Asterisk. Esto añade algo de latencia pero nos ahorra problemas con el NAT.

Además de lo anterior, tenemos que hacer que Asterisk envíe el usuario y password de nuestra cuenta al proveedor para registrarnos con él. Esto es necesario para indicar que estamos activos, y decirle dónde nos puede encontrar cuando nos tenga que entregar una llamada. Esta parte se hace con la línea de registro en la sección [general], indicando el nombre de usuario y el nombre de la sección que hemos definido para el proveedor, en este caso [trunk-netelip]:

FreeVoIPDeal

Hacemos lo mismo para definir la conexión con FreeVoIPDeal. La única diferencia es que reenviaremos todas las llamadas entrantes al contexto general de rechazo. Esto es porque FreeVoIPDeal sólo proporciona minutos, es decir, sólo nos permite llamar, y nunca deberíamos recibir llamadas desde este proveedor. Por tanto, por seguridad le asignamos un contexto que rechaza todas las llamadas entrantes.

Y también necesitamos una línea de registro en [general]:

 

CONFIGURANDO EL DIALPLAN

El siguiente paso es configurar el DialPlan tanto para las llamadas entrantes como para las salientes.

Supongamos que, además de los dos proveedores anteriores, tenemos dada de alta una extensión interna “3001” asociada al contexto “extensiones”.

Tenemos que hacer dos cosas:

  • Crear el contexto “callin-netelip” donde redirigiremos las llamadas entrantes para que suenen en nuestra extensión interna 3001.
  • Modificar el contexto “extensiones” para permitir llamar al exterior desde nuestras extensiones internas.

Crear el contexto “callin-netelip”

Añadiremos a nuestro DialPlan lo siguiente:

Campo Descripción

Extensión "s"

Extensión especial de Asterisk que se activa cuando no hay ninguna otra extensión del contexto actual que encaje con la llamada entrante. Como en este caso nos da igual el número de destino marcado, usamos la extensión "s" para capturar todas las llamadas entrantes sin importar el patrón.

Dial(SIP/3001)

Redirige la llamada hacia la extensión 3001 de SIP. Es decir, cuando alguien llame a nuestro número de Netelip desde la Red de Telefonía Conmutada, sonará nuestra extensión 3001.
Hangup(16) Por último, al terminar la llamada colgaremos a la persona que nos ha llamado. El código 16 indica que la llamada ha terminado con normalidad.

Modificar el contexto “extensiones”

Una de las ventajas de usar Asterisk es que podemos configurar las rutas de llamadas como mejor nos convenga. Por ejemplo, nos puede interesar cursar unos tipos de llamadas a través de un proveedor concreto por razones de calidad o precio, y el resto de llamadas a través de otro proveedor. La flexibilidad es total.

Supongamos lo siguiente:

  • Queremos usar Netelip para llamar a teléfonos fijos de España.
  • Queremos usar FreeVoIPDeal para llamar a móviles de España.
  • Queremos dar un mensaje de voz cuando se marque un número no válido (ej: llamadas internacionales).

Para organizar mejor el dialplan y asegurar que las expresiones se evalúan en el orden correcto vamos a introducir una nueva directiva: “include”. Esta directiva nos permite definir un contexto como composición de contextos, y nos permite controlar mejor el orden de evaluación de extensiones. Veámoslo con un ejemplo:

Hemos definido el contexto “extensiones” como la suma de “llamadas-externas” + “llamadas-no-validas”, en ese orden.

Al realizarse una llamada a través del contexto “extensiones”, Asterisk buscará primero una coincidencia de extensión dentro del contexto “llamadas-externas”. Si hemos marcado un número fijo español o un móvil que empiece por 6, la extensión marcada cuadrará con una de las dos definiciones existentes y cursará la llamada a través del proveedor correspondiente.

Si no cuadra con ninguna definición de “llamadas-externas”, entonces buscará en el contexto “llamadas-no-validas”. Este contexto tiene una única extensión definida que lo admite todo, por lo que siempre que se llegue hasta aquí aceptará realizando lo siguiente: descuelga, indica que el número marcado no es válido, y cuelga.

Es decir, cuando marquemos un número definido con alguna regla en “llamadas-externas”, Asterisk cursará la llamada a través del proveedor que hayamos asignado. Si el número marcado no está aceptado por nuestro DialPlan (por ejemplo llamadas internacionales o líneas 806 xxx xxx), entonces Asterisk nos dará una locución de aviso y colgará sin enviar la llamada al exterior.

 

EJEMPLO COMPLETO

Supongamos lo siguiente:

  • Tenemos una extensión interna: 3001.
  • Tenemos dos proveedores de telefonía: Netelip y FreeVoIPDeal.
  • Queremos usar Netelip para llamar a fijos de España.
  • Queremos usar FreeVoIPDeal para llamar a móviles de España.
  • Queremos que las llamadas entrantes de Netelip suenen en la extensión 3001.

Índice del Curso Asterisk:

11 pensamientos en “Curso Asterisk (V): Interconexión con proveedores VoIP

  1. Muy bueno el post, si señor. Acabo de probarlo con mi cuenta “adamvozip” que me hice ya hace unos años para poder llamar desde fuera de España y ha funcionado a la primera. Permíteme que te plantee no obstante una duda:

    Imaginemos que tenemos mas de un número geográfico en nuestro Asterisk, todos con Netelip por ejemplo. En sip.conf deberíamos tener una línea register por cada número y un apartado [trunk-netelip] por cada número también, creo que eso es así, pero me entra una duda en cuanto a extensions.conf: ¿metemos todos los [trunk-netelip] de sip.conf dentro del mismo contexto y luego en extensions.conf ponemos tantos “exten => num_geografico,1,Dial(SIP/Extension_interna)” como números tengamos? ¿O por el contrario deberíamos tener un contexto por cada [trunk-netelip] y meter una línea como la que especificas en el ejemplo?

    Saludos.

  2. Hola Joaquín,

    Me alegro de que el post te haya servido. Te contesto por partes a tu duda:

    En “sip.conf” no hace falta hacer ningún cambio, ya que tu cuenta de cliente con Netelip es única. Que tengas cero, uno o diez números de teléfono asociados a ella no influye en la configuración de Asterisk. En todos los casos sería un único apartado [trunk-netelip] y una sola línea de registro, tal y como figura en el ejemplo.

    En “extensions.conf” ocurre algo parecido. Si todas las llamadas entrantes las vas a enviar a la misma extensión interna independientemente de qué número hayan marcado, entonces tampoco hace falta cambiar nada. La extensión especial “s” utilizada en los ejemplos captura todas las posibilidades. Si quisieras distinguir entre los números entonces efectivamente tendrías que hacer lo que describes: todas las llamadas van al mismo contexto, y dentro de ese contexto habría que distinguir con tantos “exten => num_geografico,1,Dial(SIP/Extension_interna)” como números tengamos. Sin embargo, tengo mis dudas de que Netelip distinga entre distintos números, por lo que habría que hacer pruebas para ver si funciona de esta manera.

    Un saludo.

  3. Quizá no me expresé del todo claro.
    Me refería a que en un mismo asterisk hubiera X usuarios cada uno con su número geográfico y su cuenta netelip. Imagino que al ser usuarios distintos habría que tener un register por cada uno, aunque todos estuvieran con el mismo proveedor ¿no?

  4. Ahora sí te he entendido. Efectivamente en ese caso haría falta una sección [trunk-netelip-username] y un “register => username@trunk-netelip-username” para cada cuenta.

    Sobre los contextos, de nuevo desconozco si Netelip nos envía la extensión marcada por la persona llamante. Si no fuera así, tendrías que crear un contexto diferente para cada usuario y recurrir a la extensión “s” como en los ejemplos. Si nos envía la extensión marcada, entonces podrías reunir a todos los usuarios dentro de un mismo contexto y discriminar por extensión con “exten => num_geografico,1,Dial(SIP/Extension_interna)”, tal y como has mencionado. La primera aproximación siempre funciona. La segunda depende de Netelip.

    Un saludo.

  5. Podrías hacer lo mismo con los proveedores voip de movistar y jazztel ahora que la ftth utiliza la voip.
    Los nuevos usuarios que pasamos del cobre a la voip se nos hace cuesta arriba las configuraciones de asterisk.

    Enhorabuena por el blog.
    Gracias.

  6. Hola,

    No hay un consenso claro sobre la configuración apropiada para la FTTH de Movistar, ya que ellos mismos mantienen en secreto los parámetros de conexión, y lo que se sabe se ha sacado mediante sniffers en su router. Sobre la FTTH de Jazztel, no lo tengo tan investigado, pero parece que la configuración se puede sacar del propio router, incluido password y proxy saliente. En cualquier caso no tengo acceso a ninguna de las dos conexiones, por lo que sin poder probarlo no puedo dar una solución válida. Espero que el despliegue de FTTH llegue algún día a donde vivo, pero desgraciadamente hoy por hoy no es el caso.

    Un saludo.

  7. Gracias por contestar.
    Ya he visto en otro foro los avances que van surgiendo entorno a movistar y jazztel.
    Seguiremos el curso de asterisk atentamente.
    Saludos y adelante.

    P.D.: Espero que te llegue pronto la cobertura de ftth.

  8. Hola, muy bueno tu curso, quisiera aportar un “truquillo” para las llamadas salientes con Freevoipdeal. Dentro del contexto [trunk-freevoipdeal] si añadimos la siguiente linea fromuser=+34XXXXXXXXX podremos hacer que al remitente le aparezca como identificador de llamada el numero que hemos puesto en fromuser. Previamente debes agregarlo desde freevoipdeal -> Settings y en el apartado Phone Numbers, te permite añadir hasta 3 telefonos diferentes.

    Saludos y enhorabuena!

  9. Hola como hiciera con mi proveedor en Nicaragua? funcionara con los proveedores de españa?

  10. Necesitas que tu proveedor te pase los datos de configuración. En general, necesitarás conocer el host, username y secret (password). Los demás datos de la plantilla los puedes dejar tal y como están.

  11. ¡Hola!

    Una duda, si en vez de un proveedor de voip tuviera configurado asterisk para salir al exterior con una linea analógica a través de una PAP2T de Cisco como tendría que configurarse?

    Un saludo y gracias de antemano!
    Buen tutorial!

Deja un comentario

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