Tutorial #Asterisk: Manual de Asterisk para novatos

tutorial-asteriskHoy buscando en la red de redes, tratando de encontrar un manual que valga la pena encontré uno de Diego Castillo Barnés(@dcastillobarnes) en openwebinars.net, creo que a todos los que deseen iniciarse en Asterisk, no les vendría mal.

Tutorial Asterisk: ¿Qué es la VoIP?

VoIP ¿Qué es y por qué es tan importante?

 ¿A estas alturas todavía no sabes lo que es la VoIP? Pues siendo lo más precisos posible podríamos decir que la VoIP es una tecnología de comunicación que hace posible que la voz digitalizada viaje a través de Internet empleando el protocolo IP (Internet Protocol) en lugar de hacerlo de forma analógica a través de circuitos dedicados.

Como la aplicación más común de la VoIP es la telefonía (Telephony over IP, ToIP), casi nunca se habla de ToIP sino que hablamos de VoIP refiriéndonos a la posibilidad de realizar llamadas telefónicas a través de Internet ahorrando en costes de establecimientos de llamada, tarificaciones por uso de la red telefónica, costes por roaming, etc.

La idea de cómo funciona todo esto es muy sencilla: El origen solicita una conexión con el destino mediante envío de información a través de la red y, cuando la comunicación se acepta, se comienza a enviar la voz digitalizada desde cada extremo al opuesto, hasta que se finalice la llamada.

Breve historia de la VoIP

 Aunque todavía quedan muchas compañías de telefonía que se resisten al cambio, lo cierto es que el mundo actual tiende a la VoIP tanto por el incremento de conexiones de banda ancha como por la gestión y servicios de valor añadido que ofrece la VoIP. Pero… ¿Cómo hemos llegado hasta aquí

Por no hacer este apartado demasiado extenso, vamos a contar la historia de la telefonía de manera muy resumida…

Todo empieza en 1871 cuando Antonio Meucci (y no Graham Bell como mucha gente piensa) inventa el teléfono, un dispositivo capaz de transmitir voz entre dos extremos separados por un material conductor (un cable). Pronto el invento iría ganando la atención de empresarios y gran público apareciendo los primeros enlaces de telefonía por hilos. Las conexiones al principio eran punto a punto así que por cada destino al que quisiéramos llamar tendríamos que tener un cable directamente conectado con dicho destino. Como esta solución era inviable, se trabajó en desarrollar una solución que permitiera dirigir las llamadas punto a multipunto con lo que aparece la centralita telefónica manual.

Con el tiempo, fuimos consiguiendo que las cosas funcionaran de manera automática y aparecieron las primeras centralitas telefónicas de conmutación automática que aprovechaban la marcación de los usuarios para dirigir las llamadas al destino deseado. ¿Qué tiene de particular esta solución? Pues que reservan recursos de la red ya que cada llamada requiere un enlace directo entre el origen y el destino. Las compañías telefónicas eran las propietarias de la los cables por los que se enviaban las llamadas enrutadas.

Con el desarrollo de las redes de ordenadores, empezamos a enviar información entre equipos situados a mucha distancia y no se tardó en plantear la posibilidad de enviar paquetes de datos de voz para “simular” el comportamiento de las redes telefónicas tradicionales. La diferencia principal entre esta solución y la telefonía tradicional es que ya no se reservarían recursos en la red por lo que ésta quedaría más descongestionada y se podrían reducir los costes de las llamadas. Cada paquete con voz digitalizada sabe cuál es su destino, y la red simplemente se encarga de que se reciban los paquetes de voz. Cuando uno de los extremos no habla, simplemente no se envía nada, y la red no se satura con canales que no se utilizan. Aunque al principio, sólo podíamos contar con soluciones propietarias que a su vez eran bastante caras e incompatibles entre sí, con la aparición de los sistemas multimedia, y en concreto las tarjetas de sonido y su bajada de precios, se llegó a una situación en la que cualquier ordenador tenía la capacidad de trabajar con VoIP.

¿Pero qué supuso el verdadero ‘boom’ de la VoIP?

Pues dos factores fundamentales: Por un lado, La aparición en 1999 de una plataforma de telefonía de código abierto creada por Mark Spencer, conocida como Asterisk y que no tardó en convertirse en la solución de telefonía por IP de referencia a nivel mundial. Y por otro lado, la aparición de proveedores de VoIP y servicios de telefonía IP que han simplificado el esquema de funcionamiento de cara a los usuarios finales y que han conseguido en países como Francia cuotas de mercado que superan el 40% de la telefonía total del país.

Tutorial Asterisk: Los protocolos de la VoIP

Para entender cómo funciona la VoIP tenemos que entender qué es un protocolo de comunicaciones porque a fín de cuentas la VoIP es un intercambio de información entre dos equipos.

Para no dar demasiados rodeos, podemos decir que un protocolo de comunicaciones se define como un conjunto de reglas y/o de normas que permiten que dos o más equipos se comuniquen entre ellos. El símil más sencillo es una conversación entre dos personas. Para que la comunicación sea efectiva, ambas personas tienen que hablar el mismo lenguaje y hacerlo de manera pausada, respetando los espacios entre palabras, los silencios al final de cada frase y las entonaciones adecuadas. En un protocolo de comunicaciones ocurre exactamente lo mismo. No vale de nada que un equipo le diga a otro: “te estoy enviando datos” sin que el otro equipo se haya enterado de que hay alguien que quiere comunicarse con él. Y en el caso de la VoIP esta comunicación es crucial puesto que la voz debe transmitirse en tiempo real y con la mayor calidad posible.

Ahora sí podemos entender por qué cuando usamos un protocolo de comunicaciones hablamos de dos tipos de datos: Por un lado tenemos los datos que marcan las reglas sobre cómo tiene que hacerse el intercambio de información (‘señalización’) y por otro lado tenemos la información útil con los datos voz que es lo que realmente queremos comunicar.

Protocolos más importantes

Paquetes de Voz

Los paquetes de voz van a viajar siempre sobre el protocolo de transporte UDP (User Datagram Protocol) que es un protocolo que no está orientado a conexión y no es fiable aunque sí que es mucho más rápido que TCP. Además, al no importar que algunos paquetes se pierdan, no se retransmite información lo cual también supone una ventaja a la hora de transmitir datos de voz.

Dentro de UDP, lo normal es que los paquetes de voz se encapsulen en tramas RTP (Real-Time-Protocol) pero no vamos a profundizar este punto. Simplemente tenemos que tener claro que va a existir un flujo de paquetes de voz que llegan al destino. Si algún paquete se pierde por el camino no hacemos nada por recuperarlo porque con la información que nos llega del resto de paquetes podemos “recomponer” la señal de voz. En el apartado de Códecs desarrollaremos mejor este punto.

Señalización – Protocolo H.323

El protocolo H.323 es una recomendación de la ITU (International Telecommunication Union) y define el conjunto de reglas que tienen que seguirse para proveer sesiones de comunicación audiovisual en red. Se suele utilizar para ToIP y videoconferencias y es una parte de la serie de protocolos H.32X, los cuales también dirigen las comunicaciones RDSI, RTC ó SS7. No garantiza una calidad de servicio y el transporte de datos puede, o no, ser fiable. Fue el primer protocolo que se utilizó para la VoIP y aunque sigue en uso, cada vez se utiliza menos.

Señalización – Protocolo SIP

También conocido como Protocolo de Inicio de Sesiones (Session Initiation Protocol), es un protocolo desarrollado por el IETF con la intención de ser el estándar de referencia para la iniciación, modificación y finalización de sesiones interactivas de usuario donde intervienen elementos como el vídeo, la voz, la mensajería instantánea, etc. Es un protocolo parecido a HTTP y SMTP ya que existía un fuerte interés por que la telefonía se convirtiera en un servicio más en Internet. Entre sus desventajas, la más importante es que SIP da muchos quebraderos de cabeza cuando una comunicación pasa a través de un dispositivo NAT (Network Address Translation) ya que está pensado para transportar la señalización de una llamada pero no el transporte del audio. Así, mientras que la señalización utiliza unos puertos fijos y estandarizados (el 5060 normalmente), el encargado de enviar el audio (RTP) usa puertos elegidos al azar entre el 10.000 y el 20.000 lo que lleva a que muchos firewalls/NAT no sean capaces de asociar el enlace establecido en la señalización con el flujo de audio dentro de una llamada.

Señalización – Protocolo IAX

El protocolo IAX (Inter-Asterisk eXchange protocol), recogido en la RFC-5456, fue diseñado como protocolo de conexiones VoIP entre servidores de Asterisk aunque hoy en día también se utiliza para conexiones entre clientes. Es un protocolo mucho más ligero, simple y compacto que H.323 y que SIP ya que la señalización no se hace fuera de banda sino que señalización y datos viajan en los mismos paquetes. Esta característica permite reducir el número de conexiones simultáneas y es la más adecuada para entornos en los que firewalls y NATs nos pueden dar problemas. Entre sus inconvenientes, el más importante es que IAX2 no es un estándar con lo que no está implementado en muchos dispositivos que están en el mercado. Otro inconveniente es que si utilizamos un servidor SIP, la señalización de control pasa siempre por el servidor pero la información de audio puede viajar extremo a extremo sin tener que pasar necesariamente éste. En IAX, al viajar la señalización y los datos de forma conjunta, todo el tráfico de audio debe pasar obligatoriamente por el servidor IAX, por lo que se produce un aumento en el uso del ancho de banda que deben soportar los servidores IAX sobretodo cuando hay muchas llamadas simultáneas.

Como la primera versión de IAX se quedó corta casi al principio, apareció una segunda versión (IAX2) que es la que se utiliza hoy en día.

Tutorial Asterisk: ¿Qué son y cómo funcionan los códecs?

Para entender de forma sencilla qué es y cómo funciona un códec, lo primero que tenemos que tener en cuenta es que la voz humana es una forma de onda contínua (analógica), mientras que la información que circula por una red de datos es discreta (digital). Esto quiere decir que si queremos enviar paquetes con datos que contengan la información necesaria para reproducir un fragmento de voz, tendremos que digitalizar la voz previamente.

El proceso de convertir una señal analógica a una señal digital se realiza a través de un elemento llamado codificador. Si el codificador además es capaz de realizar el proceso contrario, esto es, pasar de una señal digital a una analógica aunque sea sólo de forma aproximada, entonces tendremos un codificador-decodificador. A un codificador-decodificador también se le denomina ‘códec’.

Aunque pueda parecer que sólo nos interesaría seleccionar uno o dos códecs teniendo en cuenta los parámetros de calidad de voz (MOS, Mean Opinion Score) y de bit-rate que necesita cada códec, lo cierto es que de cara a nuestra red también tenemos que fijarnos mucho en el tamaño de los paquetes que vamos a enviar ya que cada paquete de voz está formado también por bits que son utilizados para temas de enrutamiento y corrección de errores. Como añaden carga, saturan la red y hacen que el sistema completo vaya más lento. ¿Reducimos el número de paquetes que tenemos que enviar haciéndolos más grandes? No siempre es una buena idea porque la pérdida de un paquete de gran tamaño va a provocar un impacto mayor a la salida, ¡incluso un corte de la comunicación!. Lo que se recomienda en estos casos es tener cierto compromiso entre la cantidad de paquetes que se envían a la red y la protección que queremos tener. El tamaño de referencia deberían ser unos 20ms de voz por paquete.

Tutorial Asterisk: La infraestructura de la VoIP y Proveedores de VoIP

Infraestructura de una red de VoIP

A la hora de hablar de infraestructura hacemos referencia a los distintos tipos de equipos que podemos encontrarnos en una red de VoIP:

 End-Points

Con este término englobamos a todos los equipos del lado cliente. Teléfonos, sí, pero de diferentes tipos: Teléfonos IP, Teléfonos analógicos + adaptador ATA, Softphones o Teléfonos móviles smartphones.

Para el caso de los Teléfonos IP resulta evidente que estamos hablando de un teléfono que ya está preparado para conectarse a una red IP. Este tipo de dispositivos integra una serie de códecs para hacer la conversión de manera automática y suele incorporar botones con funciones como llamada en espera, respuesta automática o agenda de contactos.

a una red de datos, lo que se hace es intercalar una etapa que realice la conversión analógica/digital. A esta etapa se le denomina ATA (Adaptador de teléfono analógico). Aunque no presentan las funcionalidades y ventajas de un teléfono IP, muchas empresas siguen esta opción al no querer cambiar la infraestructura que tenían anteriormente.

Los softphones permiten utilizar un ordenador como terminal VoIP. Como su nombre indica, es una aplicación software que simula un teléfono. Entre los modelos más conocidos destacan el X-Lite de CounterPath Corporation o el Zoiper Softphone.

También existen soluciones para terminales Android, IOs, Symbian,… pensadas para telefonía móvil. Con el auge de las comunicaciones 3G y 4G en telefonía móvil, todavía ‘no se entiende’ que las compañías estén tan interesadas en vetar la VoIP en la telefonía móvil. ¿No será que estas compañías quieren que paguemos más por un servicio mucho peor? 🙂

 Tarjetas de Comunicaciones

En España los dos tipos de conexión telefónica más importantes han sido tradicionalmente la conexión telefónica básica (analógica) y la conexión telefónica mediante línea RDSI que es digital pero no IP. Si queremos conectarnos a este tipo de redes nos hará falta un elemento capaz de realizar la conversión analógico-IP o RDSI-IP. El elemento encargado de esta conversión recibe el nombre de tarjeta de comunicaciones y su selección dependerá de la tecnología (o conjunto de tecnologías si hablamos de una tarjeta híbrida) a la que queramos conectarla: Línea telefónica básica, Línea telefónica por RDSI, Enlace GSM, Bluetooth, etc.

Gateways

Es la otra posibilidad de conectar nuestra red de VoIP a la red telefónica convencional. Difiere de las tarjetas de comunicaciones en que aquí tenemos un dispositivo externo que es el que hace de interfaz entre la red telefónica y la red IP. Es como si sacáramos la tarjeta de comunicaciones la colocásemos en un dispositivo aparte. Existen gateways para líneas analógicas, para líneas digitales, para líneas de GSM,… y el funcionamiento es idéntico a su equivalente en tarjeta de comunicaciones.

HA (High Availability) o Failovers

Se utilizan en entornos en los que existe una alta densidad de llamadas. Imaginemos el caso de que tenemos un clúster de alta disponibilidad formado por 2 servidores físicos. Si la centralita de VoIP se conectase por VoIP a la red telefónica básica no habría problemas ya que estaríamos trabajando con tarjetas de red con direccionamiento IP. Pero si salimos a la RTB con canales analógicos la cosa cambia porque tenemos que disponer de algún mecanismo que nos permita conmutar las líneas entre ambos servidores. Es por todo esto que entran en escena los failovers. Este tipo de equipos redirigen la señal a una máquina determinada dependiendo del estado de la misma.

Proveedores de VoIP

Hasta ahora hemos comentado que la VoIP nos permite ahorrar costes de todo tipo: roaming, establecimiento de llamada, costes por tiempo de llamada,… pero sólo si no tenemos que pasar por una red telefónica tradicional. En ese caso, la señal digital tendría que convertirse a señal telefónica y nos tarificaría la empresa responsable de la red telefónica tradicional.

Una alternativa a esta situación es contar con un proveedor de VoIP. La labor de este tipo de empresas es la de sustituir a la línea telefónica convencional. De esta forma, y a través de un servicio disponible online (por lo que sólo necesitaríamos tener conexión a Internet), podemos ahorrarnos los costes que acarrea tener contratada una línea de conexión con el responsable de la red telefónica tradicional y no sólo eso sino que también un equipo que realice la conversión digital/analógica y un ahorro del coste de las llamadas porque los proveedores de VoIP, al tener contratadas muchísimas líneas telefónicas, suele tener unos costes por línea muy inferiores. Si a eso le sumamos que las llamadas entre los clientes de un mismo proveedor suelen ser gratuitas,… la recomendación resulta obvia: Si tenemos una gran cantidad de llamadas a teléfonos que sólo cuentan con tecnología telefónica tradicional (todo lo que no sea VoIP), la mejor alternativa es contratar un proveedor de VoIP.

En España tenemos unos cuantos: Voz.com, Netelip, Vozelia,… con calidades de servicio más o menos parecidas y con un servicio técnico relativamente bueno. A nivel cliente, todo es cuestión de comparar lo que ofrece cada una de ellas e informarse bien de cómo funciona su servicio técnico o la valoración de sus clientes. Por hablar de un tipo de solución más especializada, en mi equipo de trabajo, Ubunet Telecom, somos especialistas en soluciones Full-VoIP (Infraestructura + Gestión + Proveedor de VoIP + Soporte Técnico + Plan de Mejora Contínua), un tipo de solución cada vez más demandada por las empresas en la que nos hacemos cargo de la implementación, gestión y facturación de todo el servicio necesario para nuestros clientes.

Tutorial Asterisk: Digium y la comunidad de Asterisk

¿Todavía no sabes qué es Asterisk?

Asterisk es un servicio software, libre bajo licencia GPL, que proporciona funcionalidades de centralita telefónica (PBX). Al igual que ocurre con cualquier otra PBX, Asterisk puede conectarse a un grupo de teléfonos para hacer llamadas entre sí enrutando dichas llamadas a los destinos adecuados e incluso a destinos en el exterior de su red incluyendo a proveedores, líneas telefónicas tradicionales, líneas GSM, líneas de datos, etc. Podríamos decir que más que una PBX es un servidor de comunicaciones ya que también permite trabajar con videoconferencias, interactividad con bases de datos, funcionalidades de IVR y un largo etcétera.

Por hacer mención a la explicación que hacen de Asterisk desde su website oficial, (www.asterisk.org), “Asterisk es un framework para la construcción de soluciones de comunicaciones y aplicaciones multiplataforma y en tiempo real”.

Hoy en día Asterisk cuenta con más de un millón de sistemas de comunicaciones en más de 170 países. Durante 2009 se convirtió en el software Open Source más descargado y utilizado con más del 85% del mercado de código abierto y en él están basados sistemas tan famosos como Skype con los que se superan con creces a los fabricantes de PBX tradicionales como Nortel, Cisco o Avaya.

Digium y la comunidad de Asterisk

La revolución de la telefonía digital tuvo su origen en 1999 cuando Mark Spencer creó Asterisk, la primera plataforma de telefonía digital Open Source. El servicio, con soporte por parte de una comunidad de desarrolladores en código abierto, pronto hizo frente a las soluciones competidoras que eran propietarias y muy caras. Cuanto más crecía la plataforma más contribuidores ayudaban a mejorarla corrigiendo errores, añadiendo novedades y en definitiva evolucionando el producto hasta lo que conocemos hoy.

Digium, empresa fundada por Mark Spencer y para la cual trabaja en la actualidad como CTO, es la empresa más importante a nivel mundial de VoIP. No sólo proporciona soluciones de Comunicaciones Unificadas (Unified Communications) sino que también comercializa sus propias tarjetas y gateways de comunicaciones. De hecho, Asterisk está especialmente pensado para trabajar con la electrónica de Digium aunque existen también otras alternativas de otras empresas. Sin Digium Asterisk seguramente no hubiera sido capaz de evolucionar hasta lo que hoy conocemos.

¿Resulta rentable tener un producto Open Source totalmente gratuito? Parece ser que sí porque Digium cuenta con varias entidades inversoras y no deja de desarrollar nuevos productos relacionados con el mundo de la VoIP. Aquí lo importante no es tanto desarrollar el producto sino su implementación a medida y la adquisición de los equipos que pueda necesitar una empresa interesada en una infraestructura de VoIP.

Tutorial Asterisk: Interfaces Web para Asterisk

Una interfaz web para Asterisk es una aplicación web con la que podemos trabajar con Asterisk sin necesidad de tener ningún conocimiento de Linux y/o acceso a la terminal del equipo donde tengamos el Asterisk instalado. Siempre será mejor contar con algún profesional con experiencia para adaptar los servicios a las medidas de las necesidades de una empresa pero pueden servirnos como una buena base a la hora de comprender muchos de los conceptos relacionados con la VoIP.

Aunque se puede hacer referencia directamente al fantástico artículo publicado en OpenWebinars.net por parte de Esau Abril (@EsauAbrilN) sobre las 7 distribuciones Linux para VoIP con Asterisk más utilizadas, vamos a hacer un pequeño comentario sobre algunas de ellas.

 FreePBX

Disponible en www.freepbx.org. Es una de las interfaces web más conocidas porque funciona bien y porque incluye muchas funcionalidades.

  • Lo mejor de esta distro es que es completamente modular, nos permite ahorrar recursos en nuestro servidor y se facilita mucho el manejo. Además, como es de las distribuciones más conocidas, hay mucha información en la red.
  • Por comentar algo en su contra, todos los manuales de FreePBX utilizan muchos tecnicismos por lo que si no somos expertos en telefonía puede costarnos bastante aprender a manejarla. Además, algunos módulos no están bien depurados y pueden llevarnos a fallos.

TrixBox (Fonality)

Disponible en www.fonality.com. Contaba con dos versiones, una libre bajo licencia GPL2, y otra con soporte completo pero previo pago. Ahora sólo está disponible la de pago. Pensada más para aplicaciones empresariales, utiliza un lenguaje sencillo, fácil de manejar, optimizada para sistemas Cloud,… La contra, es de pago y no cuenta ya con comunidades de desarrolladores tan extensas como las de las otras plataformas.

Elastix

Disponible en www.elastix.org. Es de las pocas que podemos encontrar totalmente en español. Ha mejorado mucho en los últimos años gracias a los cursos de formación para la plataforma. Tiene herramientas básicas de Asterisk y algunas suyas propias.

  • Lo mejor – Además de ser libre, estar disponible en español y que seguramente sea de las más completas junto a FreePBX, destaca la cantidad de información que podemos encontrar sobre ella.
  • Lo peor – Nos obliga a tener CentOS, utiliza demasiados tecnicismos y si luego queremos configurar algo directamente sobre los ficheros de configuración de Asterisk vamos a tener que sufrir un poco. Aunque se está trabajando mucho en el tema de la seguridad todavía falla

AsteriskNOW

Basado en el panel libre que ofrece Digium a través de la página de Asterisk (www.asterisk.org), sólo disponible en imagen ISO con Linux incluido, tiene como público objetivo a desarrolladores, integradores de sistemas, estudiantes, hackers,… y todo aquel que pueda contribuir de alguna forma a mejorar Asterisk. Existen varias opciones de soporte previo pago pero la plataforma es totalmente gratuita y Open Source.

  • Lo mejor – Como suele ser lo primero que prueban los iniciados en VoIP, existe mucha documentación. Además viene perfecto si estamos trabajando con equipos de Digium. Los ficheros de configuración están bien estructurados y no es excesivamente complicado trabajar con ellos.
  • Lo peor – Pese a que debería ser la mejor plataforma por tener el respaldo de Digium actualmente no ocupa la primera posición de las interfaces web libres. Al margen de esto, también destaca que hay que tener muchos conocimientos de Asterisk para poder explotarla bien.

Tutorial Asterisk: Asterisk 11 – Versiones y nuevas características

Asterisk mantiene siempre dos tipos de versiones en su página oficial de descargas (http://www.asterisk.org/downloads). Por un lado, tenemos las versiones LTS (Long Term Support) que son aquellas que van a tener soporte por parte de la comunidad de Asterisk durante un tiempo prolongado (es por ésto que son las recomendadas para entornos en producción); y versiones Standard con tiempo de soporte mucho más corto y que sirven como paso previo a futuras versiones LTS. De hecho, para las versiones LTS se fija normalmente un soporte de unos cuatro años más un año adicional en cuanto a parches de seguridad, mientras que para las Standard se fija un período no superior a un año con uno adicional para parches de seguridad.

Asterisk 11 introduce algunos cambios y nuevas funcionalidades entre las que cabe destacar respecto de Asterisk 10:

  • Un servicio de log de identificadores de llamada (Call Identifier Logging).
  • CallGroups y PickupGroups ahora pueden definirse como strings y se supera el umbral de hasta 64 grupos que teníamos definido en versiones anteriores.
  • Manejadores para las llamadas a la aplicación Hangup(). Ya no hace falta incluir líneas de código adicionales para analizar la causa de una llamada a la aplicación Hangup().
  • Soporte para ICE, DTLS-SRTP y SIP sobre WebSockets. Compatibilidad con XMPP y mejora en la comunicación con los protocolos de Google Jingle.
  • Podemos definir ACLs con el nombre que queramos y referenciarlas por su nombre desde cualquier módulo de Asterisk.

Tutorial Asterisk: Instalación y configuración de Asterisk

un SO Debian 7 y para ello vamos a seguir los siguientes pasos:

  1. Actualizar la máquina y reiniciarla:

    sudo apt-get update
    sudo apt-get upgrade
    reboot
  2. Instalar las librerías que sean necesarias:

    sudo apt-get install build-essential
    sudo apt-get install libncurses5-dev libnewt-dev libmysqlclient-dev libmyodbc libssl-dev libxml2-dev unixodbc-dev libsqlite3-dev uuid-dev libbison-dev

NOTA – Para no tener que estar escribiendo continuamente ‘sudo‘, se puede cambiar el usuario a ‘root‘ y trabajar durante todo el proceso de instalación como ‘root‘.

  1. Se descargan y descomprimen los ficheros de Asterisk:

    wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-11.6-current.tar.gz
    tar zxvf certified-asterisk-11.6-current.tar.gz
    cd certified-asterisk-11.6-current
  2. Instalación del servicio de Asterisk:

    ./configure
    make menuselect
    make
    make install
    make samples
    make config

NOTA – Para cambiar algo en los ficheros de configuración tendremos que utilizar un editor como nano, vim o cualquier otro que se ajuste más a las preferencias del administrador del sistema.

  1. Para lanzar Asterisk, o si se realiza algún cambio en la configuración y es necesario reiniciar el servicio, existen varias alternativas desde la terminal. La más recomendada es parar y volver a arrancar el servicio:

    /etc/init.d/asterisk stop
    /etc/init.d/asterisk start

    O bien…

    service asterisk stop
    service asterisk start

Configurando Asterisk – sip.conf

Los dos ficheros de configuración más importantes de Asterisk posiblemente son el sip.conf que es el fichero que permite definir los canales SIP, tanto para llamadas entrantes como salientes, y el fichero extensions.conf que es el que define el comportamiento que va a tener una llamada en nuestra centralita (qué reglas rigen su enrutamiento o qué aplicaciones van a ejecutar). Si en vez de utilizar el protocolo SIP se prefiere trabajar con IAX2, será necesario configurar el fichero iax2.conf de forma muy parecida a como se hace con el sip.conf.

Lo primero es que, al igual que ocurre con otros ficheros de configuración de Asterisk, el fichero sip.conf se encuentra dividido en secciones cuyos nombres, a su vez, se encuentran definidos entre corchetes. La primera de ellas, [general], permite definir las opciones generales de cada canal y, en consecuencia, los parámetros generales de cada cliente.

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

Ya que los clientes SIP deben ser declarados previamente para poder lanzar o recibir llamadas, lo siguiente que se puede hacer es definir uno o varios contextos para los posibles clientes del servicio que proporciona Asterisk. Algunos de los parámetros de configuración más importantes en este caso serán:

  • type – Tipo de cliente SIP. Existen 3 tipos: peer, user y friend en función de cómo se manejan las llamadas entrantes/salientes y cómo se indentifica el usuario.
  • secret – Contraseña que utiliza el cliente para autenticarse en el sistema.
  • host – Dirección IP o nombre del host que utiliza el cliente. Si está asignada de manera dinámica por DHCP, ‘dynamic‘.
  • context – Contexto al que pertenece el cliente.
  • qualify – Si está puesto a ‘yes‘, se monitoriza el estado de la extensión.
  • mailbox – Indica el buzón de voz correspondiente a esa extensión.

Para definir dos extensiones, la 102 y la 103 utilizando estos y algunos parámetros más…

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

[102]
type=friend
secret=1ezkR
host=dynamic
context=ext_internas
callerid="Jose Luis" <102>
dtmfmode=rfc2833
qualify=yes
[email protected]
...

[103]
type=friend
secret=e7uKz
host=dynamic
context=ext_internas
callerid="Beatriz" <103>
dtmfmode=rfc2833
qualify=yes
[email protected]
...

Si fuera necesario configurar cientos de extensiones, quizás sea más cómodo de cara a la programación definir una máscara y aplicarla a cada una de las extensiones que se quiera crear. En este caso, a la máscara se le ha llamado extensiones-internas y se han definido las extensiones 102 y 103 cambiando únicamente los parámetros necesarios.

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

[extensiones-internas](!)
type=friend
host=dynamic
context=ext_internas
dtmfmode=rfc2833
qualify=yes
...

[102](extensiones-internas)
secret=1ezkR
callerid="Jose Luis" <102>
[email protected]

[103](extensiones-internas)
secret=e7uKz
callerid="Beatriz" <103>
[email protected]

Para profundizar en este tema lo mejor es coger el fichero de configuración por defecto, o de ejemplo, que trae Asterisk y leerse uno a uno cada uno de los parámetros que incluye. Con algo de experiencia, y muchas ganas de aprender, se depurar cualquier fallo en las comunicaciones que se produzca por una mala configuración de los clientes SIP.

Configurando Asterisk – extensions.conf

El fichero de configuración extensions.conf es el que controla el plan de marcado (dialplan) de la centralita. Se puede decir que es el corazón de Asterisk ya que define cómo se comportarán las llamadas entrantes y salientes en el sistema.

Este fichero está compuesto por contextos, extensiones y prioridades. Se comenta brevemente en qué consiste cada una de ellas:

  • Contextos – Los contextos son cada una de las secciones en las que está dividido el dialplan y es lo que permite separar o incluir fragmentos de código en éste. Existen 3 contextos reservados: general, global y default. Si una extensión, de las que hay definidas en el fichero sip.conf, tiene como parámetro context un contexto de los que hay definidos en el dialplan, cuando dicha extensión efectúe una llamada, empezarán a ejecutarse las líneas de código asociadas a dicha extensión en ese contexto.

  • Extensiones – Una extensión es cada una de las llamadas que permiten ejecutar un fragmento de código de un contexto. Cuando una extensión llama a un número u otra extensión, lo normal es tener líneas de código dentro del dialplan que le indiquen al sistema cómo tiene que tratar esa llamada. Por ejemplo: Primero que se descuelgue la llamada, luego que salte una locución y que se llame a dos destinos de manera simultánea. Una extensión se define como un conjunto de valores: (número de extensión,prioridad,aplicación a ejecutar). El primero de ellos, el “número de extensión“, es el patrón que hay que marcar dentro de dicho contexto para llamar al destino objetivo. La “prioridad” indica el orden en el que se van a ejecutar las sucesivas instrucciones asociadas a un mismo “número de extensión” y la “aplicación a ejecutar” es la orden que se va a ejecutar en la línea dada por el “número de extensión” y la prioridad “prioridad“.

Con una presentación de un caso práctico, todos estos conceptos quedarán más claros.

[llamadas-entrantes]
exten => 958993803,1,NoOp(Tenemos una llamada entrante...)
exten => 958993803,2,Answer()
exten => 958993803,3,Playback(bienvenida)
exten => 958993803,4,Dial(SIP/958)
exten => 958993803,5,Hangup()

[llamadas-salientes]
exten => 20001,1,Dial(SIP/102&SIP/103)
exten => 20001,2,Hangup()

exten => 20002,1,Dial(SIP/104&SIP/105)
exten => 20002,2,Dial(SIP/106)
exten => 20002,3,Hangup()

Se puede ignorar el número de la prioridad si ésta se edita como same => n, (‘n‘ de ‘next). Con esta opción no sólo se gana en rapidez a la hora de programar la centralita sino que también se evita tener que cambiar todas las líneas posteriores para esa misma extensión en caso de añadir nuevas líneas en el futuro.

[casa]                             ; Nombre del contexto
exten => 30001,1,NoOp(IVR de casa) ; NoOp es una aplicación que no hace nada más que mostrar por el CLI de Asterisk el mensaje que se le indique como parámetro.
same => n,Answer()                 ; Para responder la llamada
same => n,Wait(1)                  ; Esperar un segundo antes de seguir ejecutando el dialplan
same => n,Playback(mensaje-de-bienvenida) ; Reproducir un mensaje de nombre 'mensaje-de-bienvenida'
same => n,Dial(IAX2/2014)          ; Llamar a través del protocolo IAX2 a la extensión 2014 definida en el fichero iax.conf
same => n,Hangup()                 ; Terminar la llamada

También se pueden definir patrones de marcado para ejecutar el mismo fragmento de código para múltiples y distintas extensiones. Por poner un ejemplo de una oficina con 5 extensiones, podemos escribir un fragmento de código que se ocupe extensión a extensión de que los usuarios puedan llamarse entres sí o podemos generar un único fragmento de código con un patrón de marcado (pattern) que permita llamar a distintos destinos en tan sólo 3 líneas de código:

[empresa]
exten => _400X,1,NoOp(Llamando a la extensión ${EXTEN})
same => n,Dial(SIP/${EXTEN})
same => n,Hangup()

Con estas 3 líneas la centralita interpreta que si se llama a cualquiera de las extensiones definidas por el patrón de marcado 400X (en el rango: 4000, 4001, 4002,... 4009), estaremos llamando al cliente SIP con número de cliente igual al valor almacenado en la variable reservada EXTEN y que coincide con el número que se acaba de marcar. Como se puede observar, el juego que da un patrón de marcado es muy amplio.

Tutorial Asterisk: IVR y funciones Dialplan

Creando un IVR

Un IVR (de Interactive Voice Response) es, como su propio nombre indica, un menú de voz interactivo que permite interactuar de forma automática con el otro extremo de la comunicación con un fín determinado.

Hoy en día lo normal es encontrarse con un IVR de bienvenida cuando se llama a cualquier gran empresa. El caso más obvio es el de las grandes operadoras de telefonía que cuentan con IVRs cuyo único objetivo es redirigir al usuario al departamento que pueda resolver su consulta de la forma más precisa posible pero que lo hacen con tanto nivel de detalle (submenús) que puede resultar muy molesto de cara al usuario final.

En este apartado vamos a diseñar un IVR que haga que todas las llamadas entrantes escuchen una locución de bienvenida seguida de una locución que le pida al usuario hacia dónde quiere redirigir su llamada (departamento comercial o departamento de soporte técnico). El cliente puede llamar 24 horas al día al departamento comercial (que será la opción 1) pero si lo hace al de soporte (opción 2) fuera de su horario de oficina (que vamos a suponer de 08:00 a 15:00), entonces saltará el buzón de voz de soporte. Si el cliente no selecciona ninguna de las dos opciones o la opción seleccionada no es válida, saltará un mensaje de despedida. Toda esta configuración se incluye en el fichero extensions.conf.

Comentar un par de detalles sobre este ejemplo:

  • La extensión s es la extensión por defecto de Asterisk. Coincide con todas las entradas por lo que suele ser una buena opción a la hora de definir llamadas entrantes que queremos que pasen por un único camino.

  • La aplicación GotoIfTime permite realizar un salto en la ejecución del dialplan en función del tiempo del sistema. En este caso, si el momento en que se ejecuta esta regla es entre las 08:00 y las 14:00 de lunes a viernes, entonces saltará a la prioridad con etiqueta ‘continuar‘. Si la condición no se cumple, saltará a la prioridad con la etiqueta ‘contestador‘.

Buzones de Voz

Quizás uno de los servicios que más ha costado conseguir para la telefonía tradicional, es uno de los servicios más sencillos de Asterisk. Para crear un buen sistema de buzón de voz tan solo hace falta responder a tres cuestiones: ¿Cuántos mensajes esperamos recibir en nuestro buzón de voz? ¿Cuántos buzones de voz hacen falta en una empresa? y ¿Queremos integrar el servicio de buzón de voz con otros servicios como es el caso del correo electrónico?

Con Asterisk se pueden responder a estas tres preguntas y sin más dificultad que añadir pocas líneas más en el dialplan y configurar también el fichero voicemail.conf que es el que permite definir cada buzón de voz y su comportamiento.

Sea una empresa de 2 empleados en la que queremos configurar un buzón de voz para cada uno de éstos empleados y uno en común que será el general de la empresa. Cada empleado tiene su cuenta de correo de empresa y un usuario SIP definido en el fichero sip.conf. Se añaden las siguientes líneas en los siguientes ficheros:

Fichero sip.conf

Fichero extensions.conf

Fichero voicemail.conf

[general] format=wav49|gsm|wav ; Formato del mensaje de audio … [zonemessages] european=Europe/Copenhagen|’vm-received’ a d b ‘digits/at’ HM [default] 1003 => pass_bea,B. Sanchez,[email protected],,attach=yes|saycid=yes|envelope=yes|delete=yes|tz=european 1004 => pass_ángela,A. Santos,[email protected],,attach=yes|saycid=yes|envelope=yes|delete=yes|tz=european

Como se puede comprobar, el fichero voicemail.conf contiene todos los parámetros necesarios para configurar cada buzón de voz. Los mensajes convertidos a ficheros de audio se almacenan por defecto en el directorio /var/spool/asterisk/voicemail/ aunque hoy en día es difícil encontrar a una empresa que prefiera almacenar éstos mensajes de voz y no enviarlos directamente por correo electrónico configurando los parámetros delete, attach y email de la forma adecuada.

Aplicaciones imprescindibles en tu Dialplan

Aunque Asterisk ofrece cientos de aplicaciones para personalizar hasta el último detalle cualquier dialplan, casi siempre se utiliza una lista mucho más corta pues son las que ofrecen los servicios más demandados o más comúnmente demandados por las empresas. En esta sección hemos querido recoger una pequeña selección con algunas de estas aplicaciones:

Para los interesados, la lista completa puede encontrarse en este enlace de la Wiki oficial de Asterisk.

  • AGI

    Permite ejecutar aplicaciones externas (principalmente scripts). Tiene una variable asociada, AGISTATUS que permite comprobar si la ejecución del programa externo ha sido un éxito, ha fallado o incluso si ha sido la responsable de colgar una llamada.

    Sintaxis: AGI(command,arg1,[arg2[,...]])

  • Answer

    Responder a una llamada entrante (para ser más exactos, responde a un canal en estado ‘ringing‘).

    Sintaxis: Answer([delay,[nocdr]])

  • Background

    Reproduce una locución pasada como parámetro a la vez que espera a que el lado al que se le está reproduciendo la locución marque una extensión a la que saltar dentro del Dialplan. En función del número de DTMFs que se quiera especificar para el menú, puede ser también necesario el uso de la aplicación WaitExten().

    Sintaxis: BackGround(filename1&[filename2[&...]],[options,[langoverride,[context]]])

  • Busy

    Indica al lado llamante (calling part) que el lado llamado (called part) está ocupado.

    Sintaxis: Busy([timeout])

  • ConfBridge

    Permite que un usuario entre en una sala de conferencias específica. Si lo desea, el usuario puede salirse de la sala colgando la llamada o pulsando un DTMF si está configurado así. Esta aplicación es la evolución de la aplicación MeetMe. El uso de esta aplicación es algo avanzado y está asociado al fichero confbridge.conf.

    Sintaxis: ConfBridge(conference,[bridge_profile,[user_profile,[menu]]])

  • Congestion

    Indica al lado llamante (calling part) que el lado llamado (called part) está congestionado.

    Sintaxis: Congestion([timeout])

  • Dial

    Es la aplicación ḿas importante de Asterisk. Permite lanzar una llamada a uno o más destinos especificados como argumentos de la aplicación. Tiene varias variables asociadas, DIALEDTIME, ANSWEREDTIME y DIALSTATUS además de más de 20 opciones disponibles para utilizar como argumento options.

    Sintaxis: Dial(Technology/Resource&[Technology2/Resource2[&...]],[timeout,[options,[URL]]])

  • GoSub

    Salta al punto del dialplan objetivo y continúa la ejecución del dialplan. Una vez encuentra una orden de Return, vuelve al punto del programa desde el cual se inició el salto. Existen alternativas a esta aplicación con saltos condicionales.

    Sintaxis: Gosub([context,[exten,]]priority[(arg1,[...][argN]]))

  • Goto

    Es prácticamente idéntica a la aplicación GoSub nada más que en este caso no existe una ruta directa al mismo punto del programa desde el cual se inició el salto. Existen alternativas a esta aplicación con saltos condicionales.

    Sintaxis: Goto([context,[extensions,]]priority)

  • Hangup

    Permite colgar un canal que está siendo utilizado.

    Sintaxis: Hangup([causecode])

  • NoOp

    Do Nothing“. No realiza ninguna operación pero si se le pasa como argumento un string de texto, éste aparecerá en el CLI de Asterisk cada vez que se ejecute esta línea. Principalmente se utiliza para depurar el dialplan.

    Sintaxis: NoOp([text])

  • Queue

    Mete la llamada entrante en una queue de llamadas a la espera de ser atendidas por un agente libre. Tiene una variable asociada, QUEUESTATUS que controla el estado de la queue a la que se quiere enviar la llamada.

    Sintaxis: Queue(queuename,[options,[URL,[announceoverride,[timeout,[AGI,[macro,[gosub,[rule,[position]]]]]]]]])

  • Read

    Lee un valor por la entrada estándar y lo almacena en una variable.

    Sintaxis: Read(variable,filename&[filename2[&...]],[maxdigits,[options,[attempts,[timeout]]]]])

  • Record

    Graba en un fichero todo lo que diga quien ha lanzado la llamada a la aplicación. Es la función que se suele utilizar para grabar en el sistema mensajes de voz personalizados.

    Sintaxis: Record(filename.format,[silence,[maxduration,[options]]])

  • Set

    Permite asignarle un valor a una variable.

    Sintaxis: Set(name=value)

  • Verbose

    Envía el mensaje pasado como parámetro a la salida de Verbose (si está configurado el fichero logger.conf, los mensajes aparecerán en los logs del sistema).

    Sintaxis: Verbose([level,]message)

  • VoiceMail

    Permite dejar un mensaje en el buzón de voz (mailbox) indicado como parámetro. Tiene una variable asociada, VMSTATUS que permite comprobar si la llamada a la aplicación VoiceMail ha sido un éxito, ha fallado o incluso si se ha abandonado antes de que la ejecución de la aplicación haya almacenado algún dato.

    Sintaxis: VoiceMail(mailbox1&[mailbox2[&...]],[options])

  • VoiceMailMain

    Permite comprobar el estado del buzón de voz indicado como argumento. Da acceso al menú del buzón de voz para escuchar, cambiar de directorio o borrar los mensajes de voz almacenados.

    Sintaxis: VoiceMailMain([[email protected][context]],[options])

  • Wait

    Detine la ejecución del dialplan durante el tiempo (en segundos) que se le indique a la aplicación como argumento.

    Sintaxis: Wait(seconds)

  • WaitExten

    Espera durante un tiempo a que el usuario introduzca un número de extensión al que saltar.

    Sintaxis: WaitExten([seconds,[options]])

Tutorial Asterisk: Trabajando con bases de datos

La base de datos interna de Asterisk

Asterisk cuenta con una base de datos interna que utiliza para diferentes propósitos pero que también podemos utilizar, por ejemplo, complementar el plan de marcado con contenido dinámico o incluso crear condiciones de bloqueo como la del ejemplo de este artículo.

La base de datos de Asterisk está basada en Berkeley v1 (a partir de Asterisk 10) y su uso es bastante sencillo. La información se agrupa en familias, entradas y valores. Por hacer un símil, una familia representaría una columna de una tabla, cada entrada sería una fila de esa columna y el valor es el valor propio que almacena esa fila.

Si queremos usar la base de datos interna de Asterisk en nuestro dialplan tenemos varias opciones:

  1. Añadir una entrada o modificar una existente:

    exten => *543,1,Set(DB(contestador/activo)=1)

  2. Borrar una entrada:

    exten => *544,1,NoOp(${DB_DELETE(contestador/activo)})

  3. Copiar el valor de una entrada a una variable:

    exten => *545,1,Set(mivariable=${DB(contestador/activo)})

  4. Salto en función del valor de una entrada:

    exten => *546,1,GotoIf($["${DB(contestador/activo)}"="1"]?contestador_activo,contestador_inactivo

Vamos a ver cómo se puede hacer un desvío básico de llamadas con Asterisk:

[extensiones]
exten => _1XX,1,NoOp(Llamada a la extensión ${EXTEN})
same => n,Set(destino=${DB(desvios/${EXTEN})})
same => n,Dial(SIP/${destino},,tTr)
same => n,Hangup()

include => desvios

[desvios]
exten => _*XXX,1,NoOp(Se realiza un desvío de ${CALLERID(num)} a ${EXTEN:1})
same => n,Set(DB(desvios/${CALLERID(num)})=${EXTEN:1})
same => n,Answer()
same => n,Playback(beep)
same => n,Hangup()

exten => _*000,1,NoOp(Se elimina el desvío de ${CALLERID(num)})
same => n,Set(DB(desvios/${CALLERID(num)})=${CALLERID(num)})
same => n,Answer()
same => n,Playback(beep)
same => n,Hangup()

Conexión con bases de datos externas

Este punto es quizás una de las mejores características que ofrece Asterisk a sus usuarios avanzados. Gracias a la posibilidad de ejecutar unas funciones u otras en el dialplan en función de consultas a una BBDD como puede ser MySQL, podemos encontrar cientos de aplicaciones como agendas telefónicas, ivr personalizados en función del CALLERID (sin límites de entradas de usuario) o símplemente una consulta a una entrada de una tabla vía telefónica. En este punto centramos la mirada en cómo se configura una conexión a una base de datos MySQL y cómo se puede realizar una consulta a la misma desde nuestro dialplan. Podéis ampliar más información sobre este tema en el artículo de David Muñoz (@dperilla), Configurar Asterisk para trabajar con MySQL usando ODBC disponible a través de la plataforma de OpenWebinars.net.

Para trabajar con una base de datos ODBC necesitamos instalar los paquetes unixodbc-dev y libmyodbc (el primero es un conector genérico para ODBC y el segundo es una librería con la que podemos trabajar con MySQL). ¿Hacia qué base de datos vamos a apuntar? Vamos a suponer que tenemos instalado MySQL Server (si no lo tenemos, tan sólo tendremos que hacer apt-get install mysql-server), y que el programa está ejecutándose. La configuración inicial tendrá la siguiente forma:

 

Conectando con la BBDD

Lo primero es editar el fichero /etc/odbcinst.ini para especificar el tipo de base de datos a la que se quiere acceder:

[MySQL]
Description = MySQL ODBC Driver
Driver = /usr/lib/odbc/libmyodbc.so
FileUsage = 1

Lo segundo, editar el fichero /etc/odbc.ini con el que especificamos a qué base de datos queremos apuntar:

[MySQL-Asterisk]
Description = Conector ODBC para MySQL
Driver = MySQL
Socket = /var/run/mysqld/mysqld.sock
Server = direccion_bbdd
User = usuario_bbdd
Password = password_bbdd
Database = nombre_bbdd
Option = 3

En el escenario más común, la base de datos estará en la misma máquina en la que está ejecutándose el Asterisk. Si este es el caso, el campo Server apuntará a localhost.

Para hacer que Asterisk pueda acceder a la base de datos objetivo, se edita el fichero /etc/asterisk/res_odbc.conf con la siguiente configuración:

[asterisk]
enabled => yes
dsn => MySQL-Asterisk
username => usuario_bbdd
password = password_bbdd
pooling => no
limit => 1
pre-connect => yes

 

Aplicando la nueva configuración

Si toda la configuración es correcta, tan sólo tendremos que hacer que Asterisk cargue la nueva configuración para trabajar con la base de datos en MySQL. Para ello, tan sólo hay que ejecutar la siguiente línea en el CLI de Asterisk (para los que no lo conozcan, en el siguiente capítulo le hemos dedicado un apartado entero).

CLI >      module reload res_odbc.so

 

Llamadas a la base de datos desde el Dialplan

Aunque ya estamos preparados para leer y escribir datos en la base de datos que hemos configurado anteriormente, primero vamos a crear una función personalizada en el fichero /etc/asterisk/func_odbc.conf con el siguiente contenido:

[CALLERID]
dsn=asterisk
readsql=SELECT nombre FROM agenda_telefonica WHERE numero='${SQL_ESC(${ARG1})}'

En realidad lo que estamos haciendo es editar una función que consulte en la tabla agenda_telefonica el nombre asociado al número que le pasemos como argumento a la función.

Para que Asterisk registre esta función, o cualquier otra que hayamos editado, tendremos que volver al CLI de Asterisk y cargar el módulo func_odbc.so:

CLI >      module reload res_odbc.so

Ahora sí, editamos el fichero extensions.conf y configuramos para cada llamada entrante que se haga una consulta a la base de datos:

[llamadas-entrantes]
exten => _X.,1,NoOp(Llamada entrante de ${CALLERID(num)})
same => n,Set(CALLERID(name)=${ODBC_CALLERID(${CALLERID(num)})})

Tutorial Asterisk: CLI (Command Line Interface)

Una de las tareas más importantes de un administrador de Asterisk es la supervisión y corrección de fallos que pueden surgir en el sistema, tanto a nivel de servicio como a nivel de entender por qué se ha producido un fallo en una llamada o si un cliente se está registrando en el servicio o no. Para facilitar esta gestión contamos con el CLI (Asterisk Command Line Interface), o traducido al español como “Interfaz por Línea de Comandos de Asterisk”. Gracias a esta interfaz podemos realizar una amplia variedad de acciones de administración en el servicio de Asterisk entre las que podemos destacar:

  • La obtención de datos del estado del sistema y de sus componentes.
  • Aplicar cambios en la configuración del sistema.
  • Visualización del log en tiempo real (errores, warnings, etc.).
  • Generar llamadas de prueba.
  • Ver información sobre APIs, aplicaciones y funciones y módulos.

Para conectar con el CLI, tan sólo tendremos que ejecutar desde nuestra terminal el comando “asterisk” seguido de las opciones con las que queramos abrir la consola:

  • Opción -c: (Console) – Nos permite abrir la consola. La particularidad de este comando es que si el servicio de Asterisk no se estaba ejecutando, intentará lanzarlo.
  • Opción -d: (Debug) – Permite indicar el nivel de debug que queremos para los mensajes que nos aporta el CLI. Si queremos un alto nivel de debug tendremos que pasarle al comando asterisk tantas veces “d” como nivel queramos. Por ejemplo: “dddddd”.
  • Opción -h: (Help) – Muestra todas las opciones posibles.
  • Opción -r: (Running) – Conectamos con un servicio de Asterisk que se está ejecutando en segundo plano.
  • Opción -T: (Time) – Para que se muestren marcas de tiempo en cada mensaje de la consola.
  • Opción -v: (Verbose) – Permite indicar el nivel de verbose que queremos para los mensajes que nos aporta el CLI. Si queremos un alto nivel de verbose, tendremos que pasarle al comando asterisk tantas veces “v” como nivel queramos. Por ejemplo: “vvvvvv”.
  • Opción -V: (Version) – Para ver la versión de Asterisk.
  • Opción -x: (Execute) – Para ejecutar un comando en concreto. Se utiliza para no tener que entrar en la interfaz, ejecutar el comando y salir. Directamente pasamos inline el comando que queremos que se ejecute. Por ejemplo: asterisk -rx “core restart when convenient”.

Un ejemplo que haga llamar al CLI de Asterisk que se está ejecutando en segundo plano con un nivel de verbosidad de 3 tiene la siguiente forma:

$ asterisk -rvvv

Si queremos hacer una llamada remota al sistema que haga que éste se reinicie cuando no esté procesando ninguna llamada, ejecutamos lo siguiente:

$ asterisk -rx "core restart when convenient"

Para ver la lista completa de opciones, ejecutamos el siguiente comando:

$ asterisk -h

-V Display version number and exit
-C Use an alternate configuration file
-G Run as a group other than the caller
-U Run as a user other than the caller
-c Provide console CLI
-d Enable extra debugging
-f Do not fork
-F Always fork
-g Dump core in case of a crash
-h This help screen
-i Initialize crypto keys at startup
-I Enable internal timing if DAHDI timer is available
-L Limit the maximum load average before rejecting new calls
-M Limit the maximum number of calls to the specified value
-m Mute debugging and console output on the console
-n Disable console colorization
-p Run as pseudo-realtime thread
-q Quiet mode (suppress output)
-r Connect to Asterisk on this machine
-R Same as -r, except attempt to reconnect if disconnected
-s Connect to Asterisk via socket (only valid with -r)
-t Record soundfiles in /var/tmp and move them where they
belong after they are done
-T Display the time in [Mmm dd hh:mm:ss] format for each line
of output to the CLI
-v Increase verbosity (multiple v's = more verbose)
-x Execute command (implies -r)
-X Execute includes by default (allows #exec in asterisk.conf)
-W Adjust terminal colors to compensate for a light background

Volvamos al punto en el que abrimos una nueva consola, lo primero que observamos es que nos aparece un nuevo prompt indicándonos que estamos dentro del CLI:

hostname*CLI>

Si queremos salir de la consola, tan sólo tendremos que escribir y ejecutar los comandos “quit” o “exit”.

hostname*CLI> exit

Dentro de la consola existen muchos comandos que podemos ejecutar, tan sólo tendremos que ejecutar “help” para obtener la lista completa:

hostname*CLI> help

Algunos de los comandos que más se utilizan:

  • console dial – Nos permite hacer una llamada desde consola a una extensión que se encuentra en un contexto determinado. Muy útil en tareas de depuración de fallos y control del plan de marcado.
  • core restart now – Reinicia el servicio de Asterisk.
  • core show channels – Nos permite ver información sobre los canales que están abiertos en el momento en el que ejecutamos el comando.
  • dialplan reload – Nos permite hacer una recarga de configuración del fichero dialplan.conf, indispensable cuando realizamos algún cambio sobre dicho fichero y queremos que el cambio se haga efectivo sin reiniciar el servicio completo.
  • module load – Nos permite cargar un módulo en Asterisk sin necesidad de reiniciar el servicio.
  • sip reload – Nos permite hacer una recarga de configuración del fichero sip.conf. Cuando perdemos la comunicación con un troncal al que estamos registrados, obliga a lanzar un nuevo registro contra dicho troncal.
  • sip show peers – Nos permite ver la lista de clientes registrados así como información adicional como puede ser el ping que tenemos con esos clientes o la IP desde la cual nos conectamos a ellos.

NAT y Trunking en Asterisk

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 extermo 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 ocurra 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 Berlin – Tiene una IP Dinámica

[general]
...
register => asterisk-berlin:[email protected]/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).

Si desean pueden ver si han publicado mas cosas de este tutorial aca

https://openwebinars.net/tutorial-asterisk-voip/

(Visited 96 times, 1 visits today)
Sobre Armando Felipe Fuentes Denis 124 Artículos
Network Administrator and Telematic Services in Federation of Radio Amateurs of Cuba Residencia: Regla, La Habana Email: [email protected] Movil: +53 58319403

5 Comentarios

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*