Asterisk IP PBX open source configuration course in spanish....
¿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