Curso Asterisk Enlaza

July 17, 2016 | Author: Manoel Canto | Category: Types, Presentations
Share Embed Donate


Short Description

Asterisk IP PBX open source configuration course in spanish....

Description

¿Qué es Asterisk? Es software open source

Capítulo Básico #1 Introducción 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 comunicación, no solamente voz Introducción a Asterisk

Uso actual

2

Versiones de Asterisk

Más de 1 millón de servidores Asterisk en producción hoy en día

Versiones inferiores a 1.8 se consideran obsoletas • Sin soporte oficial. Se recomienda actualizar.

• 1000+ descargas diarias en código fuente

Asterisk 11 es lo recomendado hoy en día

Múltiples 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 Introducción a Asterisk

3

Versión

Tipo

Fecha de lanzamiento

Actualizaciones de seguridad

Fin de vida

1.4.X

LTS

Dic 2006

Abr 2011

Abr 2013

1.6.2.X

Estándar

Dic 2009

Abr 2011

Abr 2012

1.8.X

LTS

Oct 2010

Oct 2014

Oct 2015

10.X

Estándar

Dic 2011

Dic 2012

Dic 2013

11.X

LTS

Oct 2012

Oct 2016

Oct 2017

12.X

Estándar

Oct 2013

Oct 2014

Oct 2015 Introducción a Asterisk

4

Diferencias con un PBX convencional

Dos tipos de versiones LTS (Long Term Support)

No se requiere hardware propietario

• Permanencia mínima de 5 años en el mercado • Orientado a estabilidad • Mejor opción para empresas

• Muchos fabricantes ofrecen productos similares • Hardware “genérico” intercambiable • Diferentes soluciones de diferentes fabricantes • Libre competencia = mejores precios y productos

Estándares

Sigue una arquitectura universal de PC

• Dos años de vida • Orientado a impulsar nuevas funcionalidades • Apta para entusiastas y desarrolladores de nuevas tecnologías

• 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

Introducción a Asterisk

5

Diferencias (2)

Introducción a Asterisk

6

Escenarios de uso

Totalmente programable y configurable

Hay muchas maneras en las que podemos aprovechar las características de Asterisk, entre ellas:

• No es necesario solicitar servicios especiales ni comprar módulos extras • Todo se hace a través de software

• PBX tradicional • PBX IP • PBX híbrido • 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 • Interconexión a través de puertos análogos/digitales Introducción a Asterisk

7

Introducción a Asterisk

8

PBX tradicional

PBX VoIP

Introducción a Asterisk

9

PBX híbrido

Introducción a Asterisk

10

Introducción a Asterisk

12

Pasarela VoIP

Introducción 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 ubicación

Es un back-to-back user agent (B2BUA) • Se comporta como un servidor y un teléfono de manera simultánea • Controla una llamada estableciendo comunicación individual con cada parte (y luego puentea la llamada) • Es un cliente multi-sesión, multi-usuario • Convierte la comunicación entre canales Introducción a Asterisk

13

Introducción a Asterisk

14

¿Qué es lo que NO es Asterisk?

B2BUA vs Proxy

No es un SIP proxy

Proxy

• Por definición, un proxy nunca es parte del fin de la llamada (ej. Voicemail, IVRs, etc) • Un proxy solo hace reenvío de paquetes, manejando las llamadas en nombre de otros usuarios (Asterisk las procesa completamente en señalización 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

Introducción a Asterisk

15

Introducción a Asterisk

16

Requisitos de hardware

Requisitos de hardware (2)

Lo más 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 más 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 acción (grabar, consultar BD, reproducir audios, etc) reducen la capacidad del sistema

Cualquier PC es buena para pruebas

El procesamiento necesario se mide según 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 más importante es la cantidad de llamadas concurrentes. • Soluciones basadas en ARM son aptas para pequeños entornos.

Espacio en disco dependiente de grabaciones

• Códec * horas de llamada * llamadas simultáneas * dias a permanecer

Pueden usarse entornos virtualizados

• Limitados a hardware PSTN externo conectado por IP Introducción a Asterisk

17

Requisitos de software

18

DAHDI Para la interacción con tarjetas (Digium, Sangoma, Openvox, etc), Asterisk requiere de las librerías de DAHDI

Preferentemente, Linux nativo • FreeBSD y Mac OS tienen soporte parcial

• Digium Asterisk Hardware Device Interface

Asterisk requiere de paquetería 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

Introducción a Asterisk

• Esto solo aplica para dispositivos USB y PCI/PCI-e • Para conectar hardware externo se hace a través 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 módulo dahdi_dummy que se usa al crear conferencias con Meetme y troncales IAX.

En Debian instalamos todas con apt-get build-dep asterisk Introducción a Asterisk

19

Introducción a Asterisk

20

Librerías extras para Asterisk

DAHDI (2) DAHDI tiene su propia lista de dependencias

Cualquier librería que agregue funcionalidades a Asterisk (ej. openr2 o libsrtp) debe ser instalada antes de compilar Asterisk.

• Principalmente, necesitamos los encabezados de la misma versión del kernel de Linux que estamos usando • Los headers podemos conseguirlos fácilmente: En CentOS: yum install kernel-devel En Debian: apt-get install linux-headers-

En caso de que Asterisk ya esté instalado, tendremos que repetir el proceso de instalación para que use las nuevas librerías.

Si queremos usar enlaces digitales (E1s), necesitamos más librerías:

• Siempre es posible agregar funcionalidades sobre la marcha. • Durante el curso tendremos que recompilar Asterisk en varias ocasiones para aprender a agregar librerías.

• libopenr2 si usaremos enlaces con R2 modificado • libpri si usaremos enlaces con ISDN PRI

En nuestra práctica de DAHDI aprenderemos como compilar estas librerías para su uso Introducción a Asterisk

21

Instalando Asterisk

Introducción a Asterisk

22

Compilando Asterisk La última versión de Asterisk está disponible desde http://asterisk.org

Tenemos 2 alternativas: • Instalar desde RPMs o DEBs (fácil) • Compilar desde código fuente (difícil)

Los RPMs nos permiten instalar paquetes de manera fácil y rápida, así como cumplir sus dependencias • Sin embargo, son paquetes pre-hechos, lo que quiere decir que no es tan fácil personalizarlos

El proceso para compilar es muy parecido al de otros paquetes de software: • Descargar el paquete (normalmente, con wget, o también podemos copiarlo desde nuestro equipo por SFTP). • Desempaquetar el código fuente (usando tar). • Entrar al directorio ya desempaquetado. • Compilar (normalmente con make) • Instalar

Compilar el código fuente nos da máximo control • Toma más tiempo, es más trabajo, más cosas pueden salir mal, pero creamos un sistema a la medida

Obviamente, nos iremos por el camino difícil ;-) Introducción a Asterisk

• El histórico de versiones, parches y otros componentes, se consigue desde http://downloads.digium.com

23

Introducción 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 compilación 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 código fuente : Copiar a las carpetas necesarias : Crear scripts de autoarranque : Crear ejemplos de configuración

Nunca debemos ejecutar make samples en un sistema que ya fue configurado • De lo contrario sobreescribiremos nuestra configuración 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 serán repetidos constantemente durante el curso.

• El siguiente paso sería arrancarlo y configurarlo. Introducción a Asterisk

25

Iniciando Asterisk

Introducción 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’ (más detalle)

Al ejecutar Asterisk como un comando, la consola se queda pegada a la sesión del usuario que estemos ocupando (normalmente root)

Para arrancarlo como servicio /etc/init.d/asterisk start

• Si cerramos nuestra sesión de usuario, Asterisk se cerrará también. • Por esta razón, este método se ocupa solamente cuando queremos hacer pruebas y debug de nuestro sistema.

Una vez que Asterisk ya está ejecutándose: • Para acceder a la consola lo hacemos con: asterisk –r • Si nos da un error de conexión, arranquémoslo primero como servicio y reintentemos

Al ejecutarlo como servicio, permanece activo aunque nuestra sesión se cierre • Asterisk sigue corriendo en segundo plano.

Introducción a Asterisk

27

Introducción 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

• Es conveniente familiarizarse con los comandos.

Introducción a Asterisk

29

Introducción a Asterisk

30

Configurando Asterisk

Práctica 1.1

La manera más simple de configurar Asterisk es a través de archivos de texto • En modalidades más avanzadas podemos usar el CLI, el AMI o bases de datos • Veremos todo eso más adelante

Los archivos se ubican en /etc/asterisk Instalación de Asterisk

• Tienen extensión *.conf • Sintaxis muy similar a archivos *.ini

Introducción a Asterisk

32

Archivos de configuración

asterisk.conf

Hay muchos, pero estos son los más importantes:

Archivo maestro de configuración • Le indica a Asterisk donde buscar o crear otros archivos

Archivo

Función

asterisk.conf

Configuraciones que afectan a todo el sistema:

Especifica las rutas default y ajusta opciones generales de todo el conmutador

• Límite de llamadas en general • Estructura de archivos de sonido • Nombre de este equipo (en caso de tener más 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

Introducción a Asterisk

33

sip.conf

Introducción a Asterisk

34

iax.conf

Configuración 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á más a detalle en el módulo intermedio

Aquí se configuran tanto teléfonos SIP como proveedores (troncales) SIP • No confundir usuarios SIP con extensiones • Las extensiones se declaran en el extensions.conf Introducción a Asterisk

35

Introducción a Asterisk

36

chan_dahdi.conf

extensions.conf Aquí se define el plan de llamadas

Toda la tarjetería 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 análogas (FXO) • Extensiones análogas (FXS)

Requiere de la configuración 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 capítulo a explicar esto

Se verá más a detalle adelante

Similar a un archivo de programación La mayoría del curso se centra en este archivo Introducción a Asterisk

37

Introducción a Asterisk

En resumen Asterisk fue escrito por Mark Spencer

Capítulo Básico #2 Configuración 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 • Actúa como un teléfono y un servidor al mismo tiempo

Necesitamos cumplir dependencias para instalar Asterisk • Muy recomendado instalar DAHDI • Los archivos de configuración se guardan en /etc/asterisk Introducción a Asterisk

39

Ing. Christian Cabrera R.

38

Introducción

Sintaxis de archivos *.conf

La configuración inicial de Asterisk es a través 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 métodos más complejos

El contexto determina el nombre de la sección en la que estamos trabajando

Todos los archivos pueden ser modificados directamente desde la consola

• Los campos especifican los detalles de configuración

Estructura base:

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

[contexto] campo1=valor1 campo2=valor2

Configuración de Asterisk

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

[contexto] exten => ,,

es cualquier valor alfanumérico es el orden con el que se ejecutarán las diversas aplicaciones es el comando a ejecutar

Configuración 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 Configuración de Asterisk

64

Extensiones especiales

Extensión “s” (start) GDL

MEX Extensión Significado

Función

t

timeout

Extensión que llega al no ingresar dígitos dentro del tiempo establecido

T

absolute timeout

Se activa automáticamente cuando la llamada cumple con la duración especificada por ${TIMEOUT(absolute)}

h

hangup

Activada al colgar un canal

i

invalid

Activada al teclear una extensión 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

s

start

s

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

Extensión default de entrada Configuración de Asterisk

101 65

101 Configuración de Asterisk

Prioridades

66

Ejemplos de prioridades Extensión escrita en desorden pero numerada

Determinan el orden de ejecución 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 extensión • El orden debe ser consecutivo

La misma extensión 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 más fácil al no tener que renumerar Configuración de Asterisk

67

Configuración de Asterisk

68

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

Práctica 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 marcación Configuración 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 dígitos: Patrón

micontexto

Dígitos que reemplaza

X

Dígitos entre 0 y 9

Z

Dígitos entre 1 y 9

N

Dígitos entre 2 y 9

[x-y] .

Cualquier dígito comprendido en el rango uno o más dígitos cualesquiera

Todos los patrones deben ser precedidos por “_” para no ser descartados al momento de marcarlos Configuración de Asterisk

71

Configuración de Asterisk

72

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

Patrones (3) En caso de que más de un patrón coincida, Asterisk los ordena del más específico al más general:

Dígitos 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. Configuración de Asterisk

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

Por lo que si marcamos un número 019001234567: • _01NXXXXXXXXX • _01900XXXXXXX Siempre coincide primero el 01900 por ser el más específico

Considerar esto al momento de permitir/negar patrones

73

Configuración de Asterisk

Atención especial a los patrones

74

Variables Mismo concepto que en un lenguaje de programación

[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 marcáramos hacia 019001234567, ¿la llamada pasaría o se colgaría? R: La llamada pasaría • Si bien no hay un Dial explícito que la deje salir, al no colgarse la llamada coincide con el patrón _01ZXXXXXXXXX prioridad 2. • Siempre colgar la llamada cuando no deba continuar. Configuración de Asterisk

Números/letras (1 única coincidencia) Rangos [ ] (coincidencias de 1 a 7 dígitos) 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 símbolos ${ } • El ${ } solo se usa al invocar, no al guardar el valor Configuración de Asterisk

76

Variables globales

Variables de canal

Se declaran en la sección [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 aplicación 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 Configuración de Asterisk

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

77

Configuración de Asterisk

Variables de entorno

78

Variables heredadas

Variables de Linux que se pueden acceder desde Asterisk

Heredadas

Se acceden con la función ${ENV(variable)}

Heredadas indefinidamente

• Llevan un guión bajo _ • Solo están 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á vacío, Var2 dará 2 y Var3 dará 3 same => n,Dial(Local/nivel2@micontexto)

Configuración de Asterisk

79

exten => nivel2,1,Noop(Var1 es ${VAR1}, Var2 es ${VAR2}, Var3 es ${VAR3}) ; Var1 dará vacío, Var2 dará vacío y Var3 dará 3 Configuración de Asterisk

80

Manipulando variables Se usa la sintaxis: ${[::[]]} • Ejemplo ${MIVAR} = holamundo = amundo ${MIVAR:3} ${MIVAR:-5} = mundo ${MIVAR:3:2} = am • ¿Cómo nos quedaríamos solo con 'hola'?

Práctica 2.4 Uso de patrones y variables

Útil para reformatear números: Noop(${EXTEN}) Set(EXTEN=52${EXTEN:2}) Noop(${EXTEN})

;015546144330 ;525546144330 Configuración de Asterisk

81

Contextos de extensión Considerar cada contexto como un grupo de permisos único

Reutilizar contextos declarados previamente • Pueden incluirse contextos dentro de otros

Contextos de extensión (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

Configuración de Asterisk

83

Configuración de Asterisk

84

Contextos de extensión (3) Pueden incluirse contextos basados en tiempo

Prioridades de ejecución Exten vs. Exten • Gana el que tenga el patrón de marcación más específico

Sintaxis:

Exten vs. Include

include => contexto,,,,

• 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 más específico y al último lo más general Configuración de Asterisk

85

Evaluador

Configuración de Asterisk

86

Funciones Permiten procesar valores o datos que normalmente no estarían accesibles:

Podemos evaluar una operación lógica o aritmética 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 evalúa operaciones por default

Se escriben completamente en mayúsculas

Operadores válidos

Se acceden como si fueran variables ${FUNC()} • No perder de vista el orden de los { ( ) }

+, -, *, /, %, >, >=, n,Dial(${ARG1},20) same => n,Voicemail(${ARG2}) same => n,Hangup same => n,Return

• Se usan para personalizar la subrutina • Se crean automáticamente en las variables ${ARG1}, ${ARG2}, ${ARG3}, etc

Cada subrutina tiene variables individuales

Este es el código 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 aplicación Gosub • Gosub(,,([argumentos]))

De esta manera, pueden alterarse todas las acciones modificando solamente la subrutina

Cualquier extensión puede convertirse en subrutina Configuración de Asterisk

; ; ; ;

• En este ejemplo el Return sobra porque de cualquier manera, la llamada se cuelga antes de llegar a él. 91

Configuración de Asterisk

92

En resumen Cada archivo en Asterisk tiene una labor específica • Usuarios SIP en sip.conf • Plan de llamadas en extensions.conf

Práctica 2.5

Cada extensión debe tener una prioridad y aplicación para ejecutarse • No repetir extensiones/prioridades

Los patrones nos ahorran extensiones

• Muchas extensiones coinciden con una sola línea

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 Configuración de Asterisk

93

Plan de llamadas

Capítulo Básico #3 Arquitectura de Asterisk

Usuarios SIP llamada

micontexto

internas

Ing. Christian Cabrera R.

adicional

Configuración de Asterisk

95

Antecedentes

Sistema de archivos

Los módulos de Asterisk se configuran de manera independiente

Asterisk coloca sus archivos en diferentes carpetas: Tipo de archivo

Ubicación

Configuración /etc/asterisk Módulos /usr/lib/asterisk/modules

• Alto nivel de control

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

En el núcleo, Asterisk solo es un conmutador

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

• Ajeno a cualquier tecnología

Salida de llamadas /var/spool/asterisk/outgoing Fuente: wiki.asterisk.org Arquitectura de Asterisk

97

Núcleo de Asterisk

98

Arquitectura de Asterisk

Haciendo crecer a Asterisk Para agregar/quitar funcionalidades, controlamos los módulos que Asterisk carga • Editando /etc/asterisk/modules.conf limitamos cuales módulos serán cargados

Responsable de • Administrar módulos • Carga de configuración • Sincronía del sistema • Manejo de canales • Control del plan de llamadas

Ajeno a cualquier tecnología

• Podemos hacer crecer a Asterisk agregando el módulo que le brinde las nuevas funcionalidades

Provee las interfaces de configuración y control del sistema

Tenemos 4 clases principales de módulos: • Canales • Códecs • Aplicaciones/funciones • Recursos adicionales

• AMI, AGI, CLI

Arquitectura de Asterisk

99

Arquitectura de Asterisk

100

Lista de módulos 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

Módulos: 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 lógica y memoria • El funcionamiento de un canal no afecta a los demás

Algunos canales representan un protocolo (ej. SIP), mientras que otros solo siguen argumentos lógicos (ej. Local)

101

Arquitectura de Asterisk

Módulos: Aplicaciones

102

Módulos: Aplicaciones (2)

Ejecutan acciones durante una llamada

Algunas aplicaciones: Aplicación

Se cargan dinámicamente conforme se necesitan

Acción

Dial Marca hacia la tecnología/canal especificado

Ejecutadas síncronamente

Wait Espera ‘x’ segundos

• Se invoca la aplicación 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 más 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 dígitos 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

Módulos: Recursos

Asterisk CLI

Integran a Asterisk con recursos externos

La interfaz humano-Asterisk

• Bases de datos • Calendarios • Música en espera • Monitoreo (grabación)

• 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 estática • Requieren una recarga de módulo al modificarse

Pueden operar simultáneamente en varios canales

Módulos pueden agregar comandos al *CLI

• Cada canal recibe lo mismo que los otros

• Ej. sip show peers depende del módulo 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 módulos agregan comandos

Permite que Asterisk sea una puerta de enlace (gateway) entre un teléfono y una aplicación notelefonica

Usada por aplicaciones como el FOP, popups de agente para callcenter, sistemas de click-to-call, etc

• Encuestas, IVRs, juegos, etc

Se verá más a detalle en un capítulo propio Arquitectura de Asterisk

Se verá más a detalle al final del curso 107

Arquitectura de Asterisk

108

Práctica 3.1

Práctica 3.2

Instalando un módulo desde source: format_mp3 para música en espera

Instalando un módulo precompilado: Códec G729

Práctica 3.3 (opcional)

Capítulo Básico #4 Aplicaciones

Cambiando el idioma de Asterisk

Ing. Christian Cabrera R.

Introducción

Buzones de voz

Existen muchas aplicaciones en Asterisk

Ofrecer funcionalidad de dejar mensaje a un usuario.

• Más de 150+

Los buzones se crean en archivo voicemail.conf

Cada aplicación tiene su propia sintaxis • No es necesario aprenderlas todas, pero si las más importantes

Se usa a través de 2 aplicaciones: • Dejar el mensaje: Voicemail • Recuperar los mensajes: VoicemailMain

Todas son consultables desde el *CLI core show applications core show application Aplicaciones de Asterisk

• Allí se definen los usuarios, sus nombres, contraseñas 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 contraseñas

Permite dejar un mensaje de voz al buzón especificado

Configuración general y múltiples contextos de buzones de voz

• El buzón/contexto deben existir en el voicemail.conf • Podemos dejar un mensaje en más de un buzón a la vez

Si queremos tener activo el envío de correos debemos instalar un MTA (Mail Transfer Agent) en Linux

Sintaxis: Voicemail([@],)

Ejemplos:

[general] ; Aquí va la configuración general de los buzones de voz

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

[default] 101 => 1234,Juan Pérez,[email protected],,attach=yes 102 => 1234,Jorge López,[email protected],,attach=yes Aplicaciones de Asterisk

115

Aplicaciones de Asterisk

116

VoicemailMain

VMAuthenticate Autentica al usuario a partir de la contraseña de su buzón

Desde aquí escuchamos nuestros mensajes • Permite también configurar las opciones del buzón, tales como las bienvenidas • Es importante vaciar el buzón para evitar que se llene

Podemos saltar la autenticación • Hacer que no se le pida contraseña al usuario y pasar directo a los mensajes

Sintaxis:

• Las contraseñas están definidas en el voicemail.conf

Usando VoiceMailMain, el usuario final puede actualizar sus contraseñas sin intervención del administrador • El usuario se debe hacer responsable de su contraseña y su uso • Permite personalizar contraseñas a nivel individual

3 intentos fallidos y la llamada es colgada Sintaxis:

VoicemailMain([buzón],[opciones])

VMAuthenticate([buzón][@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 Pérez,[email protected],,attach=yes

Práctica 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

Interacción 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 grabación (bienvenidas) • Dar opciones de menu • Capturar dígitos ingresados en el teléfono • Reproducir números

La extensión del archivo se omite • Asterisk escogerá el mejor códec disponible • Lo mismo aplica para el resto de las aplicaciones de sonidos

Asterisk permite reproducir archivos de audio • Se soportan diferentes códecs, además de diferentes idiomas para los archivos de sonido • Los sonidos se buscan por default en /var/lib/asterisk/sounds

Sintaxis: Playback(,[opciones])

Ejemplo: Playback(bienvenida)

Aplicaciones de Asterisk

121

Aplicaciones de Asterisk

Background

122

Read Pide dígitos al usuario

Muy parecida a Playback, salvo que al usuario se le permiten ingresar dígitos • Asterisk transferirá al usuario a la extensión marcada • Si el número marcado no existe, transferirá a la extensión i (inválida)

• No se hace nada con ellos, solo se almacenan en una variable para uso posterior

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

Sintaxis: Background()

Ejemplo:

Ejemplo:

Read(pass,enter-account,4)

Background(digite-opciones)

Aplicaciones de Asterisk

123

Aplicaciones de Asterisk

124

Entendiendo la diferencia

SayDigits Reproduce un número dígito por dígito

Read pide datos para almacenar o procesar • Ej. Contraseñas o números de cuenta

• 12345 = Uno dos tres cuatro cinco

Se usa para reproducir números que no correspondan a una cantidad

Background transfiere hacia la ext. marcada

• Números de contrato • Números de cuenta • Contraseñas

• Ej. «Para ventas, digite 1. Soporte digite 2»

Playback solo reproduce archivos

Ejemplo:

• Obligamos al usuario a que escuche la grabación

SayDigits(123192)

Aplicaciones de Asterisk

125

Aplicaciones de Asterisk

126

Sobre las aplicaciones de audio

SayNumber Lee un número 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 números 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 código de idioma deseado (es, fr, it, en, etc)

• No hace distinción de números o cadenas

Ejemplo:

Si algún archivo de sonido no existe en el idioma deseado, se usará el mismo archivo en inglés

Saynumber(123192)

• Si tampoco existe el archivo en inglés, 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

Práctica 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 reproducción de audio

129

Control de llamadas

Answer

Para asegurar que el audio fluya a través del canal, es recomendable contestarlo primero • Algunas aplicaciones lo hacen automáticamente

Contesta un canal y comienza la tarificación • Puede especificarse un tiempo de espera antes de continuar con la siguiente prioridad

Procurar no usar Answer sino dejar que otra aplicación haga un contestado implícito

Es ocasiones es necesario insertar silencios antes o después del audio

Sintaxis: Answer([milisegundos])

• Dar mejor espacio entre llamadas o dar oportunidad al usuario a que ingrese dígitos

Ejemplo: Answer(3000)

Aplicaciones de Asterisk

131

Aplicaciones de Asterisk

132

Wait

WaitExten Funciona igual que Wait, pero el usuario puede ingresar dígitos

Hace al usuario esperar un tiempo obligatorio • No se pueden ingresar dígitos 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 extensión marcada • Útil para dar tiempos adicionales en IVRs • Es equivalente a un Background en silencio

Sintaxis: Sintaxis:

Wait()

WaitExten(,[opciones])

Ejemplo:

Ejemplo:

Wait(10)

WaitExten(3.5) Aplicaciones de Asterisk

133

Aplicaciones de Asterisk

Comunicación entre usuarios

134

Dial

La tarea más importante en un conmutador es comunicar extensiones

Permite enlazar usuario con usuario • Siempre debe contener una tecnología y un usuario • Asterisk puede convertir entre los protocolos

Podemos marcar a más de un usuario a la vez

Asterisk ofrece la posibilidad de comunicar varios usuarios en una misma llamada

Sintaxis: Dial(,[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 programación 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 contraseña, etc

Si no se proporciona el número de la conferencia, se le pedirá uno al usuario • Al colgar el último usuario, la conferencia se cierra

• Cada evento que ocurre va después de otro • Es posible alterar el flujo haciendo saltos

Podemos evaluar condiciones para saber si es necesario saltar o no También 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 contextoextensión-prioridad

Igual que Goto, pero solo brinca si la condición se cumple

Puede recibir 1, 2 o 3 parámetros

• Dos posibles destinos • Es importante evaluar la condicional

• 1: Solo prioridad (misma ext. y contexto) • 2: Extensión y prioridad (mismo contexto) • 3: Contexto, extensión y prioridad

Sintaxis:

Sintaxis:

Goto([contexto],[extensión],)

GotoIf(?:[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 aplicación ú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

Práctica 4.3

Práctica 4.4 (opcional)

Crear un menu IVR

Uso de funciones

142

Plan de llamadas contador

Capítulo Básico #5 Conexión con la PSTN usando DAHDI

Usuarios SIP saldo llamada

menu

micontexto

servicios

internas

Ing. Christian Cabrera R.

adicional

Aplicaciones de Asterisk

145

Introducción

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 interconexión 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 Interconexión por DAHDI

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

147

Interconexión por DAHDI

148

Tarjetas analógicas

Puertos analógicos Son los más comunes

FXO (Foreign Exchange Office)

• Estos son los puertos que usaríamos para poner un PBX en casa

• Reciben corriente (de la telefónica) • Aquí conectas una línea que viene de la calle (Telmex, Axtel, Alestra, etc)

Limitados a una llamada simultánea por canal

FXS (Foreign Exchange Station)

• El par de cobre está dedicado a un único circuito

• Entregan corriente hacia el teléfono • Conectas un teléfono convencional (Panasonic, Alcatel, Siemens, etc)

En otros conmutadores se llaman diferente: • FXO = CO • FXS = EXT

¡Nunca conectar FXS-FXS! • Podrías quemar los puertos Interconexión por DAHDI

149

Tarjetas digitales

Interconexión por DAHDI

150

Conexión física

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: Estándar Americano

• 23 canales de voz + 1 señalización

• Es necesario un convertidor que además de adaptar el conector, acople las impedancias correctamente

E1: Estándar Europeo

• 30 canales de voz + 1 de señalización + 1 de sincronía

Para estos propósitos se usa un balun

Interconexión por DAHDI

151

Interconexión por DAHDI

152

Puertos digitales

Sincronía

Son troncales de múltiples canales digitales (DS-0)

Dado que los enlaces digitales están multiplexados en tiempo, requieren de una fuente de sincronía

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 sincronía que proviene del enlace (recomendado si es que estamos conectados con la telefónica) • Generar la sincronía propia (cuando Asterisk es el equipo maestro)

• Hasta 30 canales de voz con muchos DIDs diferentes

Son tecnológicamente superiores que los análogos: • Mayor calidad • No son susceptibles al ruido • Confiabilidad

Sin una fuente de sincronía precisa, tendremos problemas • Ruidos en la línea • Puede ocasionar que las llamadas se desconecten

Las tarjetas son más caras

• Aunque la renta del servicio digital suele ser mas cara • El costo puerto por puerto es más barato Interconexión por DAHDI

Deberemos configurar este parámetro en el system.conf 153

Interconexión por DAHDI

Comparación ISDN vs R2MFC

Framing Según 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 señalización

Canal 1 se usa para framing. Canal 16 se usa para señalización

CCS – Common Channel Signaling

Soporta Euro ISDN, tanto en modo de CPE como red (esclavo / maestro)

Soporta FXS, FXO, E&M

Comúnmente usa CRC para corroborar errores en transmisión

Obsoleto en Europa Común en América Latina

Tanto D4 como CAS son tecnologías viejas y no deberían usarse

Más caro, por ser tecnología nueva Ofrece mucho más información por llamada

• Desafortunadamente, en Latinoamérica usamos principalmente R2 modificado, el cual usa CAS Interconexión por DAHDI

155

Interconexión por DAHDI

156

Interconexión con otros PBX

¿Qué es un DID?

Es posible interconectar Asterisk con otros sistemas no IP • FXS-FXO o FXO-FXS es lo más común, pero te limita a una sola llamada por puerto • También es posible usar E1s con cable cruzado

Direct Inward Dialing

• Es el número telefónico al cual marcamos

Un DID debe estar asociado con un canal para poder recibir las llamadas

• No confundir el DID con la línea/canal para recibir (similar a usuarios SIP y extensiones)

Asterisk puede actuar como maestro (simular ser la telefónica) o actuar como esclavo (dejando al otro PBX ser el maestro)

Es posible comprar DIDs virtuales que lleguen por SIP

• Puede adaptarse fácilmente a las necesidades del otro conmutador

• Al recibir la llamada, la telefónica indica a que DID marcó el cliente • Una línea análoga tiene un DID único asignado

Interconexión por DAHDI

• Esto evita tener que comprar tarjetas

Un enlace digital puede tener múltiples DIDs

157

Interacción en software OpenR2

Archivo base de configuración de las tarjetas

/etc/asterisk/chan_dahdi.conf

• Liga los módulos 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 (según sean ISDN PRI, R2 MFC, etc) • Adicionalmente, deben declararse los canales de cada span

/etc/dahdi/system.conf

Los puertos análogos 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

Interconexión por DAHDI

Los canales deben ser consecutivos de acuerdo al orden en que se cargan los módulos

Tarjetas Sangoma Interconexión por DAHDI

• /etc/dahdi/modules 159

Interconexión 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=,,,,

La sincronía se configura como • 0 para maestro (usamos nuestra propia sincronía) • 1 para esclavo (tomamos la sincronía que recibimos en el enlace) • 2 en adelante para definir los enlaces secundarios, terciarios, etc

La atenuación normalmente va en 0 (cero) • Solo sería necesario hacer cambios si estamos físicamente distantes (> 40 m) del módem que trae el enlace Interconexión por DAHDI

# Configuración para E1 ISDN span=1,1,0,ccs,hdb3 bchan=1-15,17-31 dchan=16

# Configuración para 4 puertos FXO fxsks=32-35 # Señalización inversa # Configuración 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

Interconexión 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 aplicarán

Configuramos la señalización, 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 atención a la sintaxis

Interconexión por DAHDI

163

Interconexión 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 caerán 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 Interconexión 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

Interconexión por DAHDI

166

Plan de llamadas contador Usuarios SIP saldo

Práctica 5.1

llamada

menu

Instalación de una tarjeta DAHDI

micontexto

internas

salida

adicional entrada PSTN

Interconexión por DAHDI

168

Recapitulando IAX es un protocolo de comunicación

Capítulo 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 también podemos tener troncales en SIP

Ing. Christian Cabrera R.

Enlaces IAX y troncales SIP

Introducción

2

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 configuración a través de firewalls • Más seguro (al ser menos conocido) • Diseñado a partir de requerimientos en el mundo real

Contras

IAX = Inter Asterisk eXchange

• Problemas con NAT • Muy conocido, y por lo tanto, atacado

• Débil soporte en hardware • Limitada cantidad de software que lo utiliza • No es un estándar

Desarrollado por Mark Spencer • Creado específicamente como un protocolo de telefonía

Usa un solo puerto UDP, el 4569 • Mismo puerto para señalización y envío de la voz • Amigable con NAT

Ofrece posibilidad de trunking, permitiendo agrupar múltiples llamadas en un solo enlace

Enlaces IAX y troncales SIP

3

Enlaces IAX y troncales SIP

4

Trunking IAX desactivado En SIP, cada paquete tiene su propio encabezado En ocasiones, el tamaño de los encabezados supera al del mensaje

5

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 información

• Solo cambia el cuerpo de los mensajes 5

3 3

2

2

2

1

1

1

5

3 5 Enlaces IAX y troncales SIP

5

Alta de usuarios IAX

4 4 4

La relación encabezados/cuerpo es mucho menor • El ancho de banda se aprovecha mejor

3 3

2

2

2

1

1

1

3

Enlaces IAX y troncales SIP

6

Conectando los equipos

Igual que en SIP

Hay 3 escenarios para interconectar equipos:

• Campos context, type y host • Sección general y sección de múltiples usuarios

1. Ambos equipos cuentan con IP fija • El más sencillo de implementar • Cada host siempre conoce la ubicación del otro

Si no se especifica secret, cualquier usuario sin contraseña podrá llamar

2. Uno tiene IP fija y el otro dinámica

• Esto se usa para poder recibir llamadas anónimas • Es preferible declarar una cuenta iax sin contraseña con accesos muy restringidos

• Equipo dinámico debe registrarse con equipo fijo para darse a conocer

3. Ambos equipos tienen IP dinámica • Es necesario convertirlo en uno de los otros escenarios (al menos uno de los dos debe simular ser fijo) Enlaces IAX y troncales SIP

7

Enlaces IAX y troncales SIP

8

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

; Host B ; sip.con/iax.conf

[usuario B] username= host= secret= context=entrada type=friend deny=0.0.0.0/0 permit=/32

[usuario A] username= host= secret= context=entrada type=friend deny=0.0.0.0/0 permit=/32

Proceso de registro Esto es necesario cuando queremos interconectar 2 equipos y uno de ellos tiene una IP dinámica • El equipo dinámico se reporta con el fijo de manera periódica

También 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 contraseña es ****** favor

¡Correcto! Quedas registrado Si en verdad eres el usuario 101, desde 192.168.1.145 ¿CuállaesIPtu contraseña? 101 @ 192.168.1.145 (IP dinámica) 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 sección [general] del iax.conf/sip.conf y tienen el siguiente formato:

; Host A (dinámico) ; sip.con/iax.conf

register => :@

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

[general] register => usuarioA:elmismo@

Ejemplos: register => 10025:[email protected] register => 5550181181:[email protected]

Al registrarse, el equipo que recibe (el fijo) ya conoce la dirección del dispositivo dinámico • Ya sabe a donde enviar las llamadas

Enlaces IAX y troncales SIP

192.168.1.200 (IP fija)

11

[usuario B] username= host= secret= context=entrada type=friend deny=0.0.0.0/0 permit=/32

[usuario A] username= host=dynamic secret= context=entrada type=friend

Enlaces IAX y troncales SIP

12

Envío 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:[email protected]/525512345678

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

[sucursales] ; Llamadas internas entre conmutadores. El primer dígito ; 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 configuración Enlaces IAX y troncales SIP

13

Enlaces IAX y troncales SIP

Práctica 6.1

Práctica 6.2

Crear un enlace IAX entre 2 servidores Asterisk

Recibir llamadas IAX anónimas

14

Plan de llamadas contador Usuarios SIP saldo

Práctica 6.3

llamada

menu

Conexión con un carrier IAX/SIP

servicios

micontexto

internas

salida

adicional sucursal

entrada

IAX autenticados

PSTN/ Vecinos IAX

IAX anónimos

Recapitulando

Capítulo Intermedio #2 Distribución automática de llamadas (ACD) Ing. Christian Cabrera R.

Extensiones se asignan a usuarios SIP/IAX/DAHDI • Comúnmente en relación 1:1

Pueden asignarse múltiples dispositivos a una sola extensión • Aunque timbrar varios teléfonos a la vez no siempre es buena opción

El plan de llamadas no permite controlar de manera específica a quienes se les enviarán las llamadas en base a su ocupación

Distribución automática de llamadas (ACD)

20

Asterisk como CallCenter

Componentes

¿Qué puede ofrecernos la plataforma?

Hay 2 partes importantes en todo esquema de atención al usuario: miembros y colas

• Distribución automática de llamadas (ACD) • Agentes remotos • Monitoreo y grabación de llamadas • Música en espera • Enrutamiento basado en habilidades (skills) • Distribución y enrutamiento geográfico • Soluciones de contingencia

Una cola es una fila donde entran aquellos que desean comunicarse a un área específica (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 múltiples 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 Distribución automática de llamadas (ACD)

21

Distribución automática de llamadas (ACD)

Características

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 sección de [general] y múltiples [colas]

Podemos agregar miembros estáticos a cada cola usando el campo de member:

• Si no ha nadie al teléfono, ¿quién contesta?

Los miembros pueden ser estáticos o dinámicos

member => /, [penalización],[nombre

• Los estáticos se configuran en el queues.conf • Los dinámicos 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 existía el concepto de agente • Este concepto ha sido depreciado, por lo que ya no se estudiará • Debe reemplazarse por el uso de miembros dinámicos Distribución automática de llamadas (ACD)

22

Los miembros estáticos siempre se consideran en línea

• Para tener el concepto de login/logout, debemos usar miembros dinámicos

23

Distribución automática de llamadas (ACD)

24

Ejemplo de queues.conf

Colas: queues.conf (2) Campo musicclass

announce

strategy

Valores posibles

[general] persistentmembers=yes monitor-type=MixMonitor

Función



Especificar la clase de la música en espera. Se define en el archivo musiconhold.conf



Reproducir un anuncio para el agente al momento de contestar una llamada. Util para miembros registrados en más 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 más random, rrordered, justos) rrmemory,wrandom

timeout



Tiempo máximo que se le timbrará a un miembro antes de considerarlo no disponible

weight



Importancia de la cola con respecto a otras. Una cola más importante será atendida antes Distribución automática de llamadas (ACD)

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

25

; Miembros estáticos

Esto crea las colas del sistema, ahora es necesario dejar que los clientes lleguen a ella

Distribución automática de llamadas (ACD)

Aplicación: 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 Distribución automática de llamadas (ACD)

; Activar la grabación 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)})

También podemos pausar desde el *CLI *CLI> queue pause member SIP/101 *CLI> queue unpause member SIP/101 queue ventas

; Para todas ; Para ventas

Distribución automática de llamadas (ACD)

28

Miembros dinámicos Permiten simular el uso de agentes

Práctica 7.1

• Tenemos que crear nuestras propias rutinas de login/logout • Opcional pedir usuario/contraseña

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 atención a clientes

; Login/logout a la cola de ventas exten => *80,1,AddQueueMember(ventas) exten => *81,1,RemoveQueueMember(ventas)

También podemos agregar miembros desde el *CLI *CLI> queue add member SIP/101 to ventas *CLI> queue remove member SIP/101 from ventas Distribución automática de llamadas (ACD)

Práctica 7.2

Capítulo Intermedio #3 Asterisk DB

Agregar miembros dinámicos a una cola

Ing. Christian Cabrera R.

30

Recapitulando

Introducción

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 información 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 jerárquica

DB() permite modificar y obtener valores contenidos en la base de datos de Asterisk DB(/)

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 automáticamente al declararlo la primera vez Llave1 Valor1 Familia1

Es posible especificar más de una familia/llave

Llave2

Valor2

SubFamilia1

Llave3

Valor3

DB(usuario/100/fwd) Familia2 Asterisk Database

35

Llave5 (vacía) Enlaces IAX y troncales SIP

36

DB_DELETE y DB_EXISTS

Usos prácticos del AstDB Funciones que deban recordar el status de los teléfonos

DB_DELETE() elimina la llave especificada DB_EXISTS() determina si la llave especificada existe

• DND (no molestar) • Redireccionamiento • Contraseñas • *69 (último número marcado)

• Regresa un 1/0 según si la llave existe o no • Es indiferente a valores vacios

Cualquier dato pequeño y único que no tenga que ser consultado para razones históricas

Ambas funciones crean la variable ${DB_RESULT}

• No recomendable para información que deba ser modificada desde fuera de Asterisk

• Contiene el valor que existía en la BD • Útil para evitar reconsultarla Asterisk Database

37

Enlaces IAX y troncales SIP

38

Características 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 fácil 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 información 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

Características de AstDB (2) Rápida Asterisk la utiliza para guardar información

Práctica 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

Práctica 8.2 (opcional)

llamada

menu

Usar Asterisk DB para bloquear extensiones al final del día

internas adicional

entrada

servicios

micontexto

permitidos salida permitir sucursal

IAX autenticados

PSTN/ Vecinos IAX

IAX anónimos Asterisk Database

44

Recapitulando Todos los datos que Asterisk posee son estáticos

Capítulo Intermedio #4 Integración con bases de datos

• Tenemos que recargar tras actualizarlos

Podemos almacenar datos dinámicos en el AstDB • Pero el AstDB nunca se pensó para datos grandes (como CDRs) • No podemos hacer consultas estructuradas

Ing. Christian Cabrera R.

Integración con bases de datos

45

Introducción

46

Escogiendo el manejador

Asterisk puede integrarse con diferentes manejadores de bases de datos • Leer configuración • Almacenar el detalle de llamadas • Consultar información externa (contraseñas, tipo de cambio, saldos, etc)

Facilita la integración con interfases y scripts externos • Usamos la BD como un medio alternativo donde guardar la información • Asterisk puede consultarla en paralelo que otros procesos • Puede escribir en BD y dejar que otro proceso la lea Integración con bases de datos

47

Asterisk soporta varias opciones de BD • MySQL • PostgreSQL • LDAP • SQLite

También existe el estándar ODBC (Open Database Connectivity) • Abre el acceso a manejadores como MSSQL Server, Oracle, Access, Informix y otros más que no están disponibles en Linux

Nos enfocaremos en ODBC para tener un abanico de opciones más completo Integración con bases de datos

48

Asterisk y ODBC

unixODBC

Asterisk soporta ODBC a través de 3 módulos

Nos permite conectarnos por ODBC con cualquier manejador

• res_odbc • res_config_odbc • cdr_odbc

• Punto único de interacción con múltiples manejadores

Debemos conseguir la librería necesaria para el manejador deseado • Puede tener costo

Linux ofrece conectividad con ODBC mediante el paquete unixODBC

unixODBC Integración con bases de datos

49

unixODBC (2)

Integración 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 librería libmyodbc apt-get install unixodbc libmyodbc

Es necesario modificar 2 archivos: • /etc/odbc.ini • /etc/odbcinst.ini • Notar que estos archivos NO están en la carpeta de Asterisk

odbc.ini configura los data sources (DSNs) de ODBC odbcinst.ini especifica que librerías usaremos cuando nos conectemos con cada manejador Integración con bases de datos

51

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

Integración 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

Integración con bases de datos

Es más útil que los registros se guarden en una BD • Podemos hacer queries y formular los reportes según nos convenga • Asterisk requiere de tablas con un formato específico

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 conexión para Asterisk • El usuario y contraseña 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

Integración con bases de datos

Integración con bases de datos

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

libmyodbc Integración con bases de datos

56

Realtime Asterisk Realtime Architecture (ARA) • Capa intermedia que abstrae el código de BD • No es necesario hacer queries

Práctica 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)

Integración con bases de datos

57

Comparación entre mecanismos de configuración Diferentes mecanismos para diferentes propósitos: 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 Estático • Los archivos de texto se guardan en BD • Es necesario hacer un reload tras cada cambio • La única diferencia es la ubicación (BD vs. archivos)

Dinámico • 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 Integración con bases de datos

58

59

Integración 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 conexión 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 configuración con ODBC Integración 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] => ,, Donde: • es una referencia a Realtime • es el tipo de BD a usar (ODBC, MySQL,, etc) • es el nombre del perfil creado para esta conexión (res_config_mysql.conf, res_odbc.conf, etc) • es la tabla para esta familia de Realtime Integración con bases de datos

• En este ejemplo, usamos el mismo DSN que el que definimos para nuestra conexión 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 utilizarán estas credenciales • Darle los privilegios necesarios al usuario realtimeuser en MySQL Integración con bases de datos

62

Ejemplo: extconfig.conf Según 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 ; También 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

Integración con bases de datos

64

Configurando Realtime (3)

Realtime SIP Almacena la configuración de usuarios SIP

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

• Configuración 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 básica, con solo 4 campos

• Los campos que cada familia requiere son únicos • Comúnmente, solo se comparten tablas para users/peers

Asterisk automáticamente 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 Integración con bases de datos

• sippeers • sipusers 65

Realtime SIP (2)

Integración 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 extensión (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 teléfonos 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 Integración con bases de datos

En extensions.conf es necesario usar:

67

Integración 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 buscarán extensiones en la BD Integración con bases de datos

69

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

Integración con bases de datos

70

Función REALTIME Una función muy poderosa que nos permite consultar o cambiar valores de una tabla

Práctica 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

Integración 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 modificaría la base de datos y guardaría 302 en el campo ‘saldo’

De ahí podemos usar CUT para quedarnos con los valores que queremos Integración con bases de datos

73

Integración con bases de datos

74

¿Cómo funciona el CUT? Tenemos esta línea: Set(Fila=${REALTIME(saldos,usuario,${CALLERID(num)},&)})

Práctica 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

Integración con bases de datos

76

Plan de llamadas

Funciones personalizadas

contador

El módulo 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= readsql= writesql=

sucursal

entrada

IAX autenticados

PSTN/ Vecinos IAX

IAX anónimos Integración con bases de datos

77

func_odbc

Integración 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 función 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 función 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}) Integración 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

Integración con bases de datos

80

Práctica 9.4 (opcional) Crear una función personalizada ODBC

81

Recapitulando

Capítulo 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 extensión y prioridad asignada La sintaxis base es: exten => ,,

Ing. Christian Cabrera R.

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

Asterisk Extensions Language

Introducción

2

AEL 2.0

Algunas funciones (ej. ciclos) son difíciles de programar en el dialplan básico

Sintaxis más similar a un lenguaje de programación

Analizar un dialplan puede resultar complicado tras seguir instrucciones como goto y gosub

Permite crear estructuras más uniformes para el manejo de extensiones

• Programadores preferirán esta sintaxis

• Menos código inútil, más trabajo con menos

Se decide crear un lenguaje de programación de extensiones, conocido como Asterisk Extension Language (AEL) Asterisk Extensions Language

Se configura en el archivo extensions.ael 3

Asterisk Extensions Language

4

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 línea indiferentes

Se definen con context. Un contexto va delimitado por sus llaves respectivas

Bloques contenidos entre ‘{‘ y ‘};’ Fin de comando con ; Asignación de variables natural

Hay que cuidar no dejar extensiones fuera del contexto

Comentarios con // (monolínea) y /* */ (multilínea) Asterisk Extensions Language

Siempre terminar la última ‘}’ con ; 5

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

ó

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

=> { ; ; };

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

Asterisk Extensions Language

6

Inclusiones de contextos

Sintaxis: => ;

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; }; }; También pueden incluirse archivos enteros usando #include #include “more_extensions.ael” No olvidar que al dejar {} abiertos en un archivo, continúan abiertos en los que siguen

Asterisk Extensions Language

7

Asterisk Extensions Language

8

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 también es evaluado ( $[] )

El lado derecho de la asignación es evaluado, de manera que estas expresiones son equivalentes: MIVAR=10/2; Set(MIVAR=$[10/2]) Cuidado con líneas como Fila=${REALTIME(saldos,usuario,100,&)}; Fila=usuario=100&saldo=1234.56; Asterisk Extensions Language

9

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} { 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 programación

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é número 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

Práctica 10.1 Crear un pseudo marcador predictivo usando Realtime y ciclos

15

14

Plan de llamadas contador

Capítulo 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 anónimos

Asterisk Extensions Language

17

Recapitulando

Introducción

Tenemos control del dialplan a partir del extensions.conf

AGI no es un lenguaje: es una interfaz para controlar Asterisk No está ligado a ningún lenguaje en específico • Podemos usar Perl, PHP, Python, C, Java, Bash, etc

Existe una lógica de programación más avanzada utilizando extensions.ael

Los scripts se colocan en la carpeta /var/lib/asterisk/agi-bin

Aún con estas características más avanzadas, algunas funciones resultarían 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 válido"

Y el proceso puede repetirse indefinidamente AGI envía comandos a Asterisk

Escribimos en el STDERR para hacer notificaciones de sistema

• El AGI toma todas las decisiones

Asterisk envía 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 código

Reproducir los números del 1 al 10: #!/usr/bin/php –q

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 Están ligados a aplicaciones básicas de Asterisk Aún cuando la lista es reducida, cualquier aplicación 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

Práctica 11.1

Capítulo 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 fácil 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 automáticos, etc

Comunicación en texto plano

Existen 2 maneras de instruir a Asterisk a que haga llamadas

Asterisk Manager Interface

• Se recomienda un túnel SSH para resolver esto • Asterisk 1.6+ soporta uso de TLS

29

Funciones principales

Asterisk Manager Interface

30

Envío de comandos

Solicitar nuevas llamadas

Los datos que se envían al AMI tienen la sintaxis: Campo: valor

Grabar bajo demanda

Según la acción que se envíe (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 línea significa que el grupo de valores termino y que el AMI debe procesar la solicitud

Editar archivos de configuración Recibir información de eventos del sistema Asterisk Manager Interface

31

Asterisk Manager Interface

32

Ejemplo de autenticación

Archivo: manager.conf

Conexión 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 válido, 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 información sobre quien le llama

• Tener cuidado con la escritura, ya que el AMI no se lleva bien con los errores

Aplicaciones de marcado automático

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

• Click 2 dial • Llamadas via web • Marcadores automáticos/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 más 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 fácilmente 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 más 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 ejecutarán

nano /root/test.call

• Si cambiamos la fecha de modificación 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

Movámoslo 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 campañas de marcación que no pasen de X llamadas por minuto

*CLI> manager show command originate Asterisk Manager Interface

39

Asterisk Manager Interface

40

Práctica 12.1

Capítulo 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 comunicación

Asterisk 1.4

Una llamada SIP viaja en 2 flujos diferentes:

Asterisk 1.6

• No existía mecanismo de seguridad para SIP

• La señalización (5060 UDP) • La voz (RTP aleatorio)

• Se soporta SIP sobre TCP • Se agrega soporte experimental para TLS (solo se encripta la señalización)

Por default, ninguno de los dos va cifrado • Cualquiera que intercepte los paquetes puede reconstruir la conversación

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 criptográfico extensible para intercambio seguro de datos Continuación/evolución de SSL (Secure Sockets Layer) Versión 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 envía el # de la más alta versión de TLS soportada, un número aleatorio, algoritmos de cifrado y compresión posibles

ClientHello

46

Servidor

Resultado

ChangeCipherSpec

«Todo lo que venga a continuación viene autenticado/cifrado»

Finished

Se envía un hash del condensado de todos los mensajes anteriores

Servidor escoge la versión de TLS más alta posible y los algoritmos a usar. Envía un número aleatorio

ChangeCipherSpec

«Todo lo que venga a continuación viene autenticado/cifrado»

Certificate

Servidor envía su certificado para que cliente pueda autenticarlo

Finished

Se envía un hash del condensado de todos los mensajes anteriores

ServerHelloDone

Servidor finaliza handshake

ServerHello

ClientKeyExchange MasterSecret

A partir de aquí, todo viaja encriptado

Cliente envía PreMasterSecret, llave pública o nada (según 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 código 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

/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 permitiría que cualquiera nos reemplace

Cifrado de llamadas en SIP

./ast_tls_cert -C -O "" -d

El sistema nos pedirá una contraseña que deberemos confirmar para firmar nuestros certificados

49

Cifrado de llamadas en SIP

Configurando Asterisk

50

Configurando Asterisk (2) ¿Qué significa cada opción 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 (también 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

Dirección IP donde escucharemos por nuevas peticiones TLS (debe coincidir con la IP del certificado)

tlscertfile

Ubicación del certificado para TLS

tlscafile

Ubicación del certificado para la entidad certificadora (CA)

tlsdontverifyserver

Activar/Desactivar la verificación del servidor (solo se usa cuando Asterisk trabaja como cliente)

tlscipher

Métodos de cifrado permitidos (DES, 3DES, AES, etc)

tlsclientmethod

Versión de TLS mínima 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 librería 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 módulo 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 encriptación (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 teléfonos 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 análisis de VoIP detecta fácilmente 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

Práctica 13.1 Configurar SIP mediante TLS y sRTP

Obviamente, no es posible graficarla ni reproducir el audio Cifrado de llamadas en SIP

61

Recapitulando

Capítulo Avanzado #5 Seguridad en Asterisk

Podemos cifrar nuestras llamadas para impedir que sean escuchadas por alguien más Sistemas malintencionados pasan llamadas a través de nuestro PBX, con costo para nosotros Errores comunes en administración pueden ocasionar grandes costos (miles de dólares en una noche)

Ing. Christian Cabrera R.

• Contraseñas inseguras • Puertos abiertos • Validar al teléfono, no al usuario

Seguridad en Asterisk

Introducción

1) Contraseñas inseguras

Instalar Asterisk es muy rápido

No usemos secret=100 si nuestro username=100

• Es más rápido aún 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 intención es ganar acceso a nuestro equipo para poder cursar llamadas Es conveniente tomar muy en cuenta las siguientes recomendaciones de seguridad

Preferible usar contraseñas aleatorias, difíciles de recordar • MD5(RAND()) • openssl rand -base64 12

Si usamos distribuciones como Elastix, siempre cambiar las contraseñas default • Si mas gente la conoce, es más fácil de atacar

Seguridad en Asterisk

1) Contraseñas 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 según 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 aún, 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 información Si hemos de recibir conexiones desde afuera, entregar siempre el mismo mensaje de error

4) Limitar llamadas simultáneas Si un atacante ganara acceso a nuestro sistema, limitar la cantidad de llamadas simultáneas posibles • No evita el daño, 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 válido o no

Esto ayuda en casos que a usuarios legítimos les fue robada su contraseña

Seguridad en Asterisk

5) Autenticar al usuario Hay llamadas muy caras que son esporádicas (ej. Internacionales) • Podemos pedir contraseña via DTMFs

Seguridad en Asterisk

6) Negar llamadas anónimas Definir adecuadamente el context default dentro de [general] en sip.conf • Cualquier usuario NO autenticado puede marcar a través de él

Si la extensión ya se registro, pedir autenticación 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 múltiples intentos de registro • Inclusive enviar correos de la notificación

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 inyección [incoming] exten => _X.,1,Dial(SIP/${EXTEN}) exten => _X.,n,Hangup()

¿Qué ocurre si el atacante envía 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 autenticación sin contraseña • insecure=invite • Siempre usar permit/deny en conjunción con insecure

Práctica 14.1

No usar el parámetro de host como una restricción 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 aún mejor, así que pedimos su muy valioso apoyo para contestar una encuesta sobre el curso

Christian Cabrera R. [email protected] (55) 50 181 181 SIP/enlaza.mx Twitter y Facebook: @AsteriskMX

enlaza.mx/encuesta Es anónima • No tienen que proporcionar su nombre si no lo desean

@EnlazaMX Asterisk Manager Interface

77

Asterisk Manager Interface

78

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF