Está en la página 1de 83

Qu es Asterisk?

Es software open source

Captulo Bsico #1
Introduccin a Asterisk

Creado por Mark Spencer


Creado como una alternativa a PBX propietarios
Convierte una PC ordinaria en un servidor de
comunicaciones

Es un proyecto, no un modelo ni fabricante


Ante el crecimiento de Asterisk, se funda Digium, que es la
empresa que patrocina el desarrollo de Asterisk

Ing. Christian Cabrera R.

Permite enlazar diferentes medios de comunicacin,


no solamente voz
Introduccin a Asterisk

Uso actual

Versiones de Asterisk

Ms de 1 milln de servidores Asterisk en


produccin hoy en da

Versiones inferiores a 1.8 se consideran obsoletas


Sin soporte oficial. Se recomienda actualizar.

1000+ descargas diarias en cdigo fuente

Asterisk 11 es lo recomendado hoy en da

Mltiples comunidades activas de usuarios


http://voip-info.org
http://asteriskmx.com

Varias distros listas para usarse


Elastix, Trixbox, AsteriskNow, PBX in a Flash

Muchos entornos de uso


Oficinas, callcenters, corporativos, carriers, aplicaciones remotas
Introduccin a Asterisk

Versin

Tipo

Fecha de
lanzamiento

Actualizaciones de
seguridad

Fin de vida

1.4.X

LTS

Dic 2006

Abr 2011

Abr 2013

1.6.2.X

Estndar

Dic 2009

Abr 2011

Abr 2012

1.8.X

LTS

Oct 2010

Oct 2014

Oct 2015

10.X

Estndar

Dic 2011

Dic 2012

Dic 2013

11.X

LTS

Oct 2012

Oct 2016

Oct 2017

12.X

Estndar

Oct 2013

Oct 2014

Oct 2015
Introduccin a Asterisk

Diferencias con un PBX


convencional

Dos tipos de versiones


LTS (Long Term Support)

No se requiere hardware propietario

Permanencia mnima de 5 aos en el mercado


Orientado a estabilidad
Mejor opcin para empresas

Muchos fabricantes ofrecen productos similares


Hardware genrico intercambiable
Diferentes soluciones de diferentes fabricantes
Libre competencia = mejores precios y productos

Estndares

Sigue una arquitectura universal de PC

Dos aos de vida


Orientado a impulsar nuevas funcionalidades
Apta para entusiastas y desarrolladores de nuevas
tecnologas

Procesador, memoria, motherboard y almacenamiento


Es posible instalar Asterisk en una PC (ej. Raspberry Pi)

Free software: tanto libre como gratis


Sin pago de licencias

Introduccin a Asterisk

Diferencias (2)

Introduccin a Asterisk

Escenarios de uso

Totalmente programable y configurable

Hay muchas maneras en las que podemos aprovechar


las caractersticas de Asterisk, entre ellas:

No es necesario solicitar servicios especiales ni


comprar mdulos extras
Todo se hace a travs de software

PBX tradicional
PBX IP
PBX hbrido
Pasarela (Gateway) VoIP
Aumento de funcionalidades
Call center
Plataforma para carriers

Ofrece servicios adicionales de datos


Puede integrarse con cualquier sistema que pueda
correr en una PC con Linux
Bases de datos, consultas web, lectura de archivos, etc.

Puede interactuar con conmutadores existentes


Interconexin a travs de puertos anlogos/digitales
Introduccin a Asterisk

Introduccin a Asterisk

PBX tradicional

PBX VoIP

Introduccin a Asterisk

PBX hbrido

Introduccin a Asterisk

10

Introduccin a Asterisk

12

Pasarela VoIP

Introduccin a Asterisk

11

Aumento de
funcionalidades

Qu es lo que SI es
Asterisk?
Es un SIP registrar
Entidad SIP que mantiene el registro de diferentes
usuarios y de su ubicacin

Es un back-to-back user agent (B2BUA)


Se comporta como un servidor y un telfono de
manera simultnea
Controla una llamada estableciendo comunicacin
individual con cada parte (y luego puentea la
llamada)
Es un cliente multi-sesin, multi-usuario
Convierte la comunicacin entre canales
Introduccin a Asterisk

13

Introduccin a Asterisk

14

Qu es lo que NO es
Asterisk?

B2BUA vs Proxy

No es un SIP proxy

Proxy

Por definicin, un proxy nunca es parte del fin de la


llamada (ej. Voicemail, IVRs, etc)
Un proxy solo hace reenvo de paquetes, manejando las
llamadas en nombre de otros usuarios (Asterisk las procesa
completamente en sealizacin y RTP)

Llamada

No es un sistema plug-and-play
Llamada 1

Podemos crear complejas aplicaciones con l, pero es


necesario configurarlo primero
Y es muy importante practicar para lograrlo!

Llamada 2

Introduccin a Asterisk

15

Introduccin a Asterisk

16

Requisitos de hardware

Requisitos de hardware (2)

Lo ms importante es la estabilidad

Siempre usar hardware de marca (HP, IBM, Dell).


Evitar equipos armados con componentes de dudosa procedencia.
Procurar siempre ofrecer soluciones de redundancia en los
componentes de fallas ms comunes:
Discos duros
Fuentes de poder

Si nuestro sistema es 100% IP, no necesitamos tarjetas


El hardware adicional se usa solamente cuando queremos
conectarnos directamente a la PSTN.

El CPU depende de las tareas a realizar

Adicional a las llamadas, cada nueva accin (grabar, consultar BD,


reproducir audios, etc) reducen la capacidad del sistema

Cualquier PC es buena para pruebas

El procesamiento necesario se mide segn los


requerimientos

Asterisk 1.2 en Celeron 333 Mhz con 32 MB RAM


Es posible usar PCs (ej. Raspberry Pi)

No existe una regla fija de cuanto se necesita.


Lo ms importante es la cantidad de llamadas concurrentes.
Soluciones basadas en ARM son aptas para pequeos entornos.

Espacio en disco dependiente de grabaciones

Cdec * horas de llamada * llamadas simultneas * dias a


permanecer

Pueden usarse entornos virtualizados

Limitados a hardware PSTN externo conectado por IP


Introduccin a Asterisk

17

Requisitos de software

18

DAHDI
Para la interaccin con tarjetas (Digium, Sangoma,
Openvox, etc), Asterisk requiere de las libreras de DAHDI

Preferentemente, Linux nativo


FreeBSD y Mac OS tienen soporte parcial

Digium Asterisk Hardware Device Interface

Asterisk requiere de paquetera adicional:

DAHDI son un conjunto de controladores que le permiten


a Asterisk entenderse con las tarjetas

Recuerda instalar las versiones -devel


GCC
Ncurses
Termcap
Newt
OpenSSL
LibUUID

Introduccin a Asterisk

Esto solo aplica para dispositivos USB y PCI/PCI-e


Para conectar hardware externo se hace a travs de protocolos
como SIP o IAX

En CentOS instalamos estas dependencias con:


yum install -y gcc gcc-c++ ncursesdevel libtermcap-devel openssldevel newt-devel libuuid-devel

En si, DAHDI no es un requisito obligado para Asterisk


Pero se recomienda instalar siempre para tener disponible el
mdulo dahdi_dummy que se usa al crear conferencias con
Meetme y troncales IAX.

En Debian instalamos todas con


apt-get build-dep asterisk
Introduccin a Asterisk

19

Introduccin a Asterisk

20

Libreras extras para


Asterisk

DAHDI (2)
DAHDI tiene su propia lista de dependencias

Cualquier librera que agregue funcionalidades a


Asterisk (ej. openr2 o libsrtp) debe ser instalada antes
de compilar Asterisk.

Principalmente, necesitamos los encabezados de la misma


versin del kernel de Linux que estamos usando
Los headers podemos conseguirlos fcilmente:
En CentOS: yum install kernel-devel
En Debian: apt-get install linux-headers-<versin>

En caso de que Asterisk ya est instalado, tendremos


que repetir el proceso de instalacin para que use las
nuevas libreras.

Si queremos usar enlaces digitales (E1s), necesitamos


ms libreras:

Siempre es posible agregar funcionalidades sobre la


marcha.
Durante el curso tendremos que recompilar Asterisk en
varias ocasiones para aprender a agregar libreras.

libopenr2 si usaremos enlaces con R2 modificado


libpri si usaremos enlaces con ISDN PRI

En nuestra prctica de DAHDI aprenderemos como


compilar estas libreras para su uso
Introduccin a Asterisk

21

Instalando Asterisk

Introduccin a Asterisk

22

Compilando Asterisk
La ltima versin de Asterisk est disponible desde
http://asterisk.org

Tenemos 2 alternativas:
Instalar desde RPMs o DEBs (fcil)
Compilar desde cdigo fuente (difcil)

Los RPMs nos permiten instalar paquetes de manera fcil


y rpida, as como cumplir sus dependencias
Sin embargo, son paquetes pre-hechos, lo que quiere decir que
no es tan fcil personalizarlos

El proceso para compilar es muy parecido al de otros


paquetes de software:
Descargar el paquete (normalmente, con wget, o tambin
podemos copiarlo desde nuestro equipo por SFTP).
Desempaquetar el cdigo fuente (usando tar).
Entrar al directorio ya desempaquetado.
Compilar (normalmente con make)
Instalar

Compilar el cdigo fuente nos da mximo control


Toma ms tiempo, es ms trabajo, ms cosas pueden salir mal,
pero creamos un sistema a la medida

Obviamente, nos iremos por el camino difcil ;-)


Introduccin a Asterisk

El histrico de versiones, parches y otros componentes, se


consigue desde http://downloads.digium.com

23

Introduccin a Asterisk

24

Compilando Asterisk

Algunas notas precautorias


En caso de que ./configure nos arroje errores, quiere
decir que nos faltan dependencias

Dentro del proceso de compilacin hay varios


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

En caso de que make nos arroje errores, probablemente


tengamos dependencias incompatibles

: Revisar dependencias
: Escoger las opciones a compilar
: Compilar cdigo fuente
: Copiar a las carpetas necesarias
: Crear scripts de autoarranque
: Crear ejemplos de configuracin

Nunca debemos ejecutar make samples en un


sistema que ya fue configurado
De lo contrario sobreescribiremos nuestra configuracin
con los archivos de ejemplo

make y make install pueden ejecutarse cuantas veces


necesitemos para compilar nuevas funcionalidades

Al terminar estos comandos habremos dejado


Asterisk instalado

Estos pasos sern repetidos constantemente durante el


curso.

El siguiente paso sera arrancarlo y configurarlo.


Introduccin a Asterisk

25

Iniciando Asterisk

Introduccin a Asterisk

26

Iniciando Asterisk (2)

Hay 2 maneras en las que podemos ejecutar Asterisk:

Para arrancar Asterisk en primer plano:

Como un comando en primer plano


Como un servicio

asterisk vvvc
La v significa verbosidad (ms detalle)

Al ejecutar Asterisk como un comando, la consola se


queda pegada a la sesin del usuario que estemos
ocupando (normalmente root)

Para arrancarlo como servicio


/etc/init.d/asterisk start

Si cerramos nuestra sesin de usuario, Asterisk se cerrar


tambin.
Por esta razn, este mtodo se ocupa solamente cuando
queremos hacer pruebas y debug de nuestro sistema.

Una vez que Asterisk ya est ejecutndose:


Para acceder a la consola lo hacemos con:
asterisk r
Si nos da un error de conexin, arranqumoslo primero
como servicio y reintentemos

Al ejecutarlo como servicio, permanece activo aunque


nuestra sesin se cierre
Asterisk sigue corriendo en segundo plano.

Introduccin a Asterisk

27

Introduccin a Asterisk

28

Deteniendo Asterisk

Reiniciando Asterisk

Para detener el servicio completo (desde el CLI):

Solo hay que cambiar stop/start por restart:

/etc/init.d/asterisk stop

/etc/init.d/asterisk restart
*CLI> core restart now

Desde adentro del CLI de Asterisk


*CLI> core stop now

En varias ocasiones se nos pedir reiniciar el servicio


de Asterisk

Matando el proceso (desde el CLI)


Usar como ltimo recurso:
ps eF | grep asterisk
kill -9 <PID de Asterisk>

Es conveniente familiarizarse con los comandos.

Introduccin a Asterisk

29

Introduccin a Asterisk

30

Configurando Asterisk

Prctica 1.1

La manera ms simple de configurar Asterisk es a


travs de archivos de texto
En modalidades ms avanzadas podemos usar el CLI, el AMI
o bases de datos
Veremos todo eso ms adelante

Los archivos se ubican en /etc/asterisk


Instalacin de Asterisk

Tienen extensin *.conf


Sintaxis muy similar a archivos *.ini

Introduccin a Asterisk

32

Archivos de configuracin

asterisk.conf

Hay muchos, pero estos son los ms importantes:

Archivo maestro de configuracin


Le indica a Asterisk donde buscar o crear otros archivos

Archivo

Funcin

asterisk.conf

Configuraciones que afectan a todo el sistema:

Especifica las rutas default y ajusta opciones generales


de todo el conmutador

Lmite de llamadas en general


Estructura de archivos de sonido
Nombre de este equipo (en caso de tener ms de uno)

extensions.conf Controla las reglas del plan de llamadas


sip.conf Todo lo relacionado al protocolo SIP

Raramente necesita ser editado

iax.conf Igual que el anterior, pero para IAX2

Se recomienda mucho colocar verbose=3 para subir la


verbosidad del sistema por default

chan_dahdi.conf Configura las tarjetas DAHDI

Introduccin a Asterisk

33

sip.conf

Introduccin a Asterisk

34

iax.conf

Configuracin del canal SIP

Configura lo relacionado al canal IAX2

El archivo de muestra viene lleno de ejemplos

Igual que con SIP, configura valores generales e


individuales para usuarios

2 tipos de configuraciones

Se definen conexiones con dispositivos IAX as como


con troncales IAX

Campos que afectan a todos los usuarios


Campos que afectan de manera individual a cada usuario

Se ver ms a detalle en el mdulo intermedio

Aqu se configuran tanto telfonos SIP como


proveedores (troncales) SIP
No confundir usuarios SIP con extensiones
Las extensiones se declaran en el extensions.conf
Introduccin a Asterisk

35

Introduccin a Asterisk

36

chan_dahdi.conf

extensions.conf
Aqu se define el plan de llamadas

Toda la tarjetera se configura aqu:

Los permisos a los que cada usuario tiene derecho para


marcar (clases de servicio)
Se construye por contextos, extensiones, prioridades y
aplicaciones

Enlaces digitales (E1s)


Troncales anlogas (FXO)
Extensiones anlogas (FXS)

Requiere de la configuracin equivalente dentro del


/etc/dahdi/system.conf

Los archivos de SIP e IAX controlan quien puede


acceder a l
El archivo de extensiones controla que es lo que ese
alguien puede hacer

Dedicaremos un captulo a explicar esto

Se ver ms a detalle adelante

Similar a un archivo de programacin


La mayora del curso se centra en este archivo
Introduccin a Asterisk

37

Introduccin a Asterisk

En resumen
Asterisk fue escrito por Mark Spencer

Captulo Bsico #2
Configuracin de Asterisk

Una alternativa open source a conmutadores cerrados.

Corre en cualquier distro de Linux


Siempre y cuando, cumplamos sus dependencias

No es un proxy, es un B2BUA
Acta como un telfono y un servidor al mismo tiempo

Necesitamos cumplir dependencias para instalar Asterisk


Muy recomendado instalar DAHDI
Los archivos de configuracin se guardan en /etc/asterisk
Introduccin a Asterisk

39

Ing. Christian Cabrera R.

38

Introduccin

Sintaxis de archivos *.conf

La configuracin inicial de Asterisk es a travs de


archivos de texto

Son similares a un archivo *.ini


Se contruye a partir de un encabezado y varios campos

Conforme avancemos en el curso veremos mtodos ms


complejos

El contexto determina el nombre de la seccin en la


que estamos trabajando

Todos los archivos pueden ser modificados


directamente desde la consola

Los campos especifican los detalles de configuracin

Estructura base:

nano, pico, emacs, vi, vim, cualquier editor nos sirve

[contexto]
campo1=valor1
campo2=valor2

Configuracin de Asterisk

; <-- Este es el contexto


; <-- Estos son los campos

41

Comentarios

Configuracin de Asterisk

42

Ejemplo de sintaxis

Los archivos de configuracin en Linux tienen


comenarios que se especifican con el smbolo #

Archivo res_mysql.conf

Sin embargo, los de Asterisk reciben comentarios con el ;


(punto y coma)
Todo lo que est a la derecha del ; ser ignorado

Tambin podemos declarar comentarios multilnea:


Usamos los tags de ;-- y --;

Ejemplo
;--- Todo esto
es un
comentario ---;
Configuracin de Asterisk

43

Configuracin de Asterisk

44

Inclusin de archivos

Inclusin de archivos (2)

Si un archivo es muy grande, puede resultar difcil de


administrar

Tambin es posible incluir configuracin a partir de


la ejecucin de scripts usando #exec.

Podemos separar el contenido en archivos ms pequeos


Esta idea es muy usada por interfases como FreePBX

Todo lo que el comando imprimira a pantalla, es


interpretado como cdigo de configuracin por Asterisk

Ejemplo:

Sintaxis:

#exec /bin/database_config.sh

#include mi_otro_archivo.conf

Ejemplo:
sip.conf

[general]
#include sip_general_custom.conf
#include sip_general_additional.conf

Esto puede usarse para generar la configuracin


desde un sistema externo (ej. base de datos)
Considerar que esto puede afectar el rendimiento
Sin embargo, nos da mucha flexibilidad

; Aqu comienza la configuracin de usuarios


#include sip_custom.conf
#include sip_additional.conf
Configuracin de Asterisk

45

Configuracin de Asterisk

46

Usuarios SIP/IAX <>


extensiones

Contextos
Son secciones que identifican un grupo de campos

Usuario SIP/IAX no es igual a extensin


Confusin creada por distribuciones como Elastix/Trixbox.
Un usuario se refiere al dispositivo que se conectar con
Asterisk (archivo sip.conf/iax.conf).
Las extensiones representan lo que se puede marcar
(archivo extensions.conf).

Se les identifica por escribirse entre [ ]


Segn el archivo en que se ocupe, el [contexto] puede
significar algo diferente
sip.conf: Un usuario SIP
extensions.conf: Un grupo de extensiones
voicemail.conf: Un conjunto de buzones de voz

El campo context define los derechos de marcacin


de un usuario SIP

Un [contexto] permanece abierto hasta que se


encuentre con otro [contexto]
Al abrir un nuevo contexto hay que cuidar no romper los ya
existentes
Configuracin de Asterisk

47

Configuracin de Asterisk

48

Dejando en claro la
diferencia

sip.conf

El telfono requiere del sip.conf para autenticarse

Aqu se define todo lo relacionado con SIP

El usuario requiere de las reglas del extensions.conf


para poder marcar

Configuracin de usuarios y troncales

Tiene 2 secciones: [general] y rea de usuarios


[general] contiene valores que afectan a todos los
usuarios, as como al canal SIP mismo. Es la configuracin
default.
El rea de usuarios define la configuracin especfica de
cada usuario.

En caso de que el mismo campo est configurado en


ambas secciones, la individual gana
Cualquier dato que no exista, se tomar su valor default.

Fuente: Asterisk The Definitive Guide

Empezaremos por la configuracin del sip.conf


Configuracin de Asterisk

49

Configuracin de Asterisk

sip.conf (2)

Campos bsicos

Hay muchos campos diferentes que podemos configurar


para cada usuario SIP

Valores
posibles

Funcin

type

user,
peer
o friend

Controla las llamadas que hace/recibe, as como


interpretar la autenticacin del dispositivo
user: Se autentica por username. Solo puede
hacer llamadas hacia Asterisk
peer: Se autentica por direccin IP y puerto.
friend: Combinacin de ambas

host

<direccin IP>
o dynamic

Especifica si el equipo (el telfono) tiene una IP


fija o si puede tomar cualquiera (dinmica).
Tambin indica si el telfono tiene que
registrarse hacia Asterisk o no.

context

<nombre del
contexto>

Determina el contexto (el conjunto de reglas de


marcacin) al que podr acceder el usuario.

secret

<contrasea>

Especifica la contrasea para el usuario

Campo

Hay ms de 30, y la lista crece en cada versin nueva de Asterisk.

Para dar de alta un usuario SIP existen 3 campos


obligatorios:

50

type
host
context
El nombre del usuario es lo que aparece como el [encabezado]

Cualquier campo no especificado se usar su valor


default
Configuracin de Asterisk

51

Configuracin de Asterisk

52

Algunos campos
adicionales

Ejemplos de usuarios SIP

Algunos campos adicionales por usuario:


Campo

Valores posibles

allow /
disallow

<cdec>

language

<cdigo de idioma>

dtmfmode

auto, inband,
rfc2833

mailbox

<buzn>@
<contexto>

permit
/deny

<Direccin IP>
/<Mscara>

Bsico

Avanzado

Seguro

[usuario1]
context=agentes
type=friend
host=dynamic

[usuario2]
context=supervisor
type=peer
host=192.168.1.34
secret=abcde12345
dtmfmode=auto
disallow=all
allow=g729
language=es
mailbox=200@default

[usuario2]
context=supervisor
type=friend
host=dynamic
secret=JuK!23+c9
deny=0.0.0.0/0
permit=192.168.1.0/24

Funcin
Habilita o deshabilita el uso de ciertos
cdecs
Permite cambiar el lenguaje default de este
usuario
Determina como se enviarn los cdigos
DTMF
Hace que el telfono consulte el buzn de
voz por nuevos mensajes
Limita el registro a dispositivos cuya IP
coincida con la indicada aqu.
El orden de deny/permit es importante.

Esto permite que un


telfono se registre
hacia Asterisk sin
contrasea

Para conocer todos los campos, consultar los comentarios del archivo
muestra sip.conf
Configuracin de Asterisk

53

Esto limita a una


contrasea ms
segura y obliga a que
tenga que tener una
IP local
Configuracin de Asterisk

Control de nombres

54

Control de nombres (2)

Debemos llevar un control de nombre de los


dispositivos
Evitar que se repitan
Dar seguridad
Facilitar la administracin

Diferentes esquemas de nombrado de dispositivos


tiene sus propias ventajas y desventajas
Debemos decidir cual se adapta mejor a nuestras
necesidades

Configuracin de Asterisk

El usuario tiene ms
argumentos
configurados

Mtodo

Ejemplo

Extensiones

101
201
320

Personas/
Ubicaciones

jortiz
sala_juntas

Direcciones
MAC

00121419AEFF

Contraseas

tel-aJ13K74

Seguridad
Baja
fciles de adivinar

Difcil
Cambiar equipos sin cambiar
extensin

Fcil de
recordar
Muy Fcil
Dgitos simples

Difcil
Media

Alta
Difcil de adivinar

Mxima

55

Crear/cambiar
usuarios

Virtualmente
imposible de
adivinar

Imaginar casos donde el


mismo usuario tiene 2
dispositivos, o 2 personas se
llaman igual en la compaa

Sencillo
Nuevos dispositivos tienen
nuevas MAC

Sencillo
Es muy simple crear nuevas
entradas aleatoriamente

Muy Fcil
Nombres sencillos

Difcil

Muy difcil

Configuracin de Asterisk

56

Un poco ms de seguridad
Adicional al campo secret,
siempre que sea posible
debemos utilizar el permit
y deny.
Solo en aquellos usuarios
externos dinmicos no ser
posible aplicarlo

El orden es importante

Lo comn es negar todo y


luego permitir lo que
queremos

Podemos usar
nomenclatura estndar
(/255.255.255.0) o
abreviada (/24)

Plantillas
Es posible crear plantillas
de usuarios

[juan]
type=friend
context=agentes
host=dynamic
deny=0.0.0.0/0
permit=192.168.5.1/24
[carrier]
type=peer
contect=from-trunk
host=201.194.200.9
deny=0.0.0.0/0.0.0.0
permit=201.194.200.9/255.255.255.255

Configuracin de Asterisk

57

Los campos comunes se


aplican una nica vez y de ah
se reutilizan las veces que
sean necesarias
Ahorro de cdigo al no tener
que redeclarar valores

Se declaran con (!)


Es posible aplicar mltiples
plantillas al mismo tiempo

[usuario](!)
type=friend
context=micontexto
host=dynamic
[local](usuario,!)
nat=no
deny=0.0.0.0/0
permit=10.1.1.2/24
[100](usuario)
secret=55tDyXID
[200](local)
secret=32nAc5Tt
Configuracin de Asterisk

Ejemplo general sip.conf


[general]
disallow=all
allow=alaw

; Negamos todos los codecs a todos


; y solo permitimos alaw

[usuarios](!)
host=dynamic
type=friend
context=micontexto
deny=0.0.0.0/0
permit=192.168.1.0/24

; Creamos una plantilla para


; homologar nuestros usuarios

[usuario1](usuarios)
secret=abcde12345

; Invocamos la plantilla y solo


; declaramos la contrasea

[usuario2](usuarios)
secret=fghij9876

; Mismo caso. Podemos repetir cuantas


; veces queramos

[micarrier]
username=ccabrera
secret=$uYjOpa2!
context=from-trunk
type=peer

; Una troncal SIP para enviar llamadas


; No podemos reaprovechar la plantilla
; porque los campos son muy diferentes

#include sip_extra.conf ; Podemos tener la configuracin en ms


; distribuida en varios archivos
Configuracin de Asterisk

Prctica 2.1
Creacin de usuarios SIP y
configuracin de softphone

59

58

Plan de marcacin
Se define en el archivo extensions.conf
Contiene 3 secciones:

Prctica 2.2

[general]
[globals]
rea de contextos

[general] configura el manejo del archivo de


extensiones (comnmente no se altera)
[globals] define constantes que pueden ser
referenciadas desde cualquier parte del dialplan

Configurar un telfono IP

El rea de contextos declara los diferentes contextos que


definen el plan de llamadas
Configuracin de Asterisk

62

Ejemplo de extensiones
vlidas

Sintaxis
La sintaxis general del plan de llamadas es:

exten => 123,1,Answer


exten => 123,2,Wait(5)
exten => 123,3,Hangup

[contexto]
exten => <extensin>,<prioridad>,<aplicacin>

<extensin> es cualquier valor alfanumrico


<prioridad> es el orden con el que se ejecutarn las
diversas aplicaciones
<aplicacin> es el comando a ejecutar

Configuracin de Asterisk

63

exten => hola,1,Noop(nada)


exten => hola,2,Playback(welcome)
exten => hola,3,Dial(SIP/100)
exten => 5546144330,1,Wait(3)
same => 2,Dial(DAHDI/g0/${EXTEN})
same => 3,Hangup

*1.6.2+
Notar el uso de
same => para
abreviar extensiones
Configuracin de Asterisk

64

Extensiones especiales

Extensin s (start)
GDL

MEX
Extensin Significado

Funcin

timeout

Extensin que llega al no ingresar dgitos dentro


del tiempo establecido

absolute
timeout

Se activa automticamente cuando la llamada


cumple con la duracin especificada por
${TIMEOUT(absolute)}

hangup

Activada al colgar un canal

invalid

Activada al teclear una extensin que no existe


en el contexto

a,o

operator

Utilizadas para escapar de un Voicemail al


presionar * o cero al momento de escuchar la
bienvenida

start

Llamada hacia
SIP/GDL/101
Llamada hacia
SIP/GDL ?

Extensin default de entrada


Configuracin de Asterisk

101
65

101
Configuracin de Asterisk

Prioridades

66

Ejemplos de prioridades
Extensin escrita en desorden pero numerada

Determinan el orden de ejecucin de los comandos


de una extension

exten => 100,3,Hangup


exten => 100,1,Noop
exten => 100,2,Answer

Siempre deben comenzar con 1, de lo contrario Asterisk


invalidar toda la extensin
El orden debe ser consecutivo

La misma extensin escrita con prioridad n

Al numerarlas, pueden ser escritas en cualquier orden


Asterisk las ordenar en memoria

exten => 100,1,Noop


exten => 100,n,Answer
exten => 100,n,Hangup

O bien:
exten => 100,1,Noop
same => n,Answer
same => n,Hangup

El uso de la prioridad n (next) facilita la escritura


Facilita hacer inserciones o cambios

Usar n es ms fcil al no tener que renumerar


Configuracin de Asterisk

67

Configuracin de Asterisk

68

Prioridades (2)
Para diferenciar una prioridad de otra, la prioridad n
puede contener etiquetas:

Prctica 2.3

[default]
exten => 100,1,Answer
same => n,Wait(2)
same => n(bienvenida),Playback(welcome)
same => n,Hangup

La referencia a estas etiquetas se puede hacer


mediante un Goto

Plan de llamadas sencillo

exten => 100,n,Goto(default,100,bienvenida)

Esto nos permite controlar el flujo de nuestro plan de


marcacin
Configuracin de Asterisk

69

Plan de llamadas

Patrones
No es posible definir todas las posibles extensiones

Usuarios SIP

Los patrones son caracteres especiales que reemplazan un rango de


dgitos:
Patrn

micontexto

Dgitos que reemplaza

Dgitos entre 0 y 9

Dgitos entre 1 y 9

Dgitos entre 2 y 9

[x-y]
.

Cualquier dgito comprendido en el rango


uno o ms dgitos cualesquiera

Todos los patrones deben ser precedidos por _ para no ser


descartados al momento de marcarlos
Configuracin de Asterisk

71

Configuracin de Asterisk

72

Ejemplos
Patrn
_0133ZXXXXXXX
_0181ZXXXXXXX
_0155ZXXXXXXX
_01NXXZXXXXXX
_01900XXXXXXX
_ZXXXXXXX
_ZXXXXX00
_0[347]0
_9.
_1XZ

Patrones (3)
En caso de que ms de un patrn coincida, Asterisk los
ordena del ms especfico al ms general:

Dgitos que reemplaza


Llamadas de LDN hacia MGM
Llamadas de LDN a provincia
Llamadas a 01900
Llamadas locales
Llamadas locales que terminen en 00
Servicios 030, 040 y 070
Todo lo prefijado por 9
Extensiones 101-199, excepto 100, 110, 120, etc.
Configuracin de Asterisk

1.
2.
3.
4.
5.
6.

Por lo que si marcamos un nmero 019001234567:


_01NXXXXXXXXX
_01900XXXXXXX
Siempre coincide primero el 01900 por ser el ms especfico

Considerar esto al momento de permitir/negar patrones

73

Configuracin de Asterisk

Atencin especial a los


patrones

74

Variables
Mismo concepto que en un lenguaje de programacin

[largadistancia]
exten => _01ZXXXXXXXXX,1,Noop(Llamada de LD)
same => n,Dial(SIP/carrier/${EXTEN})

Son etiquetas que hacen referencia a un valor


Podemos extraer el valor en cualquier momento

Hay 4 tipos de variables

exten => _01900ZXXXXXX,1,Noop(No permitir llamada)

Si marcramos hacia 019001234567,


la llamada pasara o se colgara?
R: La llamada pasara
Si bien no hay un Dial explcito que la deje salir, al no colgarse la
llamada coincide con el patrn _01ZXXXXXXXXX prioridad 2.
Siempre colgar la llamada cuando no deba continuar.
Configuracin de Asterisk

Nmeros/letras (1 nica coincidencia)


Rangos [ ] (coincidencias de 1 a 7 dgitos)
N (8 coincidencias)
Z (9 coincidencias)
X (10 coincidencias)
. (infinitas coincidencias)

75

Globales
De canal (definidas por el usuario o pre-definidas)
De entorno
Heredadas

Se declaran conforme al tipo de variable


Se identifican por los smbolos ${ }
El ${ } solo se usa al invocar, no al guardar el valor
Configuracin de Asterisk

76

Variables globales

Variables de canal

Se declaran en la seccin [globals] del archivo


extensions.conf

Asociadas con una nica instancia (copia) del canal


Diferentes copias del canal no cruzan sus variables
Al colgar un canal, se destruyen las variables asociadas con l

[globals]
celular=0445512345678

Se declaran con la aplicacin Set


exten => s,1,Set(MIVAR=hola)

[micontexto]
exten => 911,1,Dial(DAHDI/g0/${celular})

Hay algunas variables pre-definidas por el sistema:

Si se actualiza el archivo, todas las referencias a la


variable cambian

Disponibles desde todos los canales


Es global porque puede accederse desde cualquier lado
Configuracin de Asterisk

${CONTEXT}:
el contexto actual
${EXTEN}:
la extensin actual (marcada)
${PRIORITY}: la prioridad de procesamiento actual
${DIALSTATUS}: el estado del ltimo comando Dial ejecutado

77

Configuracin de Asterisk

Variables de entorno

78

Variables heredadas

Variables de Linux que se pueden acceder desde


Asterisk

Heredadas

Se acceden con la funcin ${ENV(variable)}

Heredadas indefinidamente

Llevan un guin bajo _


Solo estn disponibles para el primer canal creado por el canal padre
Llevan dos guiones bajos __
Disponibles para todos los canales generados por el padre

Ejemplo:
exten => 123,1,Noop(El path de Linux es ${ENV(PATH)})

[micontexto]
exten => 100,1,Set(VAR1=1)
same => n,Set(_VAR2=2)
same => n,Set(__VAR3=3)
same => n,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3})
same => n,Dial(Local/nivel1@micontexto)
exten => nivel1,1,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3})
; Var1 dar vaco, Var2 dar 2 y Var3 dar 3
same => n,Dial(Local/nivel2@micontexto)

Configuracin de Asterisk

79

exten => nivel2,1,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3})


; Var1 dar vaco, Var2 dar vaco y Var3 dar 3
Configuracin de Asterisk

80

Manipulando variables
Se usa la sintaxis:
${<nombre variable>[:<offset>:[<cantidad>]]}
Ejemplo
${MIVAR}
= holamundo
= amundo
${MIVAR:3}
${MIVAR:-5}
= mundo
${MIVAR:3:2}
= am
Cmo nos quedaramos solo con 'hola'?

Prctica 2.4
Uso de patrones y variables

til para reformatear nmeros:


Noop(${EXTEN})
Set(EXTEN=52${EXTEN:2})
Noop(${EXTEN})

;015546144330
;525546144330
Configuracin de Asterisk

81

Contextos de extensin
Considerar cada contexto
como un grupo de
permisos nico

Reutilizar contextos
declarados previamente
Pueden incluirse contextos
dentro de otros

Contextos de extensin (2)

[nivel3]
Celulares

Notar lo siguiente:
[internas]
exten => _ZXXX,1,Dial(SIP/${EXTEN})
[locales]
include => internas
exten => _ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})

[nivel2]
LDN

[largadistancia]
include => locales
exten => _01ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
exten => _ZXXXXXXX,1,Hangup

[nivel1]
Locales

Al marcar 50181181 dentro de [largadistancia] obtendremos


siempre un hangup, a pesar que en [locales] se permite
Contexto principal siempre tiene preferencia sobre contextos incluidos

Configuracin de Asterisk

83

Configuracin de Asterisk

84

Contextos de extensin (3)


Pueden incluirse contextos basados en tiempo

Prioridades de ejecucin
Exten vs. Exten
Gana el que tenga el patrn de marcacin ms especfico

Sintaxis:

Exten vs. Include

include => contexto,<hora>,<dia>,<dia mes>,<mes>

Siempre gana el exten

Ejemplo:

Include vs. Include


Gana el que est declarado primero

[micontexto]
include => gratis,21:00-23:59,mon-fri,*,*
include => gratis,*,sat-sun,*,*

Es recomendable incluir primero lo ms especfico y


al ltimo lo ms general
Configuracin de Asterisk

85

Evaluador

Configuracin de Asterisk

86

Funciones
Permiten procesar valores o datos que normalmente
no estaran accesibles:

Podemos evaluar una operacin lgica o aritmtica


usando $[ ]
Ejemplo:

exten => s,1,Noop(${MD5(${MI_CLAVE_SECRETA})})

exten => s,1,Set(MiValor=$[10/2])


;5
same => n,Noop(${MiValor})

Se despliegan con el comando


core show functions
desde el *CLI

Esto puede usarse para hacer reemplazos o evaluar


condicionales
Asterisk no evala operaciones por default

Se escriben completamente en maysculas

Operadores vlidos

Se acceden como si fueran variables ${FUNC()}


No perder de vista el orden de los { ( ) }

+, -, *, /, %, >, >=, <, <=, =, !=, &, |, ~


Configuracin de Asterisk

87

Configuracin de Asterisk

88

Funciones (2)

Subrutinas

Algunas funciones guardan valores, otras slo los


despliegan

Conjuntos de acciones agrupadas que reciben parmetros


Hechas por el usuario
tiles para procesos repetitivos con cambios entre invocaciones

Ejemplo: LEN() regresa la longitud de una cadena


Set(MIVAR=hola mundo)
Noop(${LEN(${MIVAR})})

Reemplazan el concepto de macros de versiones


anteriores de Asterisk

; 10

Las subrutinas no tienen lmite de anidamiento

Ejemplo: CALLERID(num) permite cambiar o mostrar


el caller id

Al ejecutar una subrutina, se brinca hacia el contextoextensin-prioridad que la subrutina indique

Set(CALLERID(num)=5544332211)
Noop(El valor es ${CALLERID(num)})

Es necesario agretar un Return() para regresar al punto desde el


que se invoc a la subrutina.

Configuracin de Asterisk

89

Configuracin de Asterisk

90

Ejemplo de una subrutina

Subrutinas (2)
Cuando se invoca una subrutina, se pueden
proporcionar argumentos

[sub-llamada]
exten => s,1,Answer
same => n,Dial(${ARG1},20)
same => n,Voicemail(${ARG2})
same => n,Hangup
same => n,Return

Se usan para personalizar la subrutina


Se crean automticamente en las variables
${ARG1}, ${ARG2}, ${ARG3}, etc

Cada subrutina tiene variables individuales

Este es el cdigo que


declara la subrutina.
No sirve de nada hasta
que no la invoquemos

[default]
exten => 100,1,Gosub(sub-llamada,s,1(SIP/chris,${EXTEN}))
exten => 110,1,Gosub(sub-llamada,s,1(SIP/juan,${EXTEN}))
exten => 120,1,Gosub(sub-llamada,s,1(SIP/carlos,${EXTEN}))

Los argumentos no se mezclan entre si

Se invocan con la aplicacin Gosub


Gosub(<contexto>,<extensin>,<prioridad>([argumentos]))

De esta manera, pueden alterarse todas las acciones modificando


solamente la subrutina

Cualquier extensin puede convertirse en subrutina


Configuracin de Asterisk

;
;
;
;

En este ejemplo el Return sobra porque de cualquier manera, la llamada se


cuelga antes de llegar a l.
91

Configuracin de Asterisk

92

En resumen
Cada archivo en Asterisk tiene una labor especfica
Usuarios SIP en sip.conf
Plan de llamadas en extensions.conf

Prctica 2.5

Cada extensin debe tener una prioridad y aplicacin para


ejecutarse
No repetir extensiones/prioridades

Los patrones nos ahorran extensiones

Muchas extensiones coinciden con una sola lnea

Subrutinas e inclusiones

Las variables almacenan valores que podemos reutilizar


Podemos agrupar tareas usando subrutinas

E invocarlas las veces que sean necesarias cambiando solo los


argumentos
Configuracin de Asterisk

93

Plan de llamadas

Captulo Bsico #3
Arquitectura de Asterisk

Usuarios SIP
llamada

micontexto

internas

Ing. Christian Cabrera R.

adicional

Configuracin de Asterisk

95

Antecedentes

Sistema de archivos

Los mdulos de
Asterisk se
configuran de
manera
independiente

Asterisk coloca sus archivos en diferentes carpetas:


Tipo de archivo

Ubicacin

Configuracin /etc/asterisk
Mdulos /usr/lib/asterisk/modules

Alto nivel de
control

Logs /var/log/asterisk
AGIs /var/lib/asterisk/agi-bin

En el ncleo,
Asterisk solo es
un conmutador

Sonidos /var/lib/asterisk/sounds
Voicemail /var/spool/asterisk/voicemail
Grabaciones /var/spool/asterisk/monitor

Ajeno a cualquier
tecnologa

Salida de llamadas /var/spool/asterisk/outgoing


Fuente: wiki.asterisk.org
Arquitectura de Asterisk

97

Ncleo de Asterisk

98

Arquitectura de Asterisk

Haciendo crecer a Asterisk


Para agregar/quitar funcionalidades, controlamos los
mdulos que Asterisk carga
Editando /etc/asterisk/modules.conf limitamos cuales
mdulos sern cargados

Responsable de
Administrar mdulos
Carga de configuracin
Sincrona del sistema
Manejo de canales
Control del plan de
llamadas

Ajeno a cualquier tecnologa

Podemos hacer crecer a Asterisk


agregando el mdulo que le
brinde las nuevas
funcionalidades

Provee las interfaces de


configuracin y control del
sistema

Tenemos 4 clases principales de mdulos:


Canales
Cdecs
Aplicaciones/funciones
Recursos adicionales

AMI, AGI, CLI

Arquitectura de Asterisk

99

Arquitectura de Asterisk

100

Lista de mdulos
app_adsiprog.so
app_alarmreceiver.so
app_amd.so
app_authenticate.so
app_cdr.so
app_celgenuserevent.so
app_chanisavail.so
app_channelredirect.so
app_chanspy.so
app_confbridge.so
app_controlplayback.so
app_dahdiras.so
app_db.so
app_dial.so
app_dictate.so
app_directed_pickup.so
app_directory.so
app_disa.so
app_dumpchan.so
app_echo.so
app_exec.so
app_externalivr.so
app_festival.so
app_flash.so
app_followme.so
app_forkcdr.so
app_getcpeid.so
app_ices.so
app_image.so
app_macro.so
app_milliwatt.so
app_minivm.so
app_mixmonitor.so
app_morsecode.so
app_mp3.so
app_nbscat.so

app_originate.so
app_page.so
app_parkandannounce.so
app_playback.so
app_playtones.so
app_privacy.so
app_queue.so
app_readexten.so
app_read.so
app_record.so
app_sayunixtime.so
app_senddtmf.so
app_sendtext.so
app_sms.so
app_softhangup.so
app_speech_utils.so
app_stack.so
app_system.so
app_talkdetect.so
app_test.so
app_transfer.so
app_url.so
app_userevent.so
app_verbose.so
app_voicemail.so
app_waitforring.so
app_waitforsilence.so
app_waituntil.so
app_while.so
app_zapateller.so
bridge_builtin_features.so
bridge_multiplexed.so
bridge_simple.so
bridge_softmix.so
cdr_custom.so
cdr_manager.so

cdr_syslog.so
chan_agent.so
chan_bridge.so
chan_dahdi.so
chan_iax2.so
chan_local.so
chan_multicast_rtp.so
chan_sip.so
codec_adpcm.so
codec_alaw.so
codec_a_mu.so
codec_dahdi.so
codec_g722.so
codec_g726.so
codec_g729.so
codec_gsm.so
codec_ilbc.so
codec_lpc10.so
codec_resample.so
codec_ulaw.so
format_g719.so
format_g723.so
format_g726.so
format_g729.so
format_gsm.so
format_h263.so
format_h264.so
format_ilbc.so
format_jpeg.so
format_pcm.so
format_siren14.so
format_siren7.so
format_sln.so
format_vox.so
format_wav_gsm.so
format_wav.so

Mdulos: Canales

func_aes.so
func_audiohookinherit.so
func_base64.so
func_blacklist.so
func_callcompletion.so
func_callerid.so
func_cdr.so
func_channel.so
func_config.so
func_cut.so
func_db.so
func_devstate.so
func_dialgroup.so
func_dialplan.so
func_enum.so
func_env.so
func_extstate.so
func_frame_trace.so
func_global.so
func_groupcount.so
func_hangupcause.so
func_iconv.so
func_jitterbuffer.so
func_lock.so
func_logic.so
func_math.so
func_md5.so
func_module.so
func_pitchshift.so
func_presencestate.so
func_rand.so
func_realtime.so
func_sha1.so
func_shell.so
func_sprintf.so
func_srv.so

func_strings.so
func_sysinfo.so
func_timeout.so
func_uri.so
func_version.so
func_vmcount.so
func_volume.so
pbx_ael.so
pbx_config.so
pbx_loopback.so
pbx_realtime.so
pbx_spool.so
res_adsi.so
res_ael_share.so
res_agi.so
res_calendar.so
res_clialiases.so
res_clioriginate.so
res_config_sqlite3.so
res_convert.so
res_crypto.so
res_fax.so
res_format_attr_celt.so
res_format_attr_h263.so
res_format_attr_h264.so
res_format_attr_silk.so
res_limit.so
res_monitor.so
res_musiconhold.so
res_mutestream.so
res_realtime.so
res_rtp_multicast.so
res_security_log.so
res_smdi.so
res_speech.so
res_stun_monitor.so

Arquitectura de Asterisk

Asterisk puede interactuar con cualquier medio para


el cual tenga un canal para comunicarse
SIP, IAX2, H323, DAHDI, Local, Unicall, etc

Cada canal es responsable de manejar su propia


lgica y memoria
El funcionamiento de un canal no afecta a los dems

Algunos canales representan un protocolo (ej. SIP),


mientras que otros solo siguen argumentos lgicos
(ej. Local)

101

Arquitectura de Asterisk

Mdulos: Aplicaciones

102

Mdulos: Aplicaciones (2)

Ejecutan acciones durante una llamada

Algunas aplicaciones:
Aplicacin

Se cargan dinmicamente conforme se necesitan

Accin

Dial Marca hacia la tecnologa/canal especificado

Ejecutadas sncronamente

Wait Espera x segundos

Se invoca la aplicacin al momento en que se le manda llamar,


sin que previamente est corriendo

Podemos aumentar la serie de comandos que Asterisk


puede ejecutar en cada llamada

Goto Brinca hacia la prioridad especificada


GotoIf Brinca condicionalmente
Macro Permite agrupar ms aplicaciones y repetirlas
AGI Invoca un AGI script externo

Asterisk carga 180+ aplicaciones al momento de arrancar el


sistema

Playback Reproduce un archivo de sonido


Background Igual que Playback, pero permite ingresar DTMFs

Pueden consultarlas usando

Read Pide dgitos al usuario y los almacena en una variable

*CLI> core show applications

Hangup Cuelga la llamada


Set Guarda un valor en una variable
Arquitectura de Asterisk

103

Arquitectura de Asterisk

104

Mdulos: Recursos

Asterisk CLI

Integran a Asterisk con recursos externos

La interfaz humano-Asterisk

Bases de datos
Calendarios
Msica en espera
Monitoreo (grabacin)

Nuestra principal herramienta de control en el curso

Le permite al administrador:
Consultar el estado del sistema
Recargar o reiniciar el sistema
Actualizar valores en tiempo real
Desplegar ayuda
Hacer debug

Se cargan de manera esttica


Requieren una recarga de mdulo al modificarse

Pueden operar simultneamente en varios canales

Mdulos pueden agregar comandos al *CLI

Cada canal recibe lo mismo que los otros

Ej. sip show peers depende del mdulo chan_sip.so


Arquitectura de Asterisk

105

AGI: Asterisk Gateway


Interface

Arquitectura de Asterisk

106

AMI: Asterisk Manager


Interface

Ejecuta scripts externos a Asterisk

A diferencia del CLI, esta es una interfaz computadoraAsterisk

Escritos en diferentes lenguajes

Permite ejecutar comandos o monitorear al sistema

Perl, PHP, Python, Bash, etc

Al igual que el CLI, algunos mdulos agregan


comandos

Permite que Asterisk sea una puerta de enlace


(gateway) entre un telfono y una aplicacin notelefonica

Usada por aplicaciones como el FOP, popups de


agente para callcenter, sistemas de click-to-call, etc

Encuestas, IVRs, juegos, etc

Se ver ms a detalle en un captulo propio


Arquitectura de Asterisk

Se ver ms a detalle al final del curso


107

Arquitectura de Asterisk

108

Prctica 3.1

Prctica 3.2

Instalando un mdulo desde source:


format_mp3 para msica en espera

Instalando un mdulo precompilado: Cdec G729

Prctica 3.3
(opcional)

Captulo Bsico #4
Aplicaciones

Cambiando el idioma de Asterisk

Ing. Christian Cabrera R.

Introduccin

Buzones de voz

Existen muchas aplicaciones en Asterisk

Ofrecer funcionalidad de dejar mensaje a un usuario.

Ms de 150+

Los buzones se crean en archivo voicemail.conf

Cada aplicacin tiene su propia sintaxis


No es necesario aprenderlas todas, pero si las ms
importantes

Se usa a travs de 2 aplicaciones:


Dejar el mensaje: Voicemail
Recuperar los mensajes: VoicemailMain

Todas son consultables desde el *CLI


core show applications
core show application <aplicacin>
Aplicaciones de Asterisk

All se definen los usuarios, sus nombres, contraseas y


correos para envio de mensajes

Es necesario programar estas aplicaciones en el


extensions.conf
113

Aplicaciones de Asterisk

voicemail.conf

114

Voicemail

Aqu configuramos los buzones y sus contraseas

Permite dejar un mensaje de voz al buzn


especificado

Configuracin general y mltiples contextos de


buzones de voz

El buzn/contexto deben existir en el voicemail.conf


Podemos dejar un mensaje en ms de un buzn a la vez

Si queremos tener activo el envo de correos


debemos instalar un MTA (Mail Transfer Agent) en
Linux

Sintaxis:
Voicemail(<buzn>[@<contexto>],<opciones>)

Ejemplos:

[general]
; Aqu va la configuracin general de los buzones de voz

Voicemail(100,b)
Voicemail(201&202,u)

[default]
101 => 1234,Juan Prez,juan@dominio.com,,attach=yes
102 => 1234,Jorge Lpez,jorge@dominio.com,,attach=yes
Aplicaciones de Asterisk

115

Aplicaciones de Asterisk

116

VoicemailMain

VMAuthenticate
Autentica al usuario a partir de la contrasea de su buzn

Desde aqu escuchamos nuestros mensajes


Permite tambin configurar las opciones del buzn, tales como
las bienvenidas
Es importante vaciar el buzn para evitar que se llene

Podemos saltar la autenticacin


Hacer que no se le pida contrasea al usuario y pasar directo a
los mensajes

Sintaxis:

Las contraseas estn definidas en el voicemail.conf

Usando VoiceMailMain, el usuario final puede actualizar


sus contraseas sin intervencin del administrador
El usuario se debe hacer responsable de su contrasea y su uso
Permite personalizar contraseas a nivel individual

3 intentos fallidos y la llamada es colgada


Sintaxis:

VoicemailMain([buzn],[opciones])

VMAuthenticate([buzn][@contexto],[opciones])

Ejemplos:

Ejemplos:

VoicemailMain(100,s)

VMAuthenticate(101@default)
Aplicaciones de Asterisk

117

Aplicaciones de Asterisk

Ejemplos de uso
; voicemail.conf
[default]
101 => 1234,Juan Prez,juan@dominio.com,,attach=yes

Prctica 4.1

; extensions.conf
[sub-llamar]
exten => s,1,Dial(${ARG1},20)
same => s,n,Voicemail(${ARG2}@default)
same => s,n,Hangup
same => s,n,Return

Agregar servicio de voicemail para nuestras


extensiones

[internas]
include => larga-distancia
exten => _*86,1,VoicemailMain()
exten => _1XX,1,Gosub(sub-llamar,s,1(SIP/${EXTEN},${EXTEN}))
[larga-distancia]
exten => _01ZXXXXXXXXX,1,VMAuthenticate(${CALLERID(num)}@default)
same => n,Dial(SIP/carrier/${EXTEN})
Aplicaciones de Asterisk

119

118

Interaccin con el usuario

Playback

En ocasiones tenemos necesidades como:

Reproduce el sonido especificado


Obliga al usuario a escucharlo (no puede saltarse)
No pueden recibirse tonos mientras se reproduce

Repetir alguna grabacin (bienvenidas)


Dar opciones de menu
Capturar dgitos ingresados en el telfono
Reproducir nmeros

La extensin del archivo se omite


Asterisk escoger el mejor cdec disponible
Lo mismo aplica para el resto de las aplicaciones de sonidos

Asterisk permite reproducir archivos de audio


Se soportan diferentes cdecs, adems de diferentes
idiomas para los archivos de sonido
Los sonidos se buscan por default en
/var/lib/asterisk/sounds

Sintaxis:
Playback(<archivo>,[opciones])

Ejemplo:
Playback(bienvenida)

Aplicaciones de Asterisk

121

Aplicaciones de Asterisk

Background

122

Read
Pide dgitos al usuario

Muy parecida a Playback, salvo que al usuario se le


permiten ingresar dgitos
Asterisk transferir al usuario a la extensin marcada
Si el nmero marcado no existe, transferir a la extensin i
(invlida)

No se hace nada con ellos, solo se almacenan en una


variable para uso posterior

Sintaxis:
Read(<var>,[archivo],[maxdigitos],[opciones],
[intentos],[timeout])

Sintaxis:
Background(<archivo>)

Ejemplo:

Ejemplo:

Read(pass,enter-account,4)

Background(digite-opciones)

Aplicaciones de Asterisk

123

Aplicaciones de Asterisk

124

Entendiendo la diferencia

SayDigits
Reproduce un nmero dgito por dgito

Read pide datos para almacenar o procesar


Ej. Contraseas o nmeros de cuenta

12345 = Uno dos tres cuatro cinco

Se usa para reproducir nmeros que no correspondan


a una cantidad

Background transfiere hacia la ext. marcada

Nmeros de contrato
Nmeros de cuenta
Contraseas

Ej. Para ventas, digite 1. Soporte digite 2

Playback solo reproduce archivos

Ejemplo:

Obligamos al usuario a que escuche la grabacin

SayDigits(123192)

Aplicaciones de Asterisk

125

Aplicaciones de Asterisk

126

Sobre las aplicaciones


de audio

SayNumber
Lee un nmero como una cantidad

Todos los sonidos se buscan por default en


/var/lib/asterisk/sounds

12345 = Docemil trescientos cuarenta y cinco

Para cambiar el idioma de los sonidos, hay 2 maneras:

Debe recibir solamente nmeros enteros

Cambiar el campo language=XX dentro del sip.conf, iax.conf o


chan_dahdi.conf
Hacer un Set(CHANNEL(language)=XX) en el plan de llamadas
XX es el cdigo de idioma deseado (es, fr, it, en, etc)

No hace distincin de nmeros o cadenas

Ejemplo:

Si algn archivo de sonido no existe en el idioma


deseado, se usar el mismo archivo en ingls

Saynumber(123192)

Si tampoco existe el archivo en ingls, dar un error

Aplicaciones de Asterisk

127

Aplicaciones de Asterisk

128

Ejemplo
[from-pstn]
include => horario-habil,9:00-18:00,mon-fri,*,*
include => fuera-de-horario

Prctica 4.2

[horario-habil]
include => internas
exten => s,1,Background(bienvenida)
same => n(opciones),Background(digite-opcion)
same => n,Goto(opciones)
[fuera-de-horario]
exten => s,1,Playback(recordamos-horarios-operacion)
same => n,Hangup

Aplicaciones de Asterisk

Rutinas con reproduccin de audio

129

Control de llamadas

Answer

Para asegurar que el audio fluya a travs del canal, es


recomendable contestarlo primero
Algunas aplicaciones lo hacen automticamente

Contesta un canal y comienza la tarificacin


Puede especificarse un tiempo de espera antes de continuar
con la siguiente prioridad

Procurar no usar Answer sino dejar que otra


aplicacin haga un contestado implcito

Es ocasiones es necesario insertar silencios antes o


despus del audio

Sintaxis:
Answer([milisegundos])

Dar mejor espacio entre llamadas o dar oportunidad al


usuario a que ingrese dgitos

Ejemplo:
Answer(3000)

Aplicaciones de Asterisk

131

Aplicaciones de Asterisk

132

Wait

WaitExten
Funciona igual que Wait, pero el usuario puede
ingresar dgitos

Hace al usuario esperar un tiempo obligatorio


No se pueden ingresar dgitos mientras se espera
Puede especificarse el tiempo que dure el silencio en
decimales
Es equivalente a un Playback en silencio

Asterisk intentar comunicar al usuario a la extensin


marcada
til para dar tiempos adicionales en IVRs
Es equivalente a un Background en silencio

Sintaxis:
Sintaxis:

Wait(<segundos>)

WaitExten(<segundos>,[opciones])

Ejemplo:

Ejemplo:

Wait(10)

WaitExten(3.5)
Aplicaciones de Asterisk

133

Aplicaciones de Asterisk

Comunicacin entre
usuarios

134

Dial

La tarea ms importante en un conmutador es


comunicar extensiones

Permite enlazar usuario con usuario


Siempre debe contener una tecnologa y un usuario
Asterisk puede convertir entre los protocolos

Podemos marcar a ms de un usuario a la vez

Asterisk ofrece la posibilidad de comunicar


varios usuarios en una misma llamada

Sintaxis:
Dial(<tech/user>,[timeout],[opciones])

Ejemplo:
Dial(SIP/100,30,tT)
Dial(SIP/201&SIP/202,30,tT)
Aplicaciones de Asterisk

135

Aplicaciones de Asterisk

136

Meetme

Controles de flujo

Establece cuartos de conferencia

El dialplan sigue una programacin secuencial

Une a n personas en una sola llamada

Tiene muchas opciones disponibles:

Solo hablar, solo escuchar, grabar conferencia, ejecutar AGI en el fondo,


usar contrasea, etc

Si no se proporciona el nmero de la conferencia, se le pedir


uno al usuario
Al colgar el ltimo usuario, la conferencia se cierra

Cada evento que ocurre va despus de otro


Es posible alterar el flujo haciendo saltos

Podemos evaluar condiciones para saber si es


necesario saltar o no
Tambin es posible evaluar acciones directamente

Sintaxis:
MeetMe([conferencia][,opciones[,nip]])

Ejemplo:
Meetme(8500,d)
Meetme(8501,D,2198)
Aplicaciones de Asterisk

137

Aplicaciones de Asterisk

Goto

138

GotoIf

Hace saltos incondicionales hacia cualquier contextoextensin-prioridad

Igual que Goto, pero solo brinca si la condicin se


cumple

Puede recibir 1, 2 o 3 parmetros

Dos posibles destinos


Es importante evaluar la condicional

1: Solo prioridad (misma ext. y contexto)


2: Extensin y prioridad (mismo contexto)
3: Contexto, extensin y prioridad

Sintaxis:

Sintaxis:

Goto([contexto],[extensin],<prioridad>)

GotoIf(<condicin>?<verdadero>:[falso])

Ejemplos:
Goto(opciones)
Goto(s,continua)
Goto(default,s,1)

Ejemplos:
GotoIf($[${var}>3]?s,1:default,123,1)
Aplicaciones de Asterisk

139

Aplicaciones de Asterisk

140

ExecIf

Ejemplo global: IVR

Permite ejecutar una aplicacin nica basada en una


condicional
til para hacer variaciones en un solo comando

[from-pstn]
include => internas
exten => s,1,Answer(3000)
same => n,Playback(bienvenida)
same => n,Wait(1)
same => n(opciones),Background(digite-opcion)
same => n,WaitExten(4)
same => n,Goto(opciones)
exten => 1,1,Dial(SIP/100)
exten => 2,1,Dial(SIP/201&SIP/202)

Ejemplo:
ExecIf($[${var}>1]?Playback(hola):Playback(adios))

exten => 3,1,Read(password,dame-tu-pass)


same => n,GotoIf($[${password}=1234]?bien:mal)
same => n(mal),Playback(pbx-invalid)
same => n,Goto(s,opciones)
same => n(bien),Playback(demo-congrats)
same => n,Goto(s,opciones)
exten => 5,1,Meetme(5000)
same => n,Goto(s,opciones)
exten => i,1,Goto(s,opciones)

Aplicaciones de Asterisk

141

Aplicaciones de Asterisk

Prctica 4.3

Prctica 4.4 (opcional)

Crear un menu IVR

Uso de funciones

142

Plan de llamadas
contador

Captulo Bsico #5
Conexin con la PSTN
usando DAHDI

Usuarios SIP
saldo
llamada

menu

micontexto

servicios

internas

Ing. Christian Cabrera R.

adicional

Aplicaciones de Asterisk

145

Introduccin

Fabricantes

Asterisk tiene la posibilidad de interactuar con


la PSTN
Se requiere de hardware adicional o rentar un
servicio de terceros

Los 3 principales
fabricantes del mercado:
Digium
Sangoma
Openvox

Para la interconexin directa pueden usarse


gateways externos o tarjetas internas

Cualquiera de sus tarjetas


funciona con Asterisk,
solo se configuran un
poco diferente

Los gateways se configuran por SIP


Nos centraremos en las tarjetas
Interconexin por DAHDI

Al no usar protocolos
propietarios, la libre
competencia ha reducido
los costos del equipo

147

Interconexin por DAHDI

148

Tarjetas analgicas

Puertos analgicos
Son los ms comunes

FXO (Foreign Exchange Office)

Estos son los puertos que usaramos para poner un PBX en


casa

Reciben corriente (de la telefnica)


Aqu conectas una lnea que viene de la calle
(Telmex, Axtel, Alestra, etc)

Limitados a una llamada simultnea por canal

FXS (Foreign Exchange Station)

El par de cobre est dedicado a un nico circuito

Entregan corriente hacia el telfono


Conectas un telfono convencional (Panasonic,
Alcatel, Siemens, etc)

En otros conmutadores se llaman diferente:


FXO = CO
FXS = EXT

Nunca conectar FXS-FXS!


Podras quemar los puertos
Interconexin por DAHDI

149

Tarjetas digitales

Interconexin por DAHDI

150

Conexin fsica

Todas soportan tanto E1s como T1s

Las tarjetas digitales tienen puertos RJ45 (8 pines),


pero los enlaces normalmente vienen en G703
(coaxial)

Configurable por software

T1: Estndar Americano

23 canales de voz + 1 sealizacin

Es necesario un convertidor que adems de adaptar el


conector, acople las impedancias correctamente

E1: Estndar Europeo

30 canales de voz + 1 de sealizacin + 1 de


sincrona

Para estos propsitos se usa un balun

Interconexin por DAHDI

151

Interconexin por DAHDI

152

Puertos digitales

Sincrona

Son troncales de mltiples canales digitales (DS-0)

Dado que los enlaces digitales estn multiplexados en


tiempo, requieren de una fuente de sincrona

Usados en entornos de grandes oficinas o corporativos

Las tarjetas digitales tienen 2 opciones:

Usando TDM (Time Division Multiplexing) es posible agrupar


muchos canales en un solo enlace

Tomar la sincrona que proviene del enlace (recomendado si es


que estamos conectados con la telefnica)
Generar la sincrona propia (cuando Asterisk es el equipo
maestro)

Hasta 30 canales de voz con muchos DIDs diferentes

Son tecnolgicamente superiores que los anlogos:


Mayor calidad
No son susceptibles al ruido
Confiabilidad

Sin una fuente de sincrona precisa, tendremos problemas


Ruidos en la lnea
Puede ocasionar que las llamadas se desconecten

Las tarjetas son ms caras

Aunque la renta del servicio digital suele ser mas cara


El costo puerto por puerto es ms barato
Interconexin por DAHDI

Deberemos configurar este parmetro en el system.conf


153

Interconexin por DAHDI

Comparacin ISDN vs
R2MFC

Framing
Segn el tipo de enlace, hay diferentes tipos:
T1s (EUA y CAN)
D4 Super Frame
(obsoleto)

ESF Extended Super Frame

154

E1s con ISDN PRI

E1s (resto del mundo)

E1s Canalizados (R2 MFC)

30 canales de voz

30 canales de voz

Usa CCS

Usa CAS

CAS Channel Associated


Signaling (obsoleto)

Canal 1 se usa para framing.


Canal 16 se usa para sealizacin

Canal 1 se usa para framing.


Canal 16 se usa para sealizacin

CCS Common Channel


Signaling

Soporta Euro ISDN, tanto en modo


de CPE como red (esclavo / maestro)

Soporta FXS, FXO, E&M

Comnmente usa CRC para


corroborar errores en transmisin

Obsoleto en Europa
Comn en Amrica Latina

Tanto D4 como CAS son tecnologas viejas y no


deberan usarse

Ms caro, por ser tecnologa nueva


Ofrece mucho ms informacin por
llamada

Desafortunadamente, en Latinoamrica usamos


principalmente R2 modificado, el cual usa CAS
Interconexin por DAHDI

155

Interconexin por DAHDI

156

Interconexin con
otros PBX

Qu es un DID?

Es posible interconectar Asterisk con otros sistemas


no IP
FXS-FXO o FXO-FXS es lo ms comn, pero te limita a una
sola llamada por puerto
Tambin es posible usar E1s con cable cruzado

Direct Inward Dialing

Es el nmero telefnico al cual marcamos

Un DID debe estar asociado con un canal para poder


recibir las llamadas

No confundir el DID con la lnea/canal para recibir (similar a


usuarios SIP y extensiones)

Asterisk puede actuar como maestro (simular ser la


telefnica) o actuar como esclavo (dejando al otro
PBX ser el maestro)

Es posible comprar DIDs virtuales que lleguen por SIP

Puede adaptarse fcilmente a las necesidades del otro


conmutador

Al recibir la llamada, la telefnica indica a que DID marc el


cliente
Una lnea anloga tiene un DID nico asignado

Interconexin por DAHDI

Esto evita tener que comprar tarjetas

Un enlace digital puede tener mltiples DIDs

157

Interaccin en software
OpenR2

Archivo base de configuracin de las tarjetas

/etc/asterisk/chan_dahdi.conf

Liga los mdulos de DAHDI con los puertos de las tarjetas

Por cada puerto digital, declaramos un span

DAHDI

Se configura el framing y el coding que el enlace use (segn sean


ISDN PRI, R2 MFC, etc)
Adicionalmente, deben declararse los canales de cada span

/etc/dahdi/system.conf

Los puertos anlogos de declaran cruzados

Wanpipe

FXO se declaran como FXS y viceversa

/etc/wanpipe/wanpipe1.conf

Tarjetas
Digium

158

/etc/dahdi/system.conf

Asterisk
Solo en caso que
usemos R2 MFC

Interconexin por DAHDI

Los canales deben ser consecutivos de acuerdo al orden


en que se cargan los mdulos

Tarjetas
Sangoma
Interconexin por DAHDI

/etc/dahdi/modules
159

Interconexin por DAHDI

160

system.conf

system.conf (2)

Los spans se declaran con la sintaxis:

Ejemplo para 1 E1 ISDN + 4 FXO + 1 FXS

span=<nmero>,<sincrona>,<atenuacin>,<framing>,<coding>

La sincrona se configura como


0 para maestro (usamos nuestra propia sincrona)
1 para esclavo (tomamos la sincrona que recibimos en el
enlace)
2 en adelante para definir los enlaces secundarios,
terciarios, etc

La atenuacin normalmente va en 0 (cero)


Solo sera necesario hacer cambios si estamos fsicamente
distantes (> 40 m) del mdem que trae el enlace
Interconexin por DAHDI

# Configuracin para E1 ISDN


span=1,1,0,ccs,hdb3
bchan=1-15,17-31
dchan=16

# Configuracin para 4 puertos FXO


fxsks=32-35
# Sealizacin inversa
# Configuracin para 1 puerto FXS
fxoks=36
# Inversa

161

system.conf (3)

# R2 MFC
span=1,1,0,cas,hdb3
cas=1-15:1101
cas=17-31:1101
dchan=16

Interconexin por DAHDI

162

/etc/asterisk/ chan_dahdi.conf
Aqu hacemos que Asterisk trabaje con los
canales de DAHDI instalados

Tras modificar el archivo, es necesario aplicar los


cambios desde el CLI
dahdi_cfg vv

Si declaramos los canales con errores, los cambios no


se aplicarn

Configuramos la sealizacin, las funciones


del canal, los grupos y los contextos a los que
pertenecen

Tomar nota del orden de los canales, ya que los


ocuparemos en el siguiente archivo

Prestar atencin a la sintaxis

Interconexin por DAHDI

163

Interconexin por DAHDI

164

chan_dahdi.conf
; ISDN PRI
signalling = pri_cpe
pridialplan=unknown
switchtype = euroisdn
context=from-pstn
group=0
channel => 1-15,17-31
signalling=fxs_ks
context=from-pstn
group=8
channel => 32-35
signalling=fxo_ks
context=from-internal
group=9
channel => 36

chan_dahdi.conf (2)
Para aplicar los cambios (se caern las llamadas):

; R2 modificado
signalling=mfcr2
mfcr2_variant=mx
mfcr2__ani_first=no
mfcr2_max_ani=10
mfcr2_max_dnis=4
mfcr2_category=national_subscriber
mfcr2_mfback_timeout=-1
mfcr2_metering_pulse_timeout=-1
mfcr2_forced_release=no
mfcr2_logdir=log
mfcr2_logging=all

*CLI> dahdi restart

Consultamos el estado de los canales:


*CLI> dahdi show channels

O si tenemos un enlace con R2MFC:


*CLI> mfcr2 show channels

ltimo paso es configurar el extensions.conf para enviar las


llamadas mediante DAHDI
Podemos enviar llamadas por canal o por grupo

exten
exten
exten
exten
exten

context=from-pstn
group=0
channel => 1-15,17-31
Interconexin por DAHDI

=>
=>
=>
=>
=>

_ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
_01ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
_04455ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
_045ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
_01900.,1,Congestion

165

Interconexin por DAHDI

166

Plan de llamadas
contador
Usuarios SIP
saldo

Prctica 5.1

llamada

menu

Instalacin de una tarjeta DAHDI

micontexto

internas

salida

adicional
entrada
PSTN

Interconexin por DAHDI

168

Recapitulando
IAX es un protocolo de comunicacin

Captulo Intermedio #1
Enlaces IAX y
troncales SIP

Se define en el archivo /etc/asterisk/iax.conf


El protocolo SIP se ocupa principalmente para
extensiones
Pero tambin podemos tener troncales en SIP

Ing. Christian Cabrera R.

Enlaces IAX y troncales SIP

Introduccin

Comparativa SIP vs IAX


SIP

IAX2

Pros

Amplio soporte en hardware


Cientos de implementaciones en
software (propietarias y
gratuitas)
Estandarizado

Ahorro de ancho de banda


reutilizando encabezados
Encabezados en binario (menor
ancho de banda)
Facilidad de configuracin a travs
de firewalls
Ms seguro (al ser menos conocido)
Diseado a partir de requerimientos
en el mundo real

Contras

IAX = Inter Asterisk eXchange

Problemas con NAT


Muy conocido, y por lo tanto,
atacado

Dbil soporte en hardware


Limitada cantidad de software que
lo utiliza
No es un estndar

Desarrollado por Mark Spencer


Creado especficamente como un protocolo de telefona

Usa un solo puerto UDP, el 4569


Mismo puerto para sealizacin y envo de la voz
Amigable con NAT

Ofrece posibilidad de trunking, permitiendo agrupar


mltiples llamadas en un solo enlace

Enlaces IAX y troncales SIP

Enlaces IAX y troncales SIP

Trunking IAX desactivado


En SIP, cada paquete tiene
su propio encabezado
En ocasiones, el tamao de
los encabezados supera al
del mensaje

5
5

4
4
4

Trunking IAX activado


Con IAX podemos
habilitar el trunking y
compartir los
encabezados

Si los paquetes son


siempre entre el punto A
y B, se repite mucha
informacin

Solo cambia el cuerpo de


los mensajes
5

3
3

3
5
Enlaces IAX y troncales SIP

Alta de usuarios IAX

4
4
4

La relacin
encabezados/cuerpo es
mucho menor
El ancho de banda se
aprovecha mejor

3
3

Enlaces IAX y troncales SIP

Conectando los equipos

Igual que en SIP

Hay 3 escenarios para interconectar equipos:

Campos context, type y host


Seccin general y seccin de mltiples usuarios

1. Ambos equipos cuentan con IP fija


El ms sencillo de implementar
Cada host siempre conoce la ubicacin del otro

Si no se especifica secret, cualquier usuario sin


contrasea podr llamar

2. Uno tiene IP fija y el otro dinmica

Esto se usa para poder recibir llamadas annimas


Es preferible declarar una cuenta iax sin contrasea con
accesos muy restringidos

Equipo dinmico debe registrarse con equipo fijo para


darse a conocer

3. Ambos equipos tienen IP dinmica


Es necesario convertirlo en uno de los otros escenarios (al
menos uno de los dos debe simular ser fijo)
Enlaces IAX y troncales SIP

Enlaces IAX y troncales SIP

Creando el enlace
; Host A
; sip.conf/iax.conf

; Host B
; sip.con/iax.conf

[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32

[usuario A]
username=<usuario B>
host=<ip A>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip A>/32

Proceso de registro
Esto es necesario cuando queremos interconectar 2
equipos y uno de ellos tiene una IP dinmica
El equipo dinmico se reporta con el fijo de manera
peridica

Tambin es posible que Asterisk se registre hacia otro


Asterisk (o cualquier
otro101
proxy)
Soy el usuario
y estoy en la
IP 192.168.1.145.
Registrame por
Mi
contrasea es ******
favor

Correcto!
Quedas
registrado
Si en
verdad eres
el usuario
101,
desde
192.168.1.145
CullaesIPtu
contrasea?
101 @ 192.168.1.145
(IP dinmica)
9

Enlaces IAX y troncales SIP

Proceso de registro (2)

Enlaces IAX y troncales SIP

10

Creando el enlace (2)

Los registros se hacen en la seccin [general] del


iax.conf/sip.conf y tienen el siguiente formato:

; Host A (dinmico)
; sip.con/iax.conf

register => <usuario>:<password>@<dominio>

; Host B (fijo)
; sip.con/iax.conf

[general]
register => usuarioA:elmismo@<ip B>

Ejemplos:
register => 10025:3nl4z4@enlaza.mx
register => 5550181181:abcde12345@mi.proveedor.com

Al registrarse, el equipo que recibe (el fijo) ya conoce


la direccin del dispositivo dinmico
Ya sabe a donde enviar las llamadas

Enlaces IAX y troncales SIP

192.168.1.200
(IP fija)

11

[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32

[usuario A]
username=<usuario B>
host=dynamic
secret=<elmismo>
context=entrada
type=friend

Enlaces IAX y troncales SIP

12

Envo de llamadas

Ejemplos de llamadas

Existen varios formatos para mandar las llamadas:

[micontexto]
include => salida
include => sucursales

IAX2/usuario_iax/extension
IAX2/proveedor/0140

[salida]
; Llamadas locales en DF y LDN
exten => _ZXXXXXXX,1,Dial(SIP/micarrier/${EXTEN})
exten => _01ZXXXXXXXXX,1,Dial(SIP/micarrier/52${EXTEN:2})
; Pido prestadas las lineas de mis otros conmutadores
exten => _0133ZXXXXXXX,1,Dial(IAX2/pbxGDL/${EXTEN:4})
exten => _0181ZXXXXXXX,1,Dial(IAX2/pbxMTY/${EXTEN:4})

IAX2/username:password@dominio/extension
IAX2/10999:abcde@asteriskmx.com/525512345678

IAX2/dominio/extension
IAX2/asteriskmx.com/101

[sucursales]
; Llamadas internas entre conmutadores. El primer dgito
; identifica a que conmutador van
exten => _3XXX,1,Dial(IAX2/pbxGDL/${EXTEN})
exten => _4XXX,1,Dial(IAX2/pbxMTY/${EXTEN})

Todos estos formatos aplican para SIP e IAX


Algunos pueden simplificarse creando previamente una
entrada en el archivo de configuracin
Enlaces IAX y troncales SIP

13

Enlaces IAX y troncales SIP

Prctica 6.1

Prctica 6.2

Crear un enlace IAX entre


2 servidores Asterisk

Recibir llamadas IAX annimas

14

Plan de llamadas
contador
Usuarios SIP
saldo

Prctica 6.3

llamada

menu

Conexin con un carrier IAX/SIP

servicios

micontexto

internas

salida

adicional
sucursal

entrada

IAX autenticados

PSTN/
Vecinos IAX

IAX annimos

Recapitulando

Captulo Intermedio #2
Distribucin automtica
de llamadas (ACD)
Ing. Christian Cabrera R.

Extensiones se asignan a usuarios SIP/IAX/DAHDI


Comnmente en relacin 1:1

Pueden asignarse mltiples dispositivos a una sola


extensin
Aunque timbrar varios telfonos a la vez no siempre es
buena opcin

El plan de llamadas no permite controlar de manera


especfica a quienes se les enviarn las llamadas en
base a su ocupacin

Distribucin automtica de llamadas (ACD)

20

Asterisk como CallCenter

Componentes

Qu puede ofrecernos la plataforma?

Hay 2 partes importantes en todo esquema de atencin


al usuario: miembros y colas

Distribucin automtica de llamadas (ACD)


Agentes remotos
Monitoreo y grabacin de llamadas
Msica en espera
Enrutamiento basado en habilidades (skills)
Distribucin y enrutamiento geogrfico
Soluciones de contingencia

Una cola es una fila donde entran aquellos que desean


comunicarse a un rea especfica (soporte, ventas, etc)
Un callcenter puede tener N colas

Un miembro es el dispositivo que se registrar a una cola


para empezar a recibir llamadas
Los miembros pueden estar suscritos a mltiples colas

Estos conceptos se usan para recibir llamadas de inbound


Sin embargo, pueden aprovecharse para conectar llamadas de
outbound que sean traidas por un proceso externo
Distribucin automtica de llamadas (ACD)

21

Distribucin automtica de llamadas (ACD)

Caractersticas

Colas: queues.conf
Archivo donde se configuran todas las colas del sistema

Si una cola no tiene miembros asignados, no podr


atender llamadas

Existe la seccin de [general] y mltiples [colas]

Podemos agregar miembros estticos a cada cola usando


el campo de member:

Si no ha nadie al telfono, quin contesta?

Los miembros pueden ser estticos o dinmicos

member => <Tech>/<usuario>, [penalizacin],[nombre

Los estticos se configuran en el queues.conf


Los dinmicos se dan de alta por CLI o por el dialplan

miembro]

Ejemplo:
[soporte]
; Agrego 2 miembros a soporte
member => SIP/100,0,Christian Cabrera
member => IAX2/vecino/200,1,Juan Lopez

En versiones anteriores de Asterisk exista el


concepto de agente
Este concepto ha sido depreciado, por lo que ya no se
estudiar
Debe reemplazarse por el uso de miembros dinmicos
Distribucin automtica de llamadas (ACD)

22

Los miembros estticos siempre se consideran en lnea

Para tener el concepto de login/logout, debemos usar miembros


dinmicos

23

Distribucin automtica de llamadas (ACD)

24

Ejemplo de queues.conf

Colas: queues.conf (2)


Campo
musicclass

announce

strategy

Valores posibles

[general]
persistentmembers=yes
monitor-type=MixMonitor

Funcin

<clase de MOH>

Especificar la clase de la msica en espera.


Se define en el archivo musiconhold.conf

<archivo de sonido
del anuncio>

Reproducir un anuncio para el agente al


momento de contestar una llamada. Util para
miembros registrados en ms de una cola

[ventas]
announce=sales
musicclass=nuevosproductos
strategy=lineal
weight=5
member => SIP/ventas1
member => SIP/ventas2

linear, leastrecent,
Define la estrategia de timbrado a seguir
ringall, fewestcalls,
(random, rrordered y rrmemory son los ms
random, rrordered,
justos)
rrmemory,wrandom

timeout

<segundos>

Tiempo mximo que se le timbrar a un


miembro antes de considerarlo no disponible

weight

<peso>

Importancia de la cola con respecto a otras. Una


cola ms importante ser atendida antes
Distribucin automtica de llamadas (ACD)

[soporte]
timeout=10
strategy=rrmemory
member => SIP/soporte1
member => SIP/soporte2

25

; Miembros estticos

Esto crea las colas del sistema, ahora es


necesario dejar que los clientes lleguen
a ella

Distribucin automtica de llamadas (ACD)

Aplicacin: Queue

26

Pausas
Permiten al miembro dejar de tomar llamadas
temporalmente

Permite a los clientes formarse en una cola


Pueden introducirse posiciones en la cola para tomar
preferencias

Se especifican con las aplicaciones PauseQueueMember() y


UnpauseQueueMember()

[from-pstn]
exten => s,1,Answer(3000)
same => n(opciones),Background(digite-opcion)
same => n,WaitExten(4)
same => n,Goto(opciones)

Ejemplo:
; Pausar
exten =>
exten =>
; Pausar
exten =>
exten =>

exten => 1,1,Queue(ventas)


exten => 2,1,Queue(soporte)

En este ejemplo, ventas y soporte deben existir en el


queues.conf
Distribucin automtica de llamadas (ACD)

; Activar la grabacin general

27

solamente la cola de ventas


*60,1,PauseQueueMember(ventas,SIP/${CALLERID(num)})
*61,1,UnpauseQueueMember(ventas,SIP/${CALLERID(num)})
todas las colas
*70,1,PauseQueueMember(,SIP/${CALLERID(num)})
*71,1,UnpauseQueueMember(,SIP/${CALLERID(num)})

Tambin podemos pausar desde el *CLI


*CLI> queue pause member SIP/101
*CLI> queue unpause member SIP/101 queue ventas

; Para todas
; Para ventas

Distribucin automtica de llamadas (ACD)

28

Miembros dinmicos
Permiten simular el uso de agentes

Prctica 7.1

Tenemos que crear nuestras propias rutinas de login/logout


Opcional pedir usuario/contrasea

Se agregan desde el dialplan (extensions.conf) usando


AddQueueMember() y RemoveQueueMember()
Si no se especifica la interfaz, agregar el canal desde el que
estemos marcando en este momento

Crear un centro de
atencin a clientes

; Login/logout a la cola de ventas


exten => *80,1,AddQueueMember(ventas)
exten => *81,1,RemoveQueueMember(ventas)

Tambin podemos agregar miembros desde el *CLI


*CLI> queue add member SIP/101 to ventas
*CLI> queue remove member SIP/101 from ventas
Distribucin automtica de llamadas (ACD)

Prctica 7.2

Captulo Intermedio #3
Asterisk DB

Agregar miembros
dinmicos a una cola

Ing. Christian Cabrera R.

30

Recapitulando

Introduccin

Las variables solo existen mientras dura la llamada

Asterisk posee su propio manejador de base de datos


sencillo

Al terminar la llamada, se destruyen las variables


relacionadas

Asterisk DB

Podemos guardar informacin como constantes en el


plan de llamadas

Desde Asterisk 10, el AstDB est basado en SQLite

Algunas funciones requieren un medio de


almacenamiento permanente para pasar datos entre
sesiones

Se puede utilizar mediante funciones de Asterisk:

Asterisk Database

En versiones inferiores se usaba la Berkeley DB


DB()
DB_EXISTS()
DB_DELETE()

33

Asterisk Database

Asterisk DB

34

Estructura jerrquica

DB() permite modificar y obtener valores contenidos


en la base de datos de Asterisk
DB(<familia>/<llave>)

Los valores se leen y escriben como si fueran


variables
Set(DB(sigueme/100)=5546144330)
Noop(${DB(sigueme/100)})

Cada familia puede descomponerse en subniveles


Familias dentro de familias dentro de familias
Cualquier nivel se crea automticamente al declararlo la
primera vez
Llave1
Valor1
Familia1

Es posible especificar ms de una familia/llave

Llave2

Valor2

SubFamilia1

Llave3

Valor3

DB(usuario/100/fwd)
Familia2
Asterisk Database

35

Llave5
(vaca)
Enlaces IAX y troncales SIP

36

DB_DELETE y DB_EXISTS

Usos prcticos del AstDB


Funciones que deban recordar el status de los
telfonos

DB_DELETE() elimina la llave especificada


DB_EXISTS() determina si la llave especificada
existe

DND (no molestar)


Redireccionamiento
Contraseas
*69 (ltimo nmero marcado)

Regresa un 1/0 segn si la llave existe o no


Es indiferente a valores vacios

Cualquier dato pequeo y nico que no tenga que ser


consultado para razones histricas

Ambas funciones crean la variable


${DB_RESULT}

No recomendable para informacin que deba ser


modificada desde fuera de Asterisk

Contiene el valor que exista en la BD


til para evitar reconsultarla
Asterisk Database

37

Enlaces IAX y troncales SIP

38

Caractersticas de
AstDB

Ejemplo de DND
[servicios]
exten => *31,1,Set(DB(dnd/${CALLERID(num):-1}00)=${destino})
same => n,Playback(do-not-disturb&enabled)
same => n,Hangup

Sencilla y fcil de usar en el dialplan

exten => *22,1,Noop(${DB_DELETE(dnd/${CALLERID(num):-1}00)})


same => n,Playback(do-not-disturb&disabled)
same => n,Hangup

Toda la informacin almacenada en un solo archivo

[sub-llamada]
exten => s,1,Noop(Llamando a ${ARG1})
same => n,GotoIf(${DB_EXISTS(dnd/${ARG2})}?dnd)
same => n,Dial(${ARG1},10)
same => n(dnd),Voicemail(${ARG2})
same => n,Hangup

Permanece aunque Asterisk se reinicie

No requiere controladores externos


/var/lib/asterisk/astdb

Solo pueden extraerse datos nicos en base a una


familia y una llave

[internas]
exten => _[12]00,1,Gosub(sub-llamada,s,1(SIP/usuario${EXTEN:0:1},100))
Enlaces IAX y troncales SIP

39

No pueden hacerse querys


No son tablas, sino listas ordenadas
Asterisk Database

40

Caractersticas de
AstDB (2)
Rpida
Asterisk la utiliza para guardar informacin

Prctica 8.1

Ej. Registro de usuarios SIP

Puede verse el contenido completo usando


*CLI> database show
Usar Asterisk DB para crear un redireccionamiento
de llamada

Asterisk Database

41

Plan de llamadas
contador
Usuarios SIP
saldo

Prctica 8.2 (opcional)

llamada

menu

Usar Asterisk DB para bloquear extensiones al final


del da

internas
adicional

entrada

servicios

micontexto

permitidos
salida
permitir
sucursal

IAX autenticados

PSTN/
Vecinos IAX

IAX annimos
Asterisk Database

44

Recapitulando
Todos los datos que Asterisk posee son estticos

Captulo Intermedio #4
Integracin con
bases de datos

Tenemos que recargar tras actualizarlos

Podemos almacenar datos dinmicos en el AstDB


Pero el AstDB nunca se pens para datos grandes (como
CDRs)
No podemos hacer consultas estructuradas

Ing. Christian Cabrera R.

Integracin con bases de datos

45

Introduccin

46

Escogiendo el manejador

Asterisk puede integrarse con diferentes manejadores


de bases de datos
Leer configuracin
Almacenar el detalle de llamadas
Consultar informacin externa (contraseas, tipo de cambio,
saldos, etc)

Facilita la integracin con interfases y scripts


externos
Usamos la BD como un medio alternativo donde guardar la
informacin
Asterisk puede consultarla en paralelo que otros procesos
Puede escribir en BD y dejar que otro proceso la lea
Integracin con bases de datos

47

Asterisk soporta varias opciones de BD


MySQL
PostgreSQL
LDAP
SQLite

Tambin existe el estndar ODBC (Open Database


Connectivity)
Abre el acceso a manejadores como MSSQL Server, Oracle,
Access, Informix y otros ms que no estn disponibles en
Linux

Nos enfocaremos en ODBC para tener un abanico de


opciones ms completo
Integracin con bases de datos

48

Asterisk y ODBC

unixODBC

Asterisk soporta ODBC a travs de 3 mdulos

Nos permite conectarnos por ODBC con cualquier


manejador

res_odbc
res_config_odbc
cdr_odbc

Punto nico de interaccin con mltiples manejadores

Debemos conseguir la librera necesaria para el


manejador deseado
Puede tener costo

Linux ofrece conectividad con ODBC mediante el


paquete unixODBC

unixODBC
Integracin con bases de datos

49

unixODBC (2)

Integracin con bases de datos

50

odbcinst.ini
Configura los controladores necesarios para
que ODBC interactue con la base de datos
requerida

ODBC -> MySQL requiere la librera libmyodbc


apt-get install unixodbc libmyodbc

Es necesario modificar 2 archivos:


/etc/odbc.ini
/etc/odbcinst.ini
Notar que estos archivos NO estn en la carpeta de Asterisk

odbc.ini configura los data sources (DSNs) de ODBC


odbcinst.ini especifica que libreras usaremos
cuando nos conectemos con cada manejador
Integracin con bases de datos

51

Ejemplo para MySQL:


[MySQL]
Description =MySQL driver
Driver
=/usr/lib/odbc/libmyodbc.so
Setup
=/usr/lib/odbc/libodbcmyS.so

Integracin con bases de datos

52

odbc.ini

Instalando un CDR

Configura los data sources de ODBC

Call Detail Recording

Ejemplo para MySQL:

Por default, los CDRs se escriben en un archivo CSV

Detalle de llamadas
/var/log/asterisk/cdr-csv/Master.csv

[MySQL-asterisk]
Description=MySQL ODBC Driver Testing
Driver=MySQL
Socket=/var/run/mysqld/mysqld.sock
Server=localhost
Database=asterisk

Integracin con bases de datos

Es ms til que los registros se guarden en una BD


Podemos hacer queries y formular los reportes segn nos
convenga
Asterisk requiere de tablas con un formato especfico

Si usamos ODBC, es necesario configurar 2 archivos


dentro de Asterisk:
res_odbc.conf
cdr_odbc.conf
53

ODBC en Asterisk
res_odbc.conf
Creamos los perfiles de
conexin para Asterisk
El usuario y contrasea
debe haberse creado
previamente
[cdr-asterisk]
enabled => yes
dsn => MySQL-asterisk
username => cdruser
password => cdrpass
pre-connect => yes

54

Todo relacionado

cdr_odbc.conf
Especificamos que tablas y
que perfil usar para
guardar el CDR

; /etc/asterisk/res_odbc.conf
[cdr-asterisk]
dsn => MySQL-asterisk

; /etc/asterisk/cdr_odbc.conf
[general]
dsn => cdr-asterisk

; /etc/odbc.ini
[MySQL-asterisk]
Driver=MySQL

[global]
dsn=cdr-asterisk
loguniqueid=yes
dispositionstring=yes
table=cdr

Integracin con bases de datos

Integracin con bases de datos

; /etc/odbcinst.ini
[MySQL]
Driver=/usr/lib/odbc/libmyodbc.so
Setup=/usr/lib/odbc/libodbcmyS.so
55

libmyodbc
Integracin con bases de datos

56

Realtime
Asterisk Realtime Architecture (ARA)
Capa intermedia que abstrae el cdigo de BD
No es necesario hacer queries

Prctica 9.1

Reemplaza archivos de texto por tablas


Convertimos los archivos de texto a formato tabular
Permite actualizar datos sin recargar el sistema

Configurar el CDR por ODBC (MySQL)

Integracin con bases de datos

57

Comparacin entre
mecanismos de configuracin
Diferentes mecanismos para diferentes propsitos:
Archivos de
texto

CLI

AMI

Realtime

Bajo

Alto

Alto

Medio

Mantenimiento

Medio

Medio

Medio

Bajo

Escalabilidad

Media

Baja

Media

Alta

Baja

Baja

Baja

Alta

Setup Inicial

Flexibilidad

Dos versiones de Realtime


Esttico
Los archivos de texto se guardan en BD
Es necesario hacer un reload tras cada cambio
La nica diferencia es la ubicacin (BD vs. archivos)

Dinmico
Los valores se leen solo cuando se necesitan
No se guardan en memoria
Permite actualizar sin recargar
Solo algunos archivos lo soportan (extensions, sip, iax,
voicemail y queues)

Los archivos de texto son excelentes para iniciar,


pero no son tan flexibles ni escalan tan bien como
Realtime
Integracin con bases de datos

58

59

Integracin con bases de datos

60

Requerimientos

Configurando Realtime

1. Escoger el manejador de base de datos:

Creamos un nuevo perfil en res_odbc.conf para la


conexin con Realtime

MySQL, PostgreSQL, SQLite3, LDAP, ODBC

2. Configurar el archivo del modulo que le permita a


Asterisk interactuar con el manejador escogido
res_config_mysql.conf, res_odbc.conf, etc

3. Crear la familia necesaria en extconfig.conf


En los ejemplos siguientes veremos la configuracin
con ODBC
Integracin con bases de datos

61

Configurando Realtime (2)


Por cada tabla a consultar por Realtime, necesitamos
crear una familia en el archivo extconfig.conf
[settings]
<familia> => <controlador>,<conector>,<tabla>
Donde:
<familia> es una referencia a Realtime
<controlador> es el tipo de BD a usar (ODBC, MySQL,, etc)
<conector> es el nombre del perfil creado para esta
conexin (res_config_mysql.conf, res_odbc.conf, etc)
<tabla> es la tabla para esta familia de Realtime
Integracin con bases de datos

En este ejemplo, usamos el mismo DSN que el que definimos


para nuestra conexin del CDR
[realtime-asterisk]
enabled => yes
dsn => MySQL-asterisk
username => realtimeuser
password => realtimepass
pre-connect => yes

Con esto le indicamos a Asterisk que futuras conexiones


utilizarn estas credenciales
Darle los privilegios necesarios al usuario realtimeuser en MySQL
Integracin con bases de datos

62

Ejemplo: extconfig.conf
Segn el manejador que elijamos (ODBC,MySQL, etc)
debemos crear el conector en el archivo adecuado
(res_odbc.onf, res_config_mysql.conf, etc)
[settings]
sippeers
=> odbc,realtime-asterisk,rt_sipfriends
sipusers
=> odbc,realtime-asterisk,rt_sipfriends
extensions => odbc,realtime-asterisk,rt_extensions
; Tambin podemos mezclar diferentes conectores/manejadores
saldos
=> mysql,crmdb,clientes

Se puede escoger cualquier nombre para los [conectores]


y para las tablas
Solo hay que recordar hacer referencia al nombre correcto

63

Integracin con bases de datos

64

Configurando Realtime (3)

Realtime SIP
Almacena la configuracin de usuarios SIP

Por default, el nombre de la familia se usa como tabla

Configuracin general permanece en sip.conf

sipusers => mysql,asterisk


es igual a
sipusers => mysql,asterisk,sipusers

La tabla puede tener cualquier campo para SIP,


aunque no se usen todos

Debemos ocupar una tabla diferente para cada familia

Si no se llenan, Asterisk usar los default


Podemos crear una tabla bsica, con solo 4 campos

Los campos que cada familia requiere son nicos


Comnmente, solo se comparten tablas para users/peers

Asterisk automticamente empieza a leer las tablas


en cuanto encuentra las familias:

El formato de la tabla est regido por el nombre de los


campos requeridos
La tabla extensions requiere de campos context, exten y priority
La tabla de sippeers requiere de host, type, username y context
Integracin con bases de datos

sippeers
sipusers
65

Realtime SIP (2)

Integracin con bases de datos

66

Realtime extensions

Recordar que al usar Realtime no se guardan en


memoria los peers registrados

Se puede usar para casi cualquier tipo de extensin


(ej. no macros)

El sip show peers regresar vacio

El resto debe existir en extensions.conf

Si queremos habilitar que se guarden en memoria, es


necesario activar el cache:
rtcachefriends=yes

Tras activar el cache, re-registramos los telfonos


para que se muestren

switch => Realtime/[contexto]@[familia]


Para poder invocar Realtime correctamente

Si [contexto] no se especifica, se usar el actual


Si [familia] no se especifica, se toma la palabra
extensions

A partir de este momento comienzan a almacenarse en


memoria
Integracin con bases de datos

En extensions.conf es necesario usar:

67

Integracin con bases de datos

68

Realtime extensions (2)

Todo relacionado

No hay que olvidar de utilizar switch

; /etc/asterisk/extensions.conf
[internas]
switch => Realtime/internas@extensions

[micontexto]
switch => Realtime/@

; /etc/asterisk/extconfig.conf
sipusers => odbc,realtime-asterisk,rt_sipfriends
extensions=> odbc,realtime-asterisk,rt_extensions

es lo mismo que usar


[micontexto]
switch => Realtime/micontexto@extensions

; /etc/asterisk/res_odbc.conf
[realtime-asterisk]
dsn => MySQL-asterisk
[cdr-asterisk]
dsn => MySQL-asterisk

Siempre es necesario utilizar switch, o nunca se


buscarn extensiones en la BD
Integracin con bases de datos

69

; /etc/asterisk/cdr_odbc.conf
[general]
dsn => cdr-asterisk

Integracin con bases de datos

70

Funcin REALTIME
Una funcin muy poderosa que nos permite consultar
o cambiar valores de una tabla

Prctica 9.2

Se requiere de una familia para poder usarse

Sintaxis para lectura


Set(Fila=${REALTIME(familia,columna,valor,sep1)})

Sintaxis para escritura

Realtime SIP y
Realtime extensions

Set(REALTIME(familia,columna,valor,campo)=nuevo)

71

Integracin con bases de datos

72

Leer valores

Escribir valores

REALTIME nos regresa una cadena de texto

Ejemplo:
Set(REALTIME(saldos,usuario,100,saldo)=302)

Ejemplo:

Es equivalente a
UPDATE saldos
SET saldo='302'
WHERE usuario=100

Set(Fila=${REALTIME(saldos,usuario,100,&)})

Nos arroja:
Set(Fila=usuario=100&saldo=123.45)
Es equivalente a
SELECT * FROM saldos WHERE usuario=100

Esto modificara la base de datos y guardara 302 en


el campo saldo

De ah podemos usar CUT para quedarnos con los


valores que queremos
Integracin con bases de datos

73

Integracin con bases de datos

74

Cmo funciona el CUT?


Tenemos esta lnea:
Set(Fila=${REALTIME(saldos,usuario,${CALLERID(num)},&)})

Prctica 9.3

Es equivalente a:
Set(Fila=usuario=100&saldo=1234.56)

Entonces:
Set(${CUT(Fila,&,2)})

Uso de Realtime
personalizado

Es igual a:
Set(saldo=1234.56)

75

Integracin con bases de datos

76

Plan de llamadas

Funciones personalizadas

contador

El mdulo func_odbc permite la posibilidad de crear


funciones personalizadas

Usuarios SIP
saldo
llamada

Podemos hacer cualquier consulta SQL

servicios

micontexto

No estamos limitados a consultas de Realtime


menu

Se configura desde el func_odbc.conf

permitidos

internas

salida

La sintaxis es como sigue:

permitir

adicional

[FUNCION]
dsn=<nombre del DSN en Asterisk>
readsql=<query de lectura>
writesql=<query de escritura>

sucursal

entrada

IAX autenticados

PSTN/
Vecinos IAX

IAX annimos
Integracin con bases de datos

77

func_odbc

Integracin con bases de datos

78

Ejemplo 2:
[menu]
; extensions.conf
exten => s,1,Playback(welcome)
same => n,GotoIf($[${ODBC_PASS(${CALLERID(num)})}=""]?:YaTiene)
same => n,Playback(no-tiene-pass)
same => n(Regresa),Read(pass1,ingrese-pass)
same => n,Read(pass2,confirme-pass)
same => n,GotoIf($[${pass1}=${pass2}]?:Regresa)
same => n,Set(ODBC_PASS(${CALLERID(num)})=${pass1})
same => n,Goto(continua)
same => n(YaTiene),Read(pass,please-enter-your)
same => n,GotoIf($[${pass}=${ODBC_PASS(${CALLERID(num)})}]?:YaTiene)
same => n(continua),Playback(demo-congrats)
same => n,Hangup

Ejemplo de funcin que consulte/actualice un saldo


(func_odbc.conf):
[SALDO]
dsn=realtime-asterisk
readsql=SELECT saldo FROM saldos WHERE usuario=${ARG1}
writesql=UPDATE saldos SET saldo=${VAL1} WHERE usuario=${ARG1}

Se invoca como una funcin simple


(extensions.conf)
[micontexto]
exten => *333,1,Set(saldo=${ODBC_SALDO(${CALLERID(num)})})
same => n,Set(ODBC_SALDO(${CALLERID(num)})=$[${saldo}/2])
same => n,Macro(saldo,${saldo})
Integracin con bases de datos

[PASS]
; func_odbc.conf
dsn=realtime-asterisk
readsql=SELECT pass FROM usuarios WHERE usuario = '${ARG1}'
writesql=UPDATE usuarios SEt pass = '${VAL1}' WHERE usuario = '${ARG1}'
79

Integracin con bases de datos

80

Prctica 9.4 (opcional)


Crear una funcin personalizada
ODBC

81

Recapitulando

Captulo Avanzado #1
Asterisk Extensions
Language (AEL)

El dialplan se define en extensions.conf


Pueden incluirse contextos dentro de otros
Para todo movimiento en el dialplan, tiene que existir
una extensin y prioridad asignada
La sintaxis base es:
exten => <extensin>,<prioridad>,<aplicacin>

Ing. Christian Cabrera R.

Ejemplo
exten =>_ZXXXXXXX,1,Dial(SIP/amx/${EXTEN})

Asterisk Extensions Language

Introduccin

AEL 2.0

Algunas funciones (ej. ciclos) son difciles de


programar en el dialplan bsico

Sintaxis ms similar a un lenguaje de programacin

Analizar un dialplan puede resultar complicado tras


seguir instrucciones como goto y gosub

Permite crear estructuras ms uniformes para el


manejo de extensiones

Programadores preferirn esta sintaxis

Menos cdigo intil, ms trabajo con menos

Se decide crear un lenguaje de programacin de


extensiones, conocido como Asterisk Extension
Language (AEL)
Asterisk Extensions Language

Se configura en el archivo extensions.ael


3

Asterisk Extensions Language

Sintaxis general
context largadistancia {
_01XXX. => {
Answer();
Dial(SIP/user/${EXTEN});
};
// Esto es un comentario
_00XXX. => {
NoOp(No permitido);
Hangup;
/* Tambien es
un comentario
*/
};
};

Contextos

Saltos de lnea
indiferentes

Se definen con context. Un contexto va delimitado


por sus llaves respectivas

Bloques contenidos entre


{ y };
Fin de comando con ;
Asignacin de variables
natural

Hay que cuidar no dejar extensiones fuera del


contexto

Comentarios con //
(monolnea) y /* */
(multilnea)
Asterisk Extensions Language

Siempre terminar la ltima } con ;


5

Extensiones
context default {
1234 => Playback(tt-monkeys);

8000 => {
NoOp(uno);
etiqueta:
NoOp(dos);
NoOp(tres);
};

<extensin> => {
<aplicacin 1>;
<aplicacin 2>;
};

Las prioridades ya no se
numeran, pero deben ser
escritas en orden

Asterisk Extensions Language

Inclusiones de contextos

Sintaxis:
<extensin> => <aplicacin>;

context default {
// Las extensiones van aqu
};

_5XXX => goto 8000,etiqueta;


};

Todos los includes deben estar contenidos en el mismo


bloque:
context default {
includes {
longdistance,16:00-23:59,mon-fri,*,*;
local;
};
};
Tambin pueden incluirse archivos enteros usando #include
#include more_extensions.ael
No olvidar que al dejar {} abiertos en un archivo, continan
abiertos en los que siguen

Asterisk Extensions Language

Asterisk Extensions Language

Variables

Ciclos

Las variables y funciones se asignan directamente sobre el dialplan:

Soporte para for y while

context default {
100 => {
CALLERID(num)=1234567890;
NoOp(Mi CID es ${CALLERID(num)});
};
};

El valor intermedio tambin es evaluado ( $[] )

El lado derecho de la asignacin es evaluado, de manera que estas


expresiones son equivalentes:
MIVAR=10/2;
Set(MIVAR=$[10/2])
Cuidado con lneas como
Fila=${REALTIME(saldos,usuario,100,&)};
Fila=usuario=100&saldo=1234.56;
Asterisk Extensions Language

x=${x}+1) {
${x});

{
${y});

Asterisk Extensions Language

10

Condicionales: ifTime,
random

Condicionales: if, else


_8XXX => {
Dial(SIP/${EXTEN},20);
if ("${DIALSTATUS}"="BUSY") {
NoOp(Linea ${EXTEN} ocupada);
Busy(10);
}
else
Voicemail(${EXTEN},u);
Hangup;
};

iftime sigue la
misma sintaxis
que en los
includes
random es til
para tareas
aleatorias

Tener cuidado de no cerrar el if antes del else


Hacer esto: if {} else {};
Pero no esto: if {}; else {};
Lo mismo aplica para el resto de los condicionales
Asterisk Extensions Language

context ciclos {
1 => {
for (x=0; ${x}<3;
Verbose(x vale
};
};
2 => {
y=10;
while (${y} >= 0)
Verbose(y vale
y=${y}-1;
};
};
};

11

_8XXX => {
ifTime (9:00-18:00,mon-fri,*,*)
goto horario-habil,s,1;
else {
NoOp(No hay nadie para atender);
Playback(fuera-de-horario);
};
random(51)
);
NoOp(Esto aparecer el 51% de las veces);
random(60)
);
NoOp(Este aparecer el 60% de las veces);
else {
random(75)
NoOp(Esto aparecer un 30%);
else
NoOp(Esto aparecer el otro 10%);
};
};
Asterisk Extensions Language
12

Macros

Condicionales (switch)

Se definen e invocan como si fueran funciones de un


lenguaje de programacin

Equivalente a un if anidado
_888Z => {
switch(${EXTEN}) {
case 8881:
NoOp(Marcaste 8881!);
break;
pattern 888[3-9]:
NoOp(Marcaste 888 algo!);
break;
default:
NoOp(Esta es la clausula default);
};
};

Reciben variables en vez de argumentos


macro llamada(exten,voicemail) {
Dial(Local/${exten}@default);
if (${DIALSTATUS} = BUSY)
Voicemail(${voicemail},b);
else
Voicemail(${voicemail},u);
};

Para invocar un macro, se hace con un & al inicio


&llamada(0140,0120);

Qu nmero nunca se activa en el ejemplo?


Asterisk Extensions Language

context menu {
s => {
Playback(welcome);
if (${ODBC_PASS(${CALLERID(num)})}="") {
Playback(no-tiene-pass);
Cuenta=0;
Regresa:
Cuenta=${Cuenta}+1;
Read(pass1,ingrese-pass);
Read(pass2,confirme-pass);
if (${pass1}!=${pass2}) {
if (${Cuenta}>=3)
goto Fin;
goto Regresa;
};
Set(ODBC_PASS(${CALLERID(num)})=${pass1});
}
else {
PidePass:
Read(pass,please-enter-your);
if (${pass}!=${ODBC_PASS(${CALLERID(num)})})
goto PidePass;
};
Playback(demo-congrats);
Fin:
Hangup;
}; // Cierre de s
Asterisk Extensions Language
}; // Cierre de contexto

13

Asterisk Extensions Language

; extensions.ael

Prctica 10.1
Crear un pseudo marcador predictivo
usando Realtime y ciclos

15

14

Plan de llamadas
contador

Captulo Avanzado #2
Asterisk Gateway
Interface (AGI)

Usuarios SIP
saldo
llamada

servicios

micontexto

micontexto-ael
menu

internas
adicional

entrada

permitidos
salida
permitir

Ing. Christian Cabrera R.

sucursal
PSTN/
Vecinos IAX

IAX autenticados
IAX annimos

Asterisk Extensions Language

17

Recapitulando

Introduccin

Tenemos control del dialplan a partir del


extensions.conf

AGI no es un lenguaje: es una interfaz para controlar


Asterisk
No est ligado a ningn lenguaje en especfico
Podemos usar Perl, PHP, Python, C, Java, Bash, etc

Existe una lgica de programacin ms avanzada


utilizando extensions.ael

Los scripts se colocan en la carpeta


/var/lib/asterisk/agi-bin

An con estas caractersticas ms avanzadas, algunas


funciones resultaran muy complejas de programar
utilizando el plan de llamadas
Asterisk Gateway Interface

19

Similar al CGI de Apache


Se interactua con Asterisk a traves de flujos de datos:
STDIN, STDOUT y STDERR
Asterisk Gateway Interface

20

Flujos

Flujos (2)

Por cada escritura que se haga al STDOUT, existe una


lectura en el STDIN
Script
AGI

Escribimos en el STDOUT para enviar comandos

AGI(script.agi)

Ext. 777

get data "please-enter-your"

"Por favor ingrese su"

data=12345, result=200

Ingresa "12345"

stream file "usuario-valido"


Procesamiento
interno en BD

Leemos del STDIN para obtener respuestas

"Su usuario es vlido"

Y el proceso puede repetirse indefinidamente


AGI enva comandos a Asterisk

Escribimos en el STDERR para hacer notificaciones de


sistema

El AGI toma todas las decisiones

Asterisk enva respuestas al AGI

Hacia Linux, no hacia Asterisk

Asterisk solo es un intermediario entre usuario <-> AGI


Asterisk Gateway Interface

21

PHPAGI

Asterisk Gateway Interface

22

Ejemplo de AGI

Es una clase para PHP que nos permite ahorrar


cdigo

Reproducir los nmeros del 1 al 10:


#!/usr/bin/php q
<?php
include phpagi.php;
$agi = new AGI();

Permite concentrarnos en la aplicacin

Maneja automticamente el flujo de datos


Solo invocamos mtodos de la clase y se nos entrega el
resultado, sin preocupaciones de formato

foreach (range(1,10) as $x) {


$agi->say_number($x);
}
$agi->hangup();
?>

Creamos una instancia de la clase para despues


enviar/leer comandos desde all
$var = $agi->get_variable(CALLERID(num));

Asterisk Gateway Interface

23

Asterisk Gateway Interface

24

Comandos

Comandos (2)

AGI tiene su propia serie de comandos


Estn ligados a aplicaciones bsicas de Asterisk
An cuando la lista es reducida, cualquier aplicacin
de Asterisk est disponible para su uso con AGIs
Usar comando Exec

Asterisk Gateway Interface

answer
channel status
control stream file
database del
database deltree
database get
database put
exec
get data
get full variable
get option

get variable
hangup
noop
receive char
receive text
record file
say alpha
say date
say datetime
say digits
say number
say phonetic
say time

25

send image
send text
set autohangup
set callerid
set context
set extension
set music
set priority
set variable
stream file
tdd mode
verbose
wait for digit

Asterisk Gateway Interface

Prctica 11.1

Captulo Avanzado #3
Asterisk Manager
Interface (AMI) y archivos
de llamadas

Crear un juego interactivo


usando AGIs

Ing. Christian Cabrera R.

26

Recapitulando

Asterisk Manager Interface

Nuestro conocimiento del plan de llamadas es


reactivo

El AMI es una interfaz computadora-PBX


Fue pensado para permitir el control de Asterisk desde
software ajeno al PBX
Poco amigable para un humano, pero fcil de procesar por
un sistema

Creamos extensiones esperando que alguien las marque y


actuamos acorde

En ocasiones, tenemos necesidad de que Asterisk


haga llamadas sin nadie que las origine

Su puerto default es el TCP 5038

Marcadores predictivos, sistemas automticos, etc

Comunicacin en texto plano

Existen 2 maneras de instruir a Asterisk a que haga


llamadas

Asterisk Manager Interface

Se recomienda un tnel SSH para resolver esto


Asterisk 1.6+ soporta uso de TLS

29

Funciones principales

Asterisk Manager Interface

30

Envo de comandos

Solicitar nuevas llamadas

Los datos que se envan al AMI tienen la sintaxis:


Campo: valor

Grabar bajo demanda

Segn la accin que se enve (Login, Originate,


Command, etc) son los campos a enviar.

Transferir/colgar llamadas
Ejecutar comandos del CLI

Para ver la lista completa de acciones, usar

Acceso remoto al AstDB

*CLI> manager show commands

Obtener el estado de las extensiones

Un doble salto de lnea significa que el grupo de


valores termino y que el AMI debe procesar la
solicitud

Editar archivos de configuracin


Recibir informacin de eventos del sistema
Asterisk Manager Interface

31

Asterisk Manager Interface

32

Ejemplo de autenticacin

Archivo: manager.conf

Conexin por telnet al puerto TCP 5038

Aqu se activa el AMI y conceden los permisos

amx:~# telnet 127.0.0.1 5038


Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Asterisk Call Manager/1.1
Action: login
Username: admin
Secret: mysecret

Siempre restringir a 127.0.0.1


[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0

Response: Success
Message: Authentication accepted

Para que el login sea vlido, debe existir un usuario creado en


el manager.conf
Asterisk Manager Interface

[admin]
secret = mysecret
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,agent,user,config,dtmf,
reporting,cdr,dialplan
write = system,call,agent,user,config,command,reporting,
originate

33

Usos del AMI

Asterisk Manager Interface

34

Solicitando llamadas
Tras hacer login, ejecutamos un comando como el
que sigue

Ventanas emergentes para agentes


Sistemas de callcenter que le dan al agente informacin
sobre quien le llama

Tener cuidado con la escritura, ya que el AMI no se lleva


bien con los errores

Aplicaciones de marcado automtico

Action: Originate
Channel: SIP/100
Context: micontexto
Exten: 200
Priority: 1
Timeout: 10000
ActionId: ABCDE12345

Click 2 dial
Llamadas via web
Marcadores automticos/predictivos

Monitoreo del sistema

Esto es equivalente a hacer un

Consolas de operadora (Flash Operator Panel)

*CLI> originate SIP/100 extension 200@micontexto


Asterisk Manager Interface

35

Asterisk Manager Interface

36

Interactuando con el AMI

Call files

El AMI es la manera ms poderosa de controlar


Asterisk

Los archivos de llamada son comandas de llamadas


Instrucciones en texto que le dicen a Asterisk a quien, como
y cuando llamar

Por obvias razones, el AMI no es user-friendly


El AMI nunca se pens para que un humano lo usara

Se colocan en la carpeta
/var/spool/asterisk/outgoing

Existen clases en diferentes lenguajes que nos


permiten conectarnos fcilmente al AMI

Sintaxis muy similar al Originate de AMI

Ej. AGI_AsteriskManager() de PHPAGI

Nota: los archivos deben ser movidos, no copiados


Si un archivo se copia al momento que se est creando,
puede dar problemas

Existe algo ms sencillo para hacer que Asterisk


solicite llamadas?
Asterisk Manager Interface

37

Ejemplo de call file

Asterisk Manager Interface

38

Controlando los tiempos

Creamos un archivo

Los archivos de llamada nos permiten especificar la


hora en que se ejecutarn

nano /root/test.call

Si cambiamos la fecha de modificacin al futuro, Asterisk


leer los archivos solo si la hora ocurre
Esto se logra con el comando touch

Channel: SIP/usuario2
Application: Playback
Data: demo-congrats

Movmoslo a la carpeta adecuada


mv /root/test.call /var/spool/asterisk/outgoing

Qu ocurre?
Podemos consultar todos los campos igual que con el
comando Originate del AMI

Es posible programar cientos de archivos para que


sean leidos al futuro
Esto facilita hacer campaas de marcacin que no pasen de
X llamadas por minuto

*CLI> manager show command originate


Asterisk Manager Interface

39

Asterisk Manager Interface

40

Prctica 12.1

Captulo Avanzado #4
Cifrado de llamadas en
SIP

Crear un verdadero marcador predictivo que lea un


saldo adeudado

Ing. Christian Cabrera R.

Recapitulando

Antecedentes

Asterisk usa SIP como su principal protocolo de


comunicacin

Asterisk 1.4

Una llamada SIP viaja en 2 flujos diferentes:

Asterisk 1.6

No exista mecanismo de seguridad para SIP

La sealizacin (5060 UDP)


La voz (RTP aleatorio)

Se soporta SIP sobre TCP


Se agrega soporte experimental para TLS (solo se encripta
la sealizacin)

Por default, ninguno de los dos va cifrado


Cualquiera que intercepte los paquetes puede reconstruir la
conversacin

Cifrado de llamadas en SIP

43

Asterisk 1.8
Se soporta TLS completamente
Se agrega soporte para Secure RTP (SRTP). La voz viaja
cifrada
Cifrado de llamadas en SIP

44

Transport Layer Security


(TLS)

Flujo del handshake

Es un protocolo criptogrfico extensible para


intercambio seguro de datos
Continuacin/evolucin de SSL (Secure Sockets
Layer)
Versin actual: TLS 1.2
TLS 1.2 > TLS 1.1 > TLS 1.0 > SSL 3.0

Cifrado de llamadas en SIP

45

Cifrado de llamadas en SIP

TLS Handshake
Cliente

Servidor

TLS Handshake (2)

Resultado

Cliente

Cliente enva el # de la ms alta versin de TLS


soportada, un nmero aleatorio, algoritmos de
cifrado y compresin posibles

ClientHello

46

Servidor

Resultado

ChangeCipherSpec

Todo lo que venga a continuacin viene


autenticado/cifrado

Finished

Se enva un hash del condensado de todos los


mensajes anteriores

Servidor escoge la versin de TLS ms alta


posible y los algoritmos a usar. Enva un nmero
aleatorio

ChangeCipherSpec

Todo lo que venga a continuacin viene


autenticado/cifrado

Certificate

Servidor enva su certificado para que cliente


pueda autenticarlo

Finished

Se enva un hash del condensado de todos los


mensajes anteriores

ServerHelloDone

Servidor finaliza handshake

ServerHello

ClientKeyExchange
MasterSecret

A partir de aqu, todo viaja encriptado

Cliente enva PreMasterSecret, llave pblica o


nada (segn algoritmo elegido)
Se calcula el MasterSecret

Cifrado de llamadas en SIP

47

Cifrado de llamadas en SIP

48

Configurando Asterisk
para TLS

Creando la llave y
certificado
Ya existe un script proporcionado dentro del cdigo
fuente de Asterisk:

Se necesita lo siguiente:
Un certificado digital (para el servidor)
Preparar el certificado para Asterisk
Configurar Asterisk
Opcional: Instalar el certificado de CA en el cliente

<astsrcdir>/contrib/scripts/ast_tls_cert

Lo invocamos dando los siguientes argumentos:


IP de Asterisk
Nombre de la empresa
Directorio que almacenar la llave y certificado

OpenSSL nos da herramientas para crear certificados


Podemos usar certificados autofirmados, pero eso permitira
que cualquiera nos reemplace

Cifrado de llamadas en SIP

./ast_tls_cert -C <IP> -O "<Empresa>" -d <Directorio>

El sistema nos pedir una contrasea que deberemos


confirmar para firmar nuestros certificados

49

Cifrado de llamadas en SIP

Configurando Asterisk

50

Configurando Asterisk (2)


Qu significa cada opcin en [general]?

Editamos sip.conf bajo [general]


tlsenable=yes
tlsbindaddr=192.168.1.x
tlscertfile=/etc/asterisk/certs/asterisk.pem
tlscafile=/etc/asterisk/certs/ca.crt
tlsdontverifyserver=yes
tlscipher=ALL
tlsclientmethod=tlsv1

Campo

Por ltimo, habilitamos TLS al cliente SIP (tambin


podemos bajo [general])
transport=tls
Cifrado de llamadas en SIP

51

Significado

tlsenable

Habilita el uso de TLS en todo el equipo (requiere


reiniciar Asterisk)

tlsbindaddr

Direccin IP donde escucharemos por nuevas peticiones


TLS (debe coincidir con la IP del certificado)

tlscertfile

Ubicacin del certificado para TLS

tlscafile

Ubicacin del certificado para la entidad certificadora


(CA)

tlsdontverifyserver

Activar/Desactivar la verificacin del servidor (solo se usa


cuando Asterisk trabaja como cliente)

tlscipher

Mtodos de cifrado permitidos (DES, 3DES, AES, etc)

tlsclientmethod

Versin de TLS mnima a permitir en el cliente


Cifrado de llamadas en SIP

52

Transporte seguro,
carga no

Requisitos para usar SRTP

Con TLS, los encabezados SIP ya no pueden ser


descifrados

Conseguir, compilar e instalar la librera libSRTP


http://srtp.sourceforge.net/srtp.html

Sin embargo, es posible interceptar la voz, aunque no


conozcamos los datos de la llamada

Recompilar Asterisk para agregar el soporte para el


mdulo res_srtp.so

Para hacer que la voz viaje cifrada, requerimos hacer


uso de Secure RTP (sRTP)

Editar el archivo sip.conf para habilitar la


encriptacin (encryption=yes) para cada usuario SIP
que queramos que la use.

Se soporta desde Asterisk 1.8


En versiones previas, solo era posible lograr el cifrado
completo del medio (ej. VPN), y no todos los telfonos son
capaces de soportar esto.

Cifrado de llamadas en SIP

53

Ejemplo de usuarios
SIP seguros

Cifrado de llamadas en SIP

54

Llamada con UDP

[usuario1]
type=friend
host=dynamic
context=micontexto
transport=tls
encryption=yes
secret=aYtK4I1!

Con Wireshark se observan estos paquetes:

Asterisk Manager Interface

55

Cifrado de llamadas en SIP

56

Llamada con UDP (2)

Llamada con UDP (3)

El anlisis de VoIP detecta fcilmente la llamada:

Cifrado de llamadas en SIP

Es posible graficarla:

57

Llamada con UDP (4)

Cifrado de llamadas en SIP

58

Llamada con TLS/sRTP

E inclusive, guardar el audio:

No es posible ver el contenido SIP

Cifrado de llamadas en SIP

59

Cifrado de llamadas en SIP

60

Llamada con TLS/sRTP (2)


El stream de la llamada no es detectado

Prctica 13.1
Configurar SIP mediante TLS y sRTP

Obviamente, no es posible graficarla ni reproducir el


audio
Cifrado de llamadas en SIP

61

Recapitulando

Captulo Avanzado #5
Seguridad en Asterisk

Podemos cifrar nuestras llamadas para impedir que


sean escuchadas por alguien ms
Sistemas malintencionados pasan llamadas a travs
de nuestro PBX, con costo para nosotros
Errores comunes en administracin pueden ocasionar
grandes costos (miles de dlares en una noche)

Ing. Christian Cabrera R.

Contraseas inseguras
Puertos abiertos
Validar al telfono, no al usuario

Seguridad en Asterisk

Introduccin

1) Contraseas inseguras

Instalar Asterisk es muy rpido

No usemos secret=100 si nuestro username=100

Es ms rpido an si usamos distribuciones todo en uno (ej.


Elastix o Trixbox)

Por la urgencia de levantar un sistema, podemos


descuidar algunos puntos de seguridad clave
Existen sistemas cuya nica intencin es ganar
acceso a nuestro equipo para poder cursar llamadas
Es conveniente tomar muy en cuenta las siguientes
recomendaciones de seguridad

Preferible usar contraseas aleatorias, difciles de


recordar
MD5(RAND())
openssl rand -base64 12

Si usamos distribuciones como Elastix, siempre


cambiar las contraseas default
Si mas gente la conoce, es ms fcil de atacar

Seguridad en Asterisk

1) Contraseas inseguras
En FreePBX/Elastix/Asterisk, cambiar:

Seguridad en Asterisk

2) Limitar el acceso a
ciertas IPs
Si no tenemos agentes externos, Por qu permitir
que las extensiones se registren desde cualquier IP?

root de ssh
root de MySQL
Asterisk Manager Ingerface (manager.conf)
admin de FreePBX

Usar permit y deny segn convenga en sip.conf y


manager.conf
deny=0.0.0.0/0.0.0.0
permit=192.168.1.1/255.255.255.0

Tabla MySQL asterisk.ampusers

asteriskuser en /etc/amportal.conf
admin de Elastix

Mejor an, cerrar los puertos a nivel de firewall

Tabla SQLite3 /var/www/db/acl.db

Usar iptables

Todos los usuarios SIP/IAX

Seguridad en Asterisk

Seguridad en Asterisk

3) Rechazar sin dar


informacin
Si hemos de recibir conexiones desde afuera,
entregar siempre el mismo mensaje de error

4) Limitar llamadas
simultneas
Si un atacante ganara acceso a nuestro sistema,
limitar la cantidad de llamadas simultneas posibles
No evita el dao, pero lo reduce
Usar un [macro-contador] para estos casos

Usar alwaysauthreject=yes en sip.conf

Esto impedir que los atacantes conozcan si el


usuario es vlido o no

Esto ayuda en casos que a usuarios legtimos les fue


robada su contrasea

Seguridad en Asterisk

5) Autenticar al usuario
Hay llamadas muy caras que son espordicas (ej.
Internacionales)
Podemos pedir contrasea via DTMFs

Seguridad en Asterisk

6) Negar llamadas
annimas
Definir adecuadamente el context default dentro de
[general] en sip.conf
Cualquier usuario NO autenticado puede marcar a travs de
l

Si la extensin ya se registro, pedir autenticacin al


usuario al momento de hacer llamadas
Un PIN con Authenticate es muy sencillo de implementar

Seguridad en Asterisk

Nuestro contexto default siempre debe ser limitado


Nunca permitir llamadas que puedan tener costo

Seguridad en Asterisk

8) Patrones de marcado
claros

7) Bloquear fuerza bruta


Herramientas como fail2ban pueden analizar logs y
bloquear mltiples intentos de registro
Inclusive enviar correos de la notificacin

No utilizar patrones como


_9.,1,Dial(DAHDI/g0/${EXTEN:1})

mejor usar
_9ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN:1})

Aplicable a cualquier log (SSH, HTTP, etc)

Posibilidad de ataques de inyeccin


[incoming]
exten => _X.,1,Dial(SIP/${EXTEN})
exten => _X.,n,Hangup()

Qu ocurre si el atacante enva llamada hacia


9100&DAHDI/g0/0033123456789?
Recordar que el punto (.) coincide con TODO
Seguridad en Asterisk

Seguridad en Asterisk

9) Confianza
Cuidar a que dispositivos les permitimos la
autenticacin sin contrasea
insecure=invite
Siempre usar permit/deny en conjuncin con insecure

Prctica 14.1

No usar el parmetro de host como una restriccin de


IP
Para eso existe permit/deny

Aseguramiento del conmutador

Seguridad en Asterisk

Asterisk Manager Interface


76

Qu les pareci el curso?

Contacto

Queremos que la siguiente experiencia sea an


mejor, as que pedimos su muy valioso apoyo para
contestar una encuesta sobre el curso

Christian Cabrera R.
christian@enlaza.mx
(55) 50 181 181
SIP/enlaza.mx
Twitter y Facebook:
@AsteriskMX

enlaza.mx/encuesta
Es annima
No tienen que proporcionar su nombre si no lo desean

@EnlazaMX
Asterisk Manager Interface

77

Asterisk Manager Interface

78

También podría gustarte