Está en la página 1de 27

1.

Explique usted cual sera el procedimiento para realizarla instalacion de Dahdi, LibPRI y Asterisk

Instalar LibPRI
Como comentaba antes, la librería libPRI es la encargada de gestionar lo relacionado
a la telefonía digital, es decir los Primarios, PRI, las RDSI (BRI) y a su vez el
protocolo QSIG, estandarizado para la señalización entre PBX que utilicen estos
sistemas de telefonía.
La instalación de LibPRI es bastante sencilla y no suele dar lugar a errores.
Considerar que como ejemplo voy a utilizar la versión aplicable en el momento de la
escritura de este documento, y es muy probable que se mantenga invariable con el
tiempo, ya que estas librerías se encuentran en un nivel de madurez bastante alto y
son poco propensas a sufrir modificaciones con el tiempo.
# cd libpri-1.4.12

# make

# sudo make install

Instalar DAHDI
Por otro lado, debemos instalar todo lo referente a DAHDI para el correcto uso de
tarjetas. Al igual que en el caso de LibPRI, todo resulta bastante secuencial y libre de
fallos. Al igual que para el resto de los componentes, esto se aplica a la versión
actual, y muy similar también a LibPRI, DAHDI se encuentra en un nivel de madurez
el cual hace que no sufra modificaciones apenas, excepto para la incorporación de
drivers para tarjetas Digiums nuevas, como ocurrió recientemente con la salida de la
tarjeta de 8 spans como comento en la sección Digium.
Ademas gracias a la instalación de los paquetes DAHDI aun sin tarjetas insertadas,
estamos ofreciendo una fuente de sincronización al sistema por software, vía
dahdi_dummy, útil por ejemplo, para determinadas aplicaciones propias de Asterisk
como MeetMe que lo requieren para funcionar adecuadamente.
# cd dahdi-linux-complete-2.6.1+2.6.1/

Es importante considerar que durante la instalación de DAHDI, el fichero Makefile


hace llamadas a wget para descargar componentes y drivers de Internet. Esto puede
ser problemático específicamente en el caso que estemos instalando nuestro
Asterisk sin disponer de una conexión a Internet. Es posible que en este caso
deseemos modificar el archivo Makefile para que se ajuste a nuestras necesidades
del momento.
# make

# sudo make install

# sudo make config


Instalar Asterisk
Finalmente, el núcleo principal y todos sus añadidos, el origen y el sentido de esta
Wiki, llega la hora de instalar Asterisk. Esta parte del proceso es la que debe ser mas
cuidada y esta sujeta a varias consideraciones según comento a continuación.
En primer lugar accedemos a las fuentes como viene siendo habitual de las otras
instalaciones y realizamos la configuración de los ficheros de compilación gracias a la
poderosa herramienta Autoconf.
# cd asterisk-1.8.12.0/

# ./configure

Si nos aparece el símbolo de Asterisk significa que existe una alta probabilidad de
que la instalación fluya perfectamente. Sino aparece significa que algo no hemos
instalado correctamente, seguramente sea algún paquete de algún programa durante
la primera fase de la instalación. Con el siguiente comando, podriamos intentar tener
una aproximación de que ha fallado y que puede ser necesario:
# ./configure

En siguiente lugar, nos toca realizar la selección de que es lo que queremos compilar
y transitívamente instalar. Para ello la opción mas sencilla sería acceder al menu de
selección que provee la herramienta de instalación de Asterisk:
# make menuselect

MenuSelect de Asterisk

En este apartado podremos seleccionar a voluntad utilizando las teclas de


movimiento del teclado. Por defecto esta seleccionado lo mas interesante, así que a
priori, no sería necesario cambiar nada, a no ser que realmente lo necesitáramos.
Una vez realizada la seleccion a voluntad, pulsamos TAB y luego Intro para "Save
and Exit".
Con esto ya estamos preparados para compilar las fuentes.
# make

# sudo make install

# sudo make config


Y si deseamos también podríamos compilar la documentación en Doxygen.
Realmente no es demasiado práctico especialmente si no disponemos de amplios
recursos en nuestra máquina y mas sabiendo que hoy en día hay suficiente
documentación. Pero si aun así queremos proceder seria:
# make progdocs

Finalmente existe un comando bastante interesante, pero algo "peligroso" si no es


tomado con cautela. Es posible cargar todos los archivos de configuración de
ejemplo en los directorios ideales por defecto (/etc/asterisk típicamente) y poder
trabajar sobre estos archivos en vez de tener que crearlos desde 0. El problema es
que ya existe una instalación de Asterisk y ejecutamos el comando, destruiríamos
todos los ficheros que ya se encuentran residentes. En una instalación limpia como la
que nos ocupa ahora mismo, no habría gran problema. En el caso de este tutorial, no
vamos a ejecutarlo para así poder ir construyendo el sistema Asterisk desde la base
mínima. Además todos estos ficheros de configuración de ejemplo que estoy
hablando se encuentran dentro de nuestro directorio de fuentes de instalación de
Asterisk en el directorio /configs/.
Pero si aun así queremos hacerlo simplemente ejecutamos:
# make samples

Y con todo esto, ya tenemos el sistema Asterisk instalado.

2. Detalle cual es el procedimiento para: Configurar un Teléfono IP, configurar 3 usuarios SIP y
configurar un Adaptador de teléfono analógic

configurar un teléfono VoIP SIP desde cero. Primero obtendremos los datos SIP
necesarios del router de la operadora para posteriormente poder configurar cualquier
teléfono VoIP SIP.

Seguimos con los vídeos para poder quitar el router de la operadora telefónica. Ya
hemos configurado nuestro router neutro y como vimos en el anterior videotutorial
ahora toca configurar el teléfono. En este vídeo vamos a ver cómo configurar un
teléfono fijo analógico tradicional a través de un adaptador ATA SIP para poder
utilizar un teléfono convencional.

El procedimiento será el mismo independientemente del teléfono VoIP SIP que


utilicemos. Podemos usar un teléfono SIP, un smartphone con una aplicación VoIP
SIP o un teléfono fijo tradicional a través de un adaptador ATA SIP. Una vez obtenidas
las claves y todos los datos necesarios del router de nuestra operadora dará igual el
teléfono que que queramos configurar. Si entiendes el proceso dará igual que tu
operadora sea Movistar, Orange, Vodafone, Masmovil, Jazztel o la que sea.

Obtención de los datos VOIP SIP 


Lo primero que deberemos hacer es conseguir los parámetros de configuración SIP.

En mi router ZTE F680 de Jazztel tengo estos datos SIP que son públicos e iguales era
todos los usuarios de dicha operadora.

Por otro lado tenemos que obtener los datos SIP propios de cada usuario y para ello
deberemos conectarnos a nuestro router de operadora mediante un acceso telnet y
escribir estas dos líneas.

 sendcmd 1 DB p VoIPSIPLine
 sendcmd 1 DB p DevInfo

Ahora ya tenemos las dos tablas con todos los datos necesarios y pasamos a la


siguiente fase que es configurar el teléfono VOIP SIP. En mi caso voy a utilizar un
adaptador ATA SIP Grandstream HT701 para poder usar el teléfono fijo que ya tenía.

 Configuración del teléfono VoIP SIP


En este vídeo tutorial te explico paso a paso dónde colocar cada uno de los parámetros
de configuración como: el servidor SIP, el proxy, el número de teléfono, contraseña,
qué puerto utilizar y bajo qué protocolo, el orden de los codecs o compresión de audio
a utilizar, servidor DNS, IP privada, etc,…

En Jazztel aparte de todo lo mencionado además deberemos calcular el SIP UserAgent


Header. Sin esta cabecera no vamos a poder registrar nuestro teléfono en la operadora
porque nos dará error de login.

Este parámetro no aparece directamente en ningún sitio directamente, sino que


deberemos calcularlo escogiendo los fragmentos adecuados de la segunda tabla que
hemos extraído del router. El proceso es un poco engorroso y por eso en el video
tutorial he perdido tiempo en aclarar detalladamente cómo construir esa frase o
parámetro tan necesario.

Como puedes ver en la imagen he separado cada bloque o cada eslabón de la cadena
en colores distintos para que sea más fácil identificarlos.

Hay otras operadoras, como por ejemplo Orange, donde no es necesario este


parámetro. Aunque omitas el  SIP User Agent Header en la configuración de tu
teléfono SIP va a funcionarte correctamente porque no es necesario para poder
registrarlo.

Registro del teléfono VOIP SIP en la operadora


Como he mencionado antes, todo este proceso es porque necesitamos registrar o
emparejar nuestro teléfono SIP con la centralita de nuestra operadora. Si hemos
realizado bien todos lo pasos anteriores deberemos ver algo parecido a esta imagen.
 Como podemos ver pone “Registred”, es decir, estamos registrados y ya podemos
utilizar el teléfono porque ya tenemos línea. Mientras no veamos esto en la
configuración del dispositivo que utilicemos no nos funcionará.

3. Explique como se realiza la configuración de dialplan básico usando variables, la onfiguración de


dialplan básico usando patrones, la configuración de dialplan básico usando astDB y la
Configuración básica del voicemail.

DIAL PLAN MACROS

Las macros resultan de mucha ayuda a la hora de elaborar el dial plan, ya que nos
permiten simplificar aun mas la elaboración de nuestro dial plan, es como crear
nuestras propias funciones personalizadas para el dial plan, a continuación vamos a
utilizar como ejemplo la creación de una macros para el buzón de voz.

Observemos el siguiente dial plan:

exten => 201,1,Dial(${JOHN},10)


exten => 201,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => 201,n(unavail),Voicemail(101@default,u)
exten => 201,n,Hangup()
exten => 201,n(busy),VoiceMail(101@default,b)
exten => 201,n,Hangup()

En el hemos automatizado la forma como las llamadas ingresaran directamente al


buzón de voz dependiendo del estado de la extensión utilizando la variable $
{STATUS}, sin embargo así como esta tendríamos que agregar estas líneas por cada
extensión en la central ya que esta extensión estará siempre ligada hacia el usuario
Jhon o sea la extensión 201.

Utilizaremos las macros para mostrar cual es la mejor manera de configurar una
buzón de voz para varias extensiones.

Definiendo la macros
La macros se definen de una manera muy similar a los contextos,
debemos definir una macros entre corchetes y anteponiendo la palabra
“macro-” antes del nombre de la macro que vamos a crear.

Ejemplos:

[macro-prueba]

[macro-voicemail]

De esta manera el sistema podrá diferenciar una macro de un contexto


normal

Definiendo la macros
Veamos un ejemplo con el buzón de Jhon pero ahora dentro de una
macros

[macro-voicemail]
exten => s,1,Dial(${JOHN},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(101@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(101@default,b)
exten => s,n,Hangup()

Uno punto importante es mencionar que las macros solo soportan la


extensión “S”
Todo va bien solo que aun seguimos amarrados al buzón de Jhon.

Definiendo la macros

Sin embargo las macros tienen propiedades importantes a comparación


de un contexto común corriente. Y es que permiten trabajar con algunas
variables adicionales e incluso soportan el envió de argumentos

Incorporando una macros al Dial Plan:

exten => 201,1,Macro(voicemail)

Las aplicación macro define variables especiales, para su utilización:

${MACRO_CONTEXT}, contiene el contexto original desde donde fue ejecutada la


macro

${MACRO_EXTEN}, contiene el valor de la extensión original donde fue ejecutada la


macro

${MACRO_PRIORITY}, contiene la prioridad original desde donde fue ejecutada la


macro

${ARGn}, contiene el “n” mismo argumento ingresado a través de la macro, por


ejemplo, el primer argumento será ${ARG1}, el segundo argumento será {ARG2} y
así sucesivamente.

En el siguiente ejemplo trataremos de explicar como se pueden utilizar esta


variables especiales:

[macro-voicemail]
exten => s,1,Dial(${JOHN},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()
Usando argumentos en las macros

Ahora vamos a prepara una macros genérica gracias a los argumentos, observemos
el siguiente ejemplo donde por fin separamos la macros del numero de la extensión,
para poder utilizarla desde cualquier extensión.

[macro-voicemail]
exten => s,1,Dial(${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

De esta manera podemos llamar a la macros desde el dial plan

[macro-voicemail]
exten => s,1,Dial(${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

[from-internal]
exten => 101,1, Macro(voicemail,${JOHN})
exten => 102,1,Macro(voicemail,${JANE})
exten => 103,1,Macro(voicemail,${JACK})

Incluso podemos simplificar una vez mas utilizando la variable ${EXTEN}

[macro-voicemail]
exten => s,1,Dial(SIP/${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

[from-internal]
exten => 1XX,1,Macro(voicemail,${EXTEN})

Solo debemos tomar en cuenta que en esta ocasión estamos amarrados al protocolo
SIP, en el ej. Anterior no importaba el tipo de canal utilizado ya que este se
declaraba como variables globales.

Un ejemplo mas avanzado he interesante de analizar es el siguiente:

[macro-voicemail]
exten => s,1,Dial(${ARG1},20)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(${MACRO_EXTEN},u)
exten => s-NOANSWER,n,Goto(incoming,s,1)
exten => s-BUSY,1,Voicemail(${MACRO_EXTEN},b)
exten => s-BUSY,n,Goto(incoming,s,1)
exten => _s-.,1,Goto(s-NOANSWER,1)

En esta ocasión estamos incluyendo el comando Goto y esto nos puede servir para
reenviar la llamada hacia un menú por ejemplo donde el usuario llamante tenga
mas de una opción.

ASTERISK: FEATURES

Podemos configurar algunas características adicionales en el archivo features.conf.

Las características principales son las siguientes:

Transferencia desatendida (blind transfer)


Parqueo de llamadas (parking lot)
Grupo para jalar llamadas (pickup group)
Sala de conferencias (meetme)

Para ello será necesario que editemos el archivo features.conf ubicado en la


carpeta de asterisk.

TRANSFERENCIAS DESATENDIDA

Normalmente por defecto la transferencia desatendida se realiza presionado el


boton #

Este tipo de transferencia consiste en derivar la llamada hacia otro anexo sin
habernos cerciorado antes si la persona en la extensión destino se encuentra
disponible para recibir la llamada.

Vamos a editar el archivo de la ruta /etc/asterisk/features.conf


Donde buscaremos el parámetro blind transfer y cambiaremos el varo “#” por “##”,
con esto conseguiremos evitar problemas con las llamadas hacia números que
comiencen con la tecla “#” como los móviles RPM por ejemplo.

El siguiente grafico ilustrara mejor el proceso de comunicación


Realizar una transferencia atendida, consiste en llamar al destino para confirmar la
transferencia, antes de realizarla.
Este tipo de transferencia suele ser necesario para trabajadores que no
acostumbran contestar ni llamar directamente de su extensión, tales como
funcionarios, gerentes, ejecutivos, etc.

El siguiente grafico nos ilustrara el proceso de comunicación.

Se puede habilitar una combinación para la transferencia atendida, por ejemplo *2


para simular la tecla flash

PARQUEO DE LLAMADAS

En algunas ocasiones durante una conversación telefónica es necesario movilizarnos


( para ir a conseguir un archivo, documento, o realizar alguna consulta), pero
lamentablemente no es posible ni practico que todos los usuario cuenten con un
anexo inalámbrico, en estos casos es ideal contar con la función de parqueo de
llamadas.

Esta función consiste en aparcar una llamada en una extensión virtual dentro de
nuestra central telefónica, de esta manera podremos recuperar esa llamada
simplemente llamando a la extensión virtual creada en el momento que aparcamos
la llamada

Esta función se habilita en la sección [general]

Y cuenta con los siguientes parámetros:

Parkext => 700 donde 700 es el numero de la extensión de entrada al


estacionamiento

Parkpos => 701-720, aquí definimos el rango de posiciones apra nuestro


estacionamiento
Context => parkedcalls, aquí definimos el nombre del contexto en para nuestro
estacionamiento, no olvidar que este contexto debe estar incluido (include) en el
contexto de las extensiones que queramos que puedan recuperar llamadas desde el
estacionamiento.

Parkingtime => 180, este será el tiempo máximo en segundos que una llamada se
mantendrá en el estacionamiento.

PICKUP GROUP

Un Pick up group es un grupo conformado por extensiones con autorización para


“jalarse” las llamadas, es decir; estas extensiones podrán contestar llamadas
dirigidas hacia cualquier anexo de su grupo, pero marcando previamente un código.

Por ejemplo si tenemos dos extensiones en un mismo grupo, y llaman a una de ellas
pero justo no se encuentra la persona en su extensión, entonces otra persona podrá
contestar la llamadas desde su extensión (siempre que este dentro del mismo
pickup group) con solo presionar: *8

Esta opción también se encuentra en la sección general y podemos definir o


modificar el código por defecto *8 en el parámetro:

Pickupexten = *8

Pero será necesario también que asignemos los grupos a cada extensión en el
archivo sip.conf.

El grupo puede asignarse mediante los parámetros:


Callgroup=1, donde 1 es el número del grupo de llamada
Pickupgroup=1, donde 1 es el número del grupo para pickup
4. Determine cual es la forma de realizar la configuración de dialplan básico usando Macros, la
Configuración del fichero: extensions.macros.conf y la integracion del Fichero
extensions.anexos.conf

DIAL PLAN BASICS

El plan de marcación o “Dial Plan”, es el corazón de toda configuración en asterisk,


y de esta configuración dependerá el performace y eficiencia de nuestra central
telefónica.
Para poder personalizar la central a gusto se deberá comprender plenamente el
funcionamiento del plan de marcación de asterisk

Sintaxis:
El plan de marcación se configura en el archivo extensions.conf, este archivo reside
usualmente en la carpeta /etc/asterisk/

El dial plan esta compuesto de 04 conceptos principalmente:


- Contextos
- Extensiones
- Prioridades
- Aplicaciones

CONTEXTOS:
El dial plan se divide en secciones llamadas contextos, los contextos son nombres
para un grupo de extensiones, las cuales pueden tener diferentes propósitos. Los
contextos también pueden interactuar entre ellos.

Los contextos se denotan escribiendo el nombre del contexto entre corchetes


“[nombre_de_contexto]”.

Durante la creación de una extensión (sip.conf, iax.conf, etc) se define a que


contexto pertenece.

p.e. context=from-internal

Todas las instrucciones por debajo del nombre del contexto son asignadas a ese
mismo contexto hasta que un nuevo contexto sea declarado.

Al inicio del archivo extensions.conf, existen dos contextos especiales

-[General]
-[Globals]

La sección general, contiene los parámetros generales del dial plan.

La sección globals, contiene las variables globales del sistema, las cuales irán siendo
utilizadas por los contextos siguientes.

EXTENSIONES:
Normalmente conocemos con el nombre de extensión, al numero que se le asigna a
los terminales telefónicos, sin embargo en asterisk una extensión es mucho mas que
un número _ telefónico, ya que define una serie de pasos (donde cada paso
contiene una aplicación) que asterisk realizara durante una llamada.

La sintaxis usada para declarar una extensión es la palabra “exten”, seguido de una
flecha formada por una signo igual y un signo mayor

p.e. exten =>


Esto va seguido por el numero de la extensión.

exten => name,priority,application()

Una extensión completa esta compuesta de:

El nombre (o numero) de la extensión.

La prioridad (cada extensión puede incluir múltiples pasos, el numero del paso es
llamado prioridad)

La aplicación (o comando) es el que realiza la acción en la llamada.

PRIORIDADES:
Cada extensión puede tener multiples pasos, llamados prioridades, cada prioridad
es numerada secuencialmente, comenzando con 1, y ejecutando una aplicación
especifica.

Existe un tipo de prioridad “no numerada” que se representa con la letra n y


permite evitar problemas generados por la numeración secuencial.

Esta prioridad “no numerada” significa que cada prioridad es igual a la prioridad
anterior +1

Por lo tanto: n=n+1


p.e. exten => 123,1,Answer()
exten => 123,n,do something
exten => 123,n,do something else
exten => 123,n,do one last thing
exten => 123,n,Hangup()

PRIORIDADES - ETIQUETAS:

Desde asterisk 1.2, es muy común asignar etiquetas de texto (labels), a las
prioridades. Esto es para asegurarnos que podremos referirnos a esa prioridad por
un valor distinto a su numero, el cual probablemente no se conozca (prioridad n), y
dado que actualmente el uso de prioridades no numeradas es muy usual en el diseño
de una dial plan.

Para asignar una etiqueta de texto a una prioridad, solo basta con agregarla entre
paréntesis justo después del numero de la prioridad.

p.e. exten => 123,n(label),application()

APLICACIONES:

Las aplicaciones son el caballito de batalla del dial plan, cada aplicación realiza una
acción especifica sobre el canal actual, como por ejemplo, tocar una melodía,
aceptando entradas de tono, marcar un canal, colgar una llamada, y así
sucesivamente.

Algunas aplicaciones como Answer() o Hangup(), no requieren mayor información


para hacer su trabajo, sin embargo existen otras aplicaciones que si requieren de
cierta información adicional para procesarla, a esta información adicional se le
conoce como parámetros, y para pasarle los parámetros a la aplicación deben
colocarse entre los paréntesis.

Ocasionalmente podríamos ver el pipe entre los paréntesis, y es que este signo es
utilizado para separar mas de un parámetro.

CONSTRUYENDO UN DIAL PLAN SIMPLE:


Answer(), Playback(), Hangup()

Vamos a construir un dial plan que consista en que , asterisk contesta la llamada,
toca una melodía, y luego cuelga.
Para este ejemplo vamos a asumir que ya hemos creado la extensión y que tiene
como nombre de contexto “from-internal”

Para la construcción de este dial plan utilizaremos las siguientes aplicaciones:

Answer()
Playback()
Hangup()

Answer(), es la aplicación que se utiliza para que la central conteste una llamada
que esta timbrando.

Se puede utilizar al inicio de la configuración del contexto para una extension, pero
en algunas ocasiones no es necesario.

Como ya mencionamos, Anwser() no tiene argumentos

Playback(), es la aplicación que se utiliza para reproducir un sonido grabado


previamente en un archivo o a través de un canal.

Cuando utilizamos playback, las entradas (inputs) del usuario desde la extension son
ignoradas.

Para utilizar playback() se debe ingresar el nombre del archivo sin la extension (p.e.
.wav o .mp3) como argumento entre los paréntesis.

Por defecto playback buscara el archivo ingresado como argumento en la ruta


“/var/libs/asterisk/sounds”

Si se desea hacer referencia a un archivo ubicado en otra ruta, se deberá ingresar la


ruta completa entre los paréntesis

Playback(/home/john/sounds/filename)
Lo mas comun es crear una carpeta para estos archivos dentro de la ruta por
defecto

Playback(custom/filename)

Ahora si vamos a crear nuestro dial plan

[from-internal]
exten => 1234,1,Answer()
exten => 1234,n,Playback(hello-world)
exten => 1234,n,Hangup()

CONSTRUYENDO UN DIAL PLAN INTERACTIVO:


Background(), WaitExten(), and Goto()

La aplicación background, es la pieza vital para un dial plan interactivo.

El background(), al igual que playback() reproduce una grabación, pero a diferencia


de playback(), esta aplicación si permite al usuario ingresar entradas (inputs) desde
el teclado del teléfono, estas entradas interrumpen la reproducción y se dirige a la
extensión correspondiente.

El uso mas común que suele dársele a la aplicación background, se encuentra en la


construcción de menús de voz.

exten => 123,1,Answer()


exten => 123,n,Background(main-menu)

En el ejemplo anterior por defecto se cortara la llamada, pero si lo que queremos


es esperar a que el usuario ingrese o marque algun codigo podemos agregarle la
aplicación waitexten() al final.

exten => 123,1,Answer()


exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()

La aplicación WaitExten(), le indica al sistema que espere por el ingreso de una


extensión, la cual deberá estar dentro del contexto.

exten => 123,1,Answer()


exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)
Que ocurre cuando, tenemos un duplicado entre los primeros digitos de las
extensiones disponibles:

p.e.
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)

Del ejemplo anterior si llamamos al 123, y luego presionamos la opción 123,


volveremos a ir al menú, pero que ocurre si solo presionamos 1.

Como se puede comprobar en la practica asterisk esperara unos segundos cuando se


encuentra con mas de una alternativa posible.

Luego de este tiempo ejecutara la extensión según los dígitos que fueron
ingresados.

Finalmente vamos a mencionar que la aplicación WaitExten() soporta como


argumento el tiempo en segundos que esperara para que el usuario ingrese una
extensión valida, luego de este tiempo terminara esta aplicación, y pasara a la
siguiente prioridad si existiera.

Ahora vamos a utilizar la aplicación Goto().

La aplicación Goto(), es utilizada para enviar una llamada a otra parte del dial plan,
la sintaxis de la aplicación Goto(), requiere los argumentos contexto, extensión y
prioridad.

exten => 123,n,Goto(context,extension,priority)

Background(), WaitExten(), and Goto()

[from-internal]
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(incoming,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(incoming,123,1)

MANEJANDO INPUTS Y TIMEOUTS

[from-internal]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(from-internal,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(from-internal,123,1)
exten => 3,1,Playback(digits/3)
exten => 3,n,Goto(from-internal,123,1)
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(from-internal,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()

MANEJANDO INPUTS Y TIMEOUTS

La opción i, se ejecuta cuando el usuario ingresa una opción invalida, y cuando se


cumple el tiempo máximo disponible para que el usuario marque una extensión, la
llamada será direccionada automáticamente hacia la extensión t (el timeout por
defecto es de 10 segundos).

Utilizando las opciones “i” y “t”, obtenemos un dial plan un poco mas robusto y
amigable.

La extensión “S”
Cuando una llamada entra en un contexto sin un destino especifico (por ejemplo
una llamada en la línea FXO), se pasa a la extensión s, “S” significa inicio o start.

La extensión “S” es muy utilizada para generar menús en la central telefónica.

El siguiente ejercicio intentara mostrar el funcionamiento de la extensión s,


haciendo uso de la aplicación Goto().

[menu]
exten => _98,1,Goto(from-pstn,s,1)

[from-pstn]
exten => s,1,Answer()
exten => s,n,Playback(hello-world)
exten => s,n,Hangup()

Habiendo definido esto ahora pasaremos a ver otras aplicaciones muy importantes,
como la aplicación DIAL(), que nos permite comunicar a dos anexos (personas) entre
si.

Usando la aplicación Dial()

La aplicación Dial(), es una de las aplicaciones mas importantes con las que cuenta
asterisk, tiene la capacidad de conectar dos usuarios uno con el otro.

Esto resulta muy útil sobre todo cuando los usuarios están utilizando distintos tipos
de medio de comunicación, por ejemplo.

Por ejemplo podemos utilizar la aplicación Dial() para comunicar a un usuario que
llama desde un teléfono analógico a través de la rede de telefonía tradicional, con
otro usuario que se puede encontrar en cualquier parte del mundo conectado a
través de Internet con su teléfono IP.
La sintaxis de Dial(), es mas compleja que la sintaxis de la funciones anteriores, y
puede tener hasta 4 argumentos, el primero el el destino al cual esta intentando
conectarte.

Dial(type/identifier, timeout, options, URL)

p.e.
exten => 204,1,Dial(SIP/201)
exten => 202,1,Dial(IAX2/202)

También se pueden llamar a un conjunto de extensiones


p.e.
exten => 111,1,Dial(SIP/202&SIP/203&SIP/204)

Usando la aplicación Dial()

El segundo argumento me permite colocar el tiempo máximo que se ejecutara la


aplicación Dial.

exten => 123,1,Dial(Zap/1,10)


exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()

El tercer parámetro puede ser una cadena o carácter, la lista de opciones es


bastante larga, y pueden encontrarla en el siguiente hipervínculo:

http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial

Usando la aplicación Dial()


p.e.

exten => 123,1,Dial(Zap/1,10,m)


exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()

El carácter “m”, permite que el usuario que esta llamando escuche la MOH en lugar
del tono de ring, hasta que la llamada sea contestada.

Cuando recibimos una llamada podemos derivarla a un menú como el que hemos
creado, pero a su vez podemos formar un menú mas completo con el comando
Dial(), tal como se aprecia en el siguiente ejemplo:

[from-pstn]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Dial(Zap/1,10)
exten => 1,n,Playback(vm-nobodyavail)
exten => 1,n,Hangup()
eten => 2,1,Dial(SIP/Jane,10)
exten => 2,n,Playback(vm-nobodyavail)
exten => 2,n,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(from-internal,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()

DIAL PLAN: VARIABLES, FUNCIONES, CONDICIONALES

Las variables pueden ser de 03 tipos:

Variables Globales

Variables de Canal

Variables de Entorno

Las variables ayudan a reducir o simplificar el contenido y la estructura del dial


plan optimizando de esta manera el proceso de lectura de los archivos de
configuración de nuestra centralita. También sirven para agregar lógica a nuestro
dial plan.

Una variable es como un contenedor que puede mantener una valor durante un
periodo.

Variables Globales, se aplican a todas las extensiones en todos los contextos, esta
variables deberán ser declaradas debajo del contexto [globals].

Por ejemplo vamos a guardar el valor SIP/201 en la variable JESUS

[globals]
JESUS=SIP/201
JESSICA=SIP/202
PABLO=SIP/208

exten => 123,1,Dial(${JESUS}&${JESSICA})

Ciertamente el tema de las variables resulta mas interesante cuando las asignamos
a las troncales

[globals]

TELEFONICA=ZAP/1
1977=ZAP/2
BASE CLARO=ZAP/3
JESUS=SIP/201
JUAN=SIP/202

Este tipo de esquema nos permite elaborar un dial plan en funciona a variables y si
se produce alguna modificación en el esquema, solo bastara con cambiar el valor de
la variable y no será necesario modificar todo nuestro dial plan.

Variable de canal, esta variable se asocia solamente con una llamada, y a diferencia
de las variables globales, las variables de canal se definen solo para la duración de
la llamada actual, y solo están disponibles para los canales que participan de esa
llamada.

Existen varias variables de canal predefinidas y están disponibles para ser utilizadas
durante la marcación.

p.e.

exten => 125,1,Set(MAGICNUMBER=42)

Las variables de entorno, son una forma de acceder a las variables del entorno unix
desde asterisk, podemos hacer referencia a estas variables a través de la funciona
de marcación env(), la sintaxis de esta variables es:

${ENV(var)} ; donde var es una variable del entorno de linux o unix a la cual
queremos referenciar.

Este tipo de variables no son de uso común en el dial plan pero están disponibles si
fuesen necesarias.

Patrones de Marcado y Variable ${EXTEN}

Los patrones de marcación son comodines que nos permiten simplificar un grupo de
extensiones, con este tipo de comodines podemos crear reglas que agrupen grandes
conjuntos de números en unas cuantas líneas.

X : equivale a un digito 0 – 9
Z : equivale a un digito 1 – 9
N : equivale a un digito 2 – 9
[15-7] : equivale a los dígitos 1, 5, 6, 7.
. : Este comodín equivale a un o mas dígitos sin importar el valor

Patrones de Marcado y Variable ${EXTEN}

La variable EXTEN, toma el mismo valor que el numero de la extensión.

exten => _XXXX,1,SayDigits(${EXTEN})

A partir de esta variable también podemos mutilar el numero marcado, por ejemplo
si seguimos la siguiente sintaxis conseguiremos recortar los primeros dígitos del
numero.

${EXTEN:x:y} ; “X” es la posición donde comenzara el numero resultante y “Y” es la


cantidad de dígitos que serán retornados
exten => _XXXX,1,SayDigits(${EXTEN:2})

Patrones de Marcado y Variable ${EXTEN}

Los siguientes ejemplos ayudaran a comprender mejor las opciones:

exten => _273443,1,SayDigits(${EXTEN:2}); ${EXTEN:2}=3443


exten => _273443,1,SayDigits(${EXTEN:1}); ${EXTEN:1}=73443
exten => _9388211,1,SayDigits(${EXTEN:3}); ${EXTEN:3}=8211
exten => _9388211,1,SayDigits(${EXTEN:3:2}); ${EXTEN:3:2}=82
exten => _9388211,1,SayDigits(${EXTEN:0:1}); ${EXTEN:0:1}=9
exten => _9388211,1,SayDigits(${EXTEN:0:2}); ${EXTEN:0:2}=93
exten => _9388211,1,SayDigits(${EXTEN:-4:2}); ${EXTEN:0:2}=82

exten => _XXXX,1,SayDigits(${EXTEN:2}), devolverá los últimos 3 dígitos que se


hallan marcado

Patrones de Marcado y Variable ${EXTEN}

Un ejemplo mas practico seria el siguiente:

Si queremos que los usuarios marquen el nueve antes del numero que van a llamar
como en la mayoría de las centrales telefónicas el dial plan seria:

exten => _9.,1,SayDigits(${EXTEN:1}), de esa manera se devolverá el numero que se


halla marcado pero sin el 9, listo para salir a la red publica de telefonía
5. Explique como se Utiliza la aplicación authenticate en el dial plan, la configuracion de archivos,
donde incluir las contraseñas de los usuarios y la asignacion de las categoría de permisos por
usuario para hacer llamadas.

 Utilizar la aplicación ‘Authenticate’ con un código PIN conocidos


por todos los usuarios y que se ejecute antes de hacer una llamada
internacional:

Por ejemplo, algo como esto:

exten => _00X.,1,NoOp(Calling International number: ${EXTEN})


exten => _00X.,n,Authenticate(0173)
exten => _00X.,n,Dial(SIP/${EXTEN}@InterProvider)
Esto ya haría que el usuario llamante que envía dicha llamada, necesite conocer
nuestro código de autentificación (0173) para poder realizar dicha llamada.
Este código deberán conocerlo todos los usuarios y, aunque retrase un poco el
establecimiento de la llamada por tener que marcar 4 números más, seguro que
el hecho ampliar dicha seguridad es algo que merece la pena hacer.

 Evitar el acceso externo del 5060 mediante el propio firewall de


Linux:
Este, sin duda es el que menos me gusta, ya que es muy interesante poder
recibir llamadas a nuestros usuarios sin necesidad de tener que llamarles vía
red telefónica.
Es decir, si yo desde mi softphone llamo a:
SIP:jackoman@asterisk.jackoman.com suene correctamente la extensión de mi
amigo sin tener que llamarlo al móvil o a su número fijo.
No obstante, si cierro el puerto 5060/UDP vía firewall, jamás podría hacerlo
algo que rompería con toda la filosofía de lo que es la VoIP y una de sus
principales ventajas. 🙁

 Una configuración adecuada del dialplan:

Generalmente este es el principal error, las llamadas entrantes sin autentificar


en el SIP.conf son dirigidas al contexto ‘default’ del extensions.conf.
Si el extensions.conf NO lo hemos configurado como nos han enseñado,
podríamos llegar a tener algo como esto:

[default]
exten=>s,1,NoOp(Llamadas desde el exterior)
exten=>s,n,Dial(SIP/100,20)
exten=>s,n,VoiceMail(100,u)

include=>salientes ;; <<<< MUY MAL! Añadimos el contexto


‘salientes’ dentro del ‘default’

[salientes]
exten=>_1XX,1,Dial(SIP/${EXTEN})
exten=>_9X.,1,Dial(DAHDI/g1/${EXTEN})
exten=>_00X.,1,Dial(SIP/${EXTEN})    ;; <<<<< Esto es lo que hará
que puedan hacer llamadas desde fuera.
De esta manera, nuestro sistema estará completamente
configurado para que cualquier persona pueda llamar a
costa nuestra a donde quiera. 🙁
Ante esto, un consejo… NUNCA utilizar ‘includes’ si no sabemos
exactamente qué estamos haciendo.

Existen muchas otras soluciones para hacer que nuestra


seguridad se refuerce un poco, aunque existe un problema
mayor:
Los usuarios maliciosos incluso se autentifican y registran en
nuestro sistema para hacerse pasar por una extensión con
permisos y poder hacer llamadas como un usuarios normal
y corriente.
Ante esto ¿qué podemos hacer?. Pues está claro que lo
primero es mejorar la seguridad básica:
 La típica extensión 100 con contraseña 100, es tan vulnerable
como no poner ninguna contraseña, por lo que debemos cambiarla
a algo más robusto: algo como eLnsAaLiyÑ100.  (la ñ y la ç son
letras muy útiles para las claves)
 Cuando estos usuarios intentan registrarse desde nuestras
propias cuentas, utilizan un sistema de ‘fuerza bruta‘ para buscar
las contraseñas, así que de poco nos servirá algo como
esto: Usuario 100, contraseña 100100, ya que tan solo van a
necesitar un par de horas de intentos para conseguir registrarse y
empezar a hacer llamadas.
 Evitar a toda costa eso que hacen los interfaces de configurar
todas las extensiones como nat=yes, este parámetro sólo debe estar
para aquellas extensiones que realmente se encuentren detrás de
NAT que realmente son las más vulnerables.

No obstante, durante el curso de Asterisk Advanced


aparecieron varias ideas más entre las que había una que
no me disgustó:
 Comprobar en el log del Asterisk los intentos fallidos de
autenticación y en el caso de varios intentos, añadir de forma
automática en el IPTables la dirección IP de nuestro ‘supuesto’
atacante.

Lo de ‘de forma automática‘ es imprescindible, ya que los


ataques suelen producirse cuando nuestro sistema es más
vulnerable: los fines de semana, de forma que no les
prestemos atención a los logs hasta que el administrador de
sistemas vuelva el lunes, de esta forma los atacantes tienen
varios días para su ataque por fuerza bruta.Así que,
analizando el log y documentándonos un poco vimos que
Asterisk loguea los intentos fallidos de registro SIP como
mensajes de tipo NOTICE (algo que viene por defecto en el
logger.conf y que nos permite monitorizar quien se ha
intentado registrar casi siempre).
A la vista de esta última idea, desarrollamos  un script que,
añadido al crontab, analizaba el archivo ‘messages’ del
Asterisk en busca de intentos fallidos y cuando este número
superase una cantidad considerable, el script añadiría
dicha IP en el IPtables para que el sistema le prohibiese
acceder al puerto 5060/UDP.
El script lo podéis encontrar aquí y para activarlo, tan sólo
tenéis que copiarlo al directorio /usr/local/bin y llamarlo
cada cierto tiempo en el crontab editando el archivo
/etc/crontab y añadiendo una línea como esta:
00 *     * * *    root   /usr/local/bin/sipcheck.pl messages
De esta forma, evitaremos que un atacante pueda conocer
la contraseña de nuestras extensiones que están detrás de
nat y pueda hacer llamadas internacionales a través
nuestra.
Por defecto, el número de intentos fallidos antes de ser
añadido automáticamente al IPTables es de 200,
suficientes para detectar un ataque por fuerza bruta sin que
añada extensiones que han fallado por escribir mal la
contraseña. Este número se puede cambiar dentro del
código.
Las direcciones IP atacantes se añaden al firewall ya
existente, permitiendo «limpiar» estas direcciones con el
parámetro ‘clear‘ sin que afecte al resto de la configuración
del IPTables.
Por supuesto, se le pueden hacer muchas mejoras, pero de
momento, esta primera versión servirá para aquellos que
quieran asegurar su sistema un poco más.
Si te gusta el script y lo quieres mejorar, acuérdate de
enviarme los cambios para que pueda servir a otras
personas (para eso es GPL).
El script lo podeis descargar de aquí: sipcheck
Únicamente nos falta agradecer a los asistentes al curso de Asterisk Advanced Bilbao
2010 por ese BrainStorming antes de quedar para cenar que fomentó hacer el script
que ha conseguido que en algunos sistemas conocidos donde instalé este script para
pruebas, ya haya capturado varias direcciones IP. ;D
6. Explique de que forma se utiliza la base de datos MySQL, la Configuracion de las conexiones
ODB y como se utiliza ODB

1.- Instalamos MySQL


apt-get install mysql-server
2.- Activamos la conexión por red al servidor MySQL
Para ello editamos el fichero de configuración de MySQL (/etc/mysql/my.cnf) y comentamos
la linea "skip networking"
#skip networking
3.- reiniciamos el servidor MySQL
/etc/init.d/mysql stop

/etc/init.d/mysql start
4.- Asignamos passwdord al usuario root de MySQL
mysqladmin -u root password contraseña
5.- Iniciamos una sesión en el servidor, creamos la base de datos TRABAJO y la tabla
CONTACTO (ver apuntes de ayer)
6.- Instalamos los paquetes libmyodbc y unixodbc-dev (reparar en sus dependencias)
7.- Editamos el fichero /etc/odbc.ini (estará en blanco) y le introducimos estas líneas:
[trabajo]
Trace = Off

TraceFile= stderr

Driver = /usr/lib/odbc/libmyodbc.so

DSN = trabajo

SERVER = localhost

USER = root

PASSWORD = contraseña

PORT = 3306

#OPTIONS = 1

#DATABASE= trabajo

#SOCKET = /tmp/mysql.soc

si bien en este ejercicio conectamos como root, lo correcto seria hacerlo como un usuario
determinado de MySQL que tiene determinados privilegios sobre la base de datos TRABAJO.
También es conveniente reparar en que la conexión se hace por el puerto por defecto por el
que responde MySQL. Eso significa que aunque conectemos sobre la localhost, la conexión es
una conexión de red, de ahí que hayamos tenido que habilitar las conexionesde red en el
my.cnf
(Al instalar el paquete libmyodbc, encontraremos en
/usr/share/doc/libmyodbc/exmples un ejemplo del fichero odbc.ini que podemos
utilizar retocándolo con los datos de nuestro servidor MySQL y nuestra base de
datos)
6.- Abrimos un documento de Write (OO) y vamos al menú Herramientas/Fuente de Datos.
Creamos una nueva Fuente de Datos llamada Trabajo. Ponemos como tipo de Fuente de Datos
la opción MySQL

7.- Vamos a la Pestaña MySQL, editamos la URL de Fuente de Datos y comprobamos que nos
aparece el perfil que hemos creado en /etc/odbc.ini que se llamaba [trabajo] . En /etc/odbc.ini
podríamos definir varios perfiles para accesos a múltiples bases de datos
8.- En la Pestaña Tablas comprobamos que hemos accedido a la base de datos TRABAJO y
que se visualiza la tabla CONTACTO
9.- Con el editor de SQL o el Asistente Gráfico diseñamos una Consulta

10.- Ya podemos trabajar sobre la base de datos TRABAJO desde OO

También podría gustarte