Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TutorialAsterisk PDF
TutorialAsterisk PDF
Í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
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.
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.
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.
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.
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.
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
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
16
Sección 2
1. ¿Qué es Asterisk? Digium y la comunidad de Asterisk
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
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.
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.
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:
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:
reboot
24
tar zxvf certified-asterisk-11.6-current.tar.gz
cd certified-asterisk-11.6-current
make menuselect
make
make install
make samples
make config
/etc/init.d/asterisk start
6. O bien...
service asterisk stop
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
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.
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...
[102]
type=friend
secret=1ezkR
host=dynamic
27
context=ext_internas
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
...
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
mailbox=1002@default
[103](extensiones-internas)
secret=e7uKz
29
callerid="Beatriz" <103>
mailbox=1003@default
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.
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
[llamadas-salientes]
31
exten => 20002,3,Hangup()
Se puede ignorar el número de la prioridad si ésta se edita como same => n, ('n'
32
[empresa]
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.
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)
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
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
● 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
● 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]])
1. Añadir una entrada o modificar una existente:
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})
[desvios]
same =>
n,Set(DB(desvios/${CALLERID(num)})=${EXTEN:1})
44
exten => _*000,1,NoOp(Se elimina el desvío de
${CALLERID(num)})
same =>
n,Set(DB(desvios/${CALLERID(num)})=${CALLERID(num)})
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]
Driver = /usr/lib/odbc/libmyodbc.so
FileUsage = 1
[MySQL-Asterisk]
Driver = MySQL
46
Socket = /var/run/mysqld/mysqld.sock
Server = direccion_bbdd
User = usuario_bbdd
Password = password_bbdd
Database = nombre_bbdd
Option = 3
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]
47
password = password_bbdd
pooling => no
limit => 1
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).
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:
[llamadas-entrantes]
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:
● 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 -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"
-f Do not fork
-F Always fork
51
-i Initialize crypto keys at startup
52
-X Execute includes by default (allows #exec in
asterisk.conf)
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
● 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.
● 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.
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.
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):
54
● nat = force_rport - Se fuerza a trabajar según la RFC3581 y se deshabilita el
soporte simétrico 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.
[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.
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.
57