Está en la página 1de 58

Tutorial de

Índice de capítulos

Sección 1
1. Qué es la VoIP
VoIP ¿Qué es y por qué es tan importante?
Breve historia de la VoIP
¿Pero qué supuso el verdadero 'boom' de la VoIP?
2. Los protocolos que hay detrás de la VoIP
Protocolos más importantes
Paquetes de Voz
Señalización - Protocolo H.323
Señalización - Protocolo SIP
Señalización - Protocolo IAX
3. ¿Qué son y cómo funcionan los códecs?
4. La infraestructura de la VoIP y Proveedores de VoIP
Infraestructura de una red de VoIP
Proveedores de VoIP
Sección 2
1. ¿Qué es Asterisk? Digium y la comunidad de Asterisk
¿Todavía no sabes qué es Asterisk?
Digium y la comunidad de Asterisk
2.Interfaces Web para Asterisk
3. Asterisk 11 LTS - ¿Qué cosas nuevas trae?
Sección 3
1. Instalación y configuración Asterisk
Instalación de Asterisk
Configurando Asterisk - sip.conf
Configurando Asterisk - extensions.conf
2. IVR y funciones Dialplan
Creando un IVR
Buzones de Voz
Fichero sip.conf
Fichero extensions.conf
Fichero voicemail.conf
Aplicaciones imprescindibles en tu Dialplan
3. Trabajando con Bases de datos
La base de datos interna de Asterisk
Conexión con bases de datos externas
Conectando con la BBDD
Aplicando la nueva configuración
Llamadas a la base de datos desde el Dialplan
Sección 3
1. El CLI de Asterisk
2. La eterna pelea con la NAT y el Trunking
NAT en Asterisk
Trunking

2
Sección 1
1. 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? Pu1es 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

3
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

4
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.

2. Los protocolos que hay detrás 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

5
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.

6
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 comoprotocolo de conexiones VoIP entre servidores de Asterisk aunque

7
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.

3. ¿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

8
(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'.

9
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.

10
4. 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.

11
En el caso de los teléfonos analógicos (los de toda la vida), como éstos no pueden
conectarse directamente 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

12
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.

13
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,

14
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.

15
En OpenWebinars.net tenemos todos estos
cursos a tu entera disposición

Linux LPIC-1 Linux LPIC-1 NodeJS, AngularJS y


Examen 101 Examen 102 ExpressJS y TypeScript
MongoDB

Apps móviles con Servidores VoIP Desarrollo Virtualización de


PhoneGap con Asterisk Frontend Servidores con
Profesional Promox

Apps Móviles con Desarrollo


Titanium Alloy Backend con
Django

16
Sección 2
1. ¿Qué es 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.

17
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.

18
2.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.

19
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 paraaplicaciones 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

20
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.

21
3. Asterisk 11 LTS - ¿Qué cosas nuevas trae?
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.

En la actualidad tenemos…
Release Series Support Type Release Frequency Soporte Sólo act. seguridad
Asterisk 12 Standard Cada 6-8 Semanas Hasta 2014-12-20 Hasta 2015-12-20
Cert. Asterisk 11 LTS 2-4 veces al año Hasta 2016-10-25 Hasta 2017-10-25
Asterisk 11 LTS Cada 6-8 Semanas Hasta 2016-10-25 Hasta 2017-10-25
Cert. Asterisk 1.8 LTS 2-4 veces al año Hasta 2014-10-21 Hasta 2015-10-21
Asterisk 1.8 LTS Cada 6-8 Semanas Hasta 2014-10-21 Hasta 2015-10-21

22
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.

23
Sección 3
1. Instalación y configuración Asterisk

Instalación de Asterisk
Antes de instalar cualquier servicio, siempre se recomienda por motivos de
seguridad actualizar la máquina en la que vayamos a realizar dicha instalación. En
este caso, se ha decidido instalar Asterisk en 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'​.

3. Se descargan y descomprimen los ficheros de Asterisk:


wget
http://downloads.asterisk.org/pub/telephony/certified
-asterisk/certified-asterisk-11.6-current.tar.gz

24
tar zxvf certified-asterisk-11.6-current.tar.gz

cd certified-asterisk-11.6-current 

4. 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.

5. 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 

6. O bien...
service asterisk stop

service asterisk start

25
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 s
​ ip.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:

26
● 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 identifica 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

27
context=ext_internas

callerid="Jose Luis" <102>

dtmfmode=rfc2833

qualify=yes

mailbox=1002@default

...

[103]

type=friend

secret=e7uKz

host=dynamic

context=ext_internas

callerid="Beatriz" <103>

dtmfmode=rfc2833

qualify=yes

mailbox=1003@default

...

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.

28
[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>

mailbox=1002@default

[103](extensiones-internas)

secret=e7uKz

29
callerid="Beatriz" <103>

mailbox=1003@default

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

30
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)

31
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:

32
[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.

2. 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 fin 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

33
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​.

[globals]
COMERCIAL=SIP/​200​&SIP/​201​&SIP/​202​ ; Variable con las extensiones del dpto
comercial
SOPORTE=SIP/​300​&SIP/​301​ ; Variable con las extensiones del dpto de
soporte

[llamadas-entrantes]
exten => s,​1​,NoOp(Llamada entrante de ${CALLERID(num))
same => n,Answer()
same => n,Playback(bienvenida)
same => n,Background(menu-ivr)
same => n,WaitExten(​4​)

exten => ​1​,​1​,NoOp(El usuario ha elegido la opción ${EXTEN} - Departamento


Comercial)
same => n,Dial(${COMERCIAL})
same => n,Hangup()

exten => ​2​,​1​,NoOp(El usuario ha elegido la opción ${EXTEN} - Departamento


Soporte)
same => n,GotoIfTime(​08​:​00​-​15​:​00​,mon-fri,*,*?continuar,contestador)

same => n(continuar),NoOp(Llamando al Departamento de Soporte)


same => n,Dial(${SOPORTE})
same => n,Hangup()

same => n(contestador),NoOp(Llamada fuera de horario)


same => n,Playback(fuera-de-horario)
same => n,VoiceMail(​1000​@​default​)
same => n,Hangup()

exten => _ [ti],​1​,NoOp(Ha saltado temporizador ​'t'​ u opción no válida ​'i'​)


same => n,Playback(despedida)
same => n,Hangup()

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.

34
● 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

[general]
language​=es
disallow​=all
allow​=alaw
allow​=ulaw

35
videosupport​=no
...

[103]
type​=friend
secret​=e7uKz
host​=dynamic
context​=trabajadores
callerid​="Beatriz" <103>
dtmfmode​=rfc2833
qualify​=yes
mailbox​=1003@default
...

[104]
type​=friend
secret​=ieLp3
host​=dynamic
context​=trabajadores
callerid​="Ángeles" <104>
dtmfmode​=rfc2833
qualify​=yes
mailbox​=1004@default
...

Fichero extensions.conf

[trabajadores]
include​ => internas
include​ => funciones ; Incluimos varios contextos como si fueran parte del
contexto ​'trabajadores'

[internas]
...
exten => _000XXXX,​1​,NoOp(Dejar mensaje en buzón de ${EXTEN:​3​}) ; Con ${EXTEN:​3​}
se recortan los ​3​ primeros dígitos de la variable EXTEN
same => n,Answer()
same => n,VoiceMail(${EXTEN:​2​}@​default​) ; Para dejar un mensaje en el buzón XXXX
del grupo ​'default'​ del voicemail.conf
same => n,Hangup()
...

[funciones]
...
exten => _000*,​1​,NoOp(Accediendo al buzón de ${CALLERID(num)})
same => n,Answer()
same => n,VoiceMailMain(${CALLERID(num)}@​default​) ; Para acceder al buzón de voz
de la propia extensión que está llamando
same => n,Hangup()
...

36
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,beatriz@miempresa.com,,attach=yes|saycid=yes|envelope=yes|delete=yes|t
z=european 1004 => pass_ángela,A.
Santos,angeles@miempresa.com,,attach=yes|saycid=yes|envelope=yes|delete=yes|t
z=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 estos mensajes de voz y no enviarlos
directamente por correo electrónico configurando los parámetros ​delete​, ​attach

​ mail​ de la forma adecuada.


ye

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

37
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,[lang
override,[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​.

38
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

39
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,[time
out,[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

40
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([mailbox@[context]],[options])

● Wait

41
Define 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]])

3. 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)

42
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"]?cont
estador_activo,contestador_inactivo

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

[extensiones]

43
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()

44
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é

45
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

46
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

47
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

48
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)})})

Sección 3
1. El CLI de Asterisk
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

49
(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".

50
● 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

51
-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)

52
-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.

53
● 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.

2. La eterna pelea con la NAT y el Trunking

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.

54
● 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]

55
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:password-berlin@madrid.es/asterisk-berlin

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

La idea del esquema es muy sencilla:

56
● 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).

57

También podría gustarte