Capítulo Básico #1Introducción a Asterisk
Ing. Christian Cabrera R.
¿Qué es Asterisk?
Introducción a Asterisk 2
Es software open source• 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
Permite enlazar diferentes medios de comunicación, no solamente voz
Uso actual
Introducción a Asterisk 3
Más de 1 millón de servidores Asterisk en producción hoy en día
• 1000+ descargas diarias en código fuente
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
Versiones de Asterisk
Introducción a Asterisk 4
Versiones inferiores a 1.8 se consideran obsoletas• Sin soporte oficial. Se recomienda actualizar.
Asterisk 11 es lo recomendado hoy en día
Versión TipoFecha de
lanzamiento
Actualizaciones de
seguridadFin 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
Dos tipos de versiones
Introducción a Asterisk 5
LTS (Long Term Support)• Permanencia mínima de 5 años en el mercado• Orientado a estabilidad• Mejor opción para empresas
Estándares• Dos años de vida• Orientado a impulsar nuevas funcionalidades• Apta para entusiastas y desarrolladores de nuevas
tecnologías
Diferencias con un PBX convencional
Introducción a Asterisk 6
No se requiere hardware propietario• Muchos fabricantes ofrecen productos similares• Hardware “genérico” intercambiable• Diferentes soluciones de diferentes fabricantes• Libre competencia = mejores precios y productos
Sigue una arquitectura universal de PC• 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
Diferencias (2)
Introducción a Asterisk 7
Totalmente programable y configurable• No es necesario solicitar servicios especiales ni
comprar módulos extras• Todo se hace a través de software
Ofrece servicios adicionales de datos• Puede integrarse con cualquier sistema que pueda
correr en una PC con LinuxBases de datos, consultas web, lectura de archivos, etc.
Puede interactuar con conmutadores existentes• Interconexión a través de puertos análogos/digitales
Escenarios de uso
Introducción a Asterisk 8
Hay muchas maneras en las que podemos aprovechar las características de Asterisk, entre ellas:
• PBX tradicional• PBX IP• PBX híbrido• Pasarela (Gateway) VoIP• Aumento de funcionalidades• Call center• Plataforma para carriers
PBX tradicional
Introducción a Asterisk 9
PBX VoIP
Introducción a Asterisk 10
PBX híbrido
Introducción a Asterisk 11
Pasarela VoIP
Introducción a Asterisk 12
Aumento de funcionalidades
Introducción a Asterisk 13
¿Qué es lo que SI es Asterisk?
Introducción a Asterisk 14
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
B2BUA vs Proxy
Introducción a Asterisk 15
Proxy
Llamada 1 Llamada 2
Llamada
¿Qué es lo que NO es Asterisk?
Introducción a Asterisk 16
No es un SIP 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)
No es un sistema plug-and-play• Podemos crear complejas aplicaciones con él, pero es
necesario configurarlo primero• ¡Y es muy importante practicar para lograrlo!
Requisitos de hardware
Introducción a Asterisk 17
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 durosFuentes de poder
El procesamiento necesario se mide según los requerimientos
• 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.
Pueden usarse entornos virtualizados• Limitados a hardware PSTN externo conectado por IP
Requisitos de hardware (2)
Introducción a Asterisk 18
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• Asterisk 1.2 en Celeron 333 Mhz con 32 MB RAM• Es posible usar µPCs (ej. Raspberry Pi)
Espacio en disco dependiente de grabaciones• Códec * horas de llamada * llamadas simultáneas * dias a
permanecer
Requisitos de software
Introducción a Asterisk 19
Preferentemente, Linux nativo• FreeBSD y Mac OS tienen soporte parcial
Asterisk requiere de paquetería adicional:• Recuerda instalar las versiones -devel
GCCNcursesTermcapNewtOpenSSLLibUUID
En CentOS instalamos estas dependencias con:
yum install -y gcc gcc-c++ ncurses-
devel libtermcap-devel openssl-
devel newt-devel libuuid-devel
En Debian instalamos todas con
apt-get build-dep asterisk
DAHDI
Introducción a Asterisk 20
Para la interacción con tarjetas (Digium, Sangoma, Openvox, etc), Asterisk requiere de las librerías de DAHDI
• Digium Asterisk Hardware Device Interface
DAHDI son un conjunto de controladores que le permiten a Asterisk entenderse con las tarjetas
• 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 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.
DAHDI (2)
Introducción a Asterisk 21
DAHDI tiene su propia lista de dependencias• 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-<versión>
Si queremos usar enlaces digitales (E1s), necesitamos más 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
Librerías extras para Asterisk
Introducción a Asterisk 22
Cualquier librería que agregue funcionalidades a Asterisk (ej. openr2 o libsrtp) debe ser instalada antes de compilar Asterisk.
En caso de que Asterisk ya esté instalado, tendremos que repetir el proceso de instalación para que use las nuevas 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.
Instalando Asterisk
Introducción a Asterisk 23
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
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 ;-)
Compilando Asterisk
Introducción a Asterisk 24
La última versión de Asterisk está disponible desde http://asterisk.org
• El histórico de versiones, parches y otros componentes, se consigue desde http://downloads.digium.com
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
Compilando Asterisk
Introducción a Asterisk 25
Dentro del proceso de compilación hay varios comandos:./configure : Revisar dependenciasmake menuselect : Escoger las opciones a compilarmake : Compilar código fuentemake install : Copiar a las carpetas necesariasmake config : Crear scripts de autoarranquemake samples : Crear ejemplos de configuración
Al terminar estos comandos habremos dejado Asterisk instalado
• El siguiente paso sería arrancarlo y configurarlo.
Algunas notas precautorias
Introducción a Asterisk 26
En caso de que ./configure nos arroje errores, quiere decir que nos faltan dependencias
• En caso de que make nos arroje errores, probablemente tengamos dependencias incompatibles
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
• Estos pasos serán repetidos constantemente durante el curso.
Iniciando Asterisk
Introducción a Asterisk 27
Hay 2 maneras en las que podemos ejecutar Asterisk:• Como un comando en primer plano• Como un servicio
Al ejecutar Asterisk como un comando, la consola se queda pegada a la sesión del usuario que estemos ocupando (normalmente root)
• 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.
Al ejecutarlo como servicio, permanece activo aunque nuestra sesión se cierre
• Asterisk sigue corriendo en segundo plano.
Iniciando Asterisk (2)
Introducción a Asterisk 28
Para arrancar Asterisk en primer plano:asterisk –vvvc
La v significa ‘verbosidad’ (más detalle)
Para arrancarlo como servicio/etc/init.d/asterisk start
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
Deteniendo Asterisk
Introducción a Asterisk 29
Para detener el servicio completo (desde el CLI):/etc/init.d/asterisk stop
Desde adentro del CLI de Asterisk*CLI> core stop now
Matando el proceso (desde el CLI)• Usar como último recurso:ps –eF | grep asterisk
kill -9 <PID de Asterisk>
Reiniciando Asterisk
Introducción a Asterisk 30
Solo hay que cambiar stop/start por restart:/etc/init.d/asterisk restart
*CLI> core restart now
En varias ocasiones se nos pedirá reiniciar el servicio de Asterisk
• Es conveniente familiarizarse con los comandos.
Práctica 1.1
Instalación de Asterisk
Configurando Asterisk
Introducción a Asterisk 32
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• Tienen extensión *.conf• Sintaxis muy similar a archivos *.ini
Archivos de configuración
Introducción a Asterisk 33
Hay muchos, pero estos son los más importantes:
Archivo Función
asterisk.confEspecifica las rutas default y ajusta opciones generales de todo el conmutador
extensions.conf Controla las reglas del plan de llamadas
sip.conf Todo lo relacionado al protocolo SIP
iax.conf Igual que el anterior, pero para IAX2
chan_dahdi.conf Configura las tarjetas DAHDI
asterisk.conf
Introducción a Asterisk 34
Archivo maestro de configuración• Le indica a Asterisk donde buscar o crear otros archivos
Configuraciones que afectan a todo el sistema:• Límite de llamadas en general• Estructura de archivos de sonido• Nombre de este equipo (en caso de tener más de uno)
Raramente necesita ser editado• Se recomienda mucho colocar verbose=3 para subir la
verbosidad del sistema por default
sip.conf
Introducción a Asterisk 35
Configuración del canal SIP• El archivo de muestra viene lleno de ejemplos
2 tipos de configuraciones• Campos que afectan a todos los usuarios• Campos que afectan de manera individual a cada usuario
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
iax.conf
Introducción a Asterisk 36
Configura lo relacionado al canal IAX2• Igual que con SIP, configura valores generales e
individuales para usuarios
Se definen conexiones con dispositivos IAX así como con troncales IAX
Se verá más a detalle en el módulo intermedio
chan_dahdi.conf
Introducción a Asterisk 37
Toda la tarjetería se configura aquí:• Enlaces digitales (E1s)• Troncales análogas (FXO)• Extensiones análogas (FXS)
Requiere de la configuración equivalente dentro del /etc/dahdi/system.conf
• Dedicaremos un capítulo a explicar esto
Se verá más a detalle adelante
extensions.conf
Introducción a Asterisk 38
Aquí se define el plan de llamadas• Los permisos a los que cada usuario tiene derecho para
marcar (clases de servicio)• Se construye por contextos, extensiones, prioridades y
aplicaciones
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
Similar a un archivo de programación
La mayoría del curso se centra en este archivo
En resumen
Introducción a Asterisk 39
Asterisk fue escrito por Mark Spencer• 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
Capítulo Básico #2Configuración de Asterisk
Ing. Christian Cabrera R.
Introducción
Configuración de Asterisk 41
La configuración inicial de Asterisk es a través de archivos de texto
• Conforme avancemos en el curso veremos métodos más complejos
Todos los archivos pueden ser modificados directamente desde la consola
• nano, pico, emacs, vi, vim, cualquier editor nos sirve
Sintaxis de archivos *.conf
Configuración de Asterisk 42
Son similares a un archivo *.ini• Se contruye a partir de un encabezado y varios campos
El contexto determina el nombre de la sección en la que estamos trabajando
• Los campos especifican los detalles de configuración
Estructura base:[contexto] ; <-- Este es el contextocampo1=valor1campo2=valor2 ; <-- Estos son los campos
Comentarios
Configuración de Asterisk 43
Los archivos de configuración en Linux tienen comenarios que se especifican con el símbolo #
Sin embargo, los de Asterisk reciben comentarios con el ; (punto y coma)
• Todo lo que esté a la derecha del ; será ignorado
También podemos declarar comentarios multilínea:• Usamos los tags de ;-- y --;
Ejemplo;--- Todo estoes un comentario ---;
Ejemplo de sintaxis
Configuración de Asterisk 44
Archivo res_mysql.conf
Inclusión de archivos
Configuración de Asterisk 45
Si un archivo es muy grande, puede resultar difícil de administrar
• Podemos separar el contenido en archivos más pequeños• Esta idea es muy usada por interfases como FreePBX
Sintaxis:#include “mi_otro_archivo.conf”
Ejemplo: sip.conf
[general]
#include “sip_general_custom.conf”
#include “sip_general_additional.conf”
; Aquí comienza la configuración de usuarios
#include “sip_custom.conf”
#include “sip_additional.conf”
Inclusión de archivos (2)
Configuración de Asterisk 46
También es posible incluir configuración a partir de la ejecución de scripts usando #exec.
• Todo lo que el comando imprimiría a pantalla, es interpretado como código de configuración por Asterisk
Ejemplo:#exec “/bin/database_config.sh”
Esto puede usarse para generar la configuración desde un sistema externo (ej. base de datos)
• Considerar que esto puede afectar el rendimiento• Sin embargo, nos da mucha flexibilidad
Contextos
Configuración de Asterisk 47
Son secciones que identifican un grupo de campos• Se les identifica por escribirse entre [ ]• Según el archivo en que se ocupe, el [contexto] puede
significar algo diferentesip.conf: Un usuario SIPextensions.conf: Un grupo de extensionesvoicemail.conf: Un conjunto de buzones de voz
Un [contexto] permanece abierto hasta que se encuentre con otro [contexto]
• Al abrir un nuevo contexto hay que cuidar no romper los ya existentes
Usuarios SIP/IAX <> extensiones
Configuración de Asterisk 48
Usuario SIP/IAX no es igual a extensión• Confusión creada por distribuciones como Elastix/Trixbox.• Un usuario se refiere al dispositivo que se conectará con
Asterisk (archivo sip.conf/iax.conf).• Las extensiones representan lo que se puede marcar
(archivo extensions.conf).
El campo context define los derechos de marcación de un usuario SIP
Dejando en claro la diferencia
Configuración de Asterisk 49
El teléfono requiere del sip.conf para autenticarse
El usuario requiere de las reglas del extensions.confpara poder marcar
Empezaremos por la configuración del sip.confFuente: Asterisk The Definitive GuideFuente: Asterisk The Definitive GuideFuente: Asterisk The Definitive Guide
sip.conf
Configuración de Asterisk 50
Aquí se define todo lo relacionado con SIP• Configuración de usuarios y troncales
Tiene 2 secciones: [general] y área de usuarios• [general] contiene valores que afectan a todos los
usuarios, así como al canal SIP mismo. Es la configuracióndefault.
• El área de usuarios define la configuración específica de cada usuario.
En caso de que el mismo campo esté configurado en ambas secciones, la individual gana
• Cualquier dato que no exista, se tomará su valor default.
sip.conf (2)
Configuración de Asterisk 51
Hay muchos campos diferentes que podemos configurarpara cada usuario SIP
• Hay más de 30, y la lista crece en cada versión nueva de Asterisk.
Para dar de alta un usuario SIP existen 3 camposobligatorios:
• type• host• context• El nombre del usuario es lo que aparece como el [encabezado]
Cualquier campo no especificado se usará su valordefault
Campos básicos
Configuración de Asterisk 52
CampoValores posibles
Función
typeuser, peer
o friend
Controla las llamadas que hace/recibe, así como interpretar la autenticación del dispositivouser: Se autentica por username. Solo puede hacer llamadas hacia Asteriskpeer: Se autentica por dirección IP y puerto.friend: Combinación de ambas
host<dirección IP>
o dynamic
Especifica si el equipo (el teléfono) tiene una IP fija o si puede tomar cualquiera (dinámica).También indica si el teléfono tiene que registrarse hacia Asterisk o no.
context<nombre del
contexto>Determina el contexto (el conjunto de reglas de marcación) al que podrá acceder el usuario.
secret <contraseña> Especifica la contraseña para el usuario
Algunos campos adicionales
Configuración de Asterisk 53
Algunos campos adicionales por usuario:
Para conocer todos los campos, consultar los comentarios del archivomuestra sip.conf
Campo Valores posibles Función
allow /
disallow<códec>
Habilita o deshabilita el uso de ciertos códecs
language <código de idioma>Permite cambiar el lenguaje default de este usuario
dtmfmodeauto, inband,
rfc2833Determina como se enviarán los códigosDTMF
mailbox<buzón>@<contexto>
Hace que el teléfono consulte el buzón de voz por nuevos mensajes
permit
/deny
<Dirección IP> /<Máscara>
Limita el registro a dispositivos cuya IP coincida con la indicada aquí.El orden de deny/permit es importante.
Básico
[usuario1]context=agentestype=friendhost=dynamic
Avanzado
[usuario2]context=supervisortype=peerhost=192.168.1.34secret=abcde12345
dtmfmode=auto
disallow=all
allow=g729
language=es
mailbox=200@default
Ejemplos de usuarios SIP
Configuración de Asterisk 54
Esto permite que un
teléfono se registre
hacia Asterisk sin
contraseña
Seguro
[usuario2]context=supervisortype=friendhost=dynamicsecret=JuK!23+c9
deny=0.0.0.0/0
permit=192.168.1.0/24
El usuario tiene más
argumentos
configurados
Esto limita a una
contraseña más
segura y obliga a que
tenga que tener una
IP local
Control de nombres
Configuración de Asterisk 55
Debemos llevar un control de nombre de los dispositivos
• Evitar que se repitan• Dar seguridad• Facilitar la administración
Diferentes esquemas de nombrado de dispositivos tiene sus propias ventajas y desventajas
• Debemos decidir cual se adapta mejor a nuestras necesidades
Control de nombres (2)
Configuración de Asterisk 56
Método Ejemplo SeguridadCrear/cambiar
usuariosFácil de recordar
Extensiones101
201
320
Bajafáciles de adivinar
DifícilCambiar equipos sin cambiar
extensión
Muy FácilDígitos simples
Personas/Ubicaciones
jortiz
sala_juntasMedia
DifícilImaginar casos donde el mismo usuario tiene 2
dispositivos, o 2 personas se llaman igual en la compañía
Muy FácilNombres sencillos
Direcciones MAC
00121419AEFF AltaDifícil de adivinar
SencilloNuevos dispositivos tienen
nuevas MACDifícil
Contraseñas tel-aJ13K74
MáximaVirtualmente imposible de
adivinar
SencilloEs muy simple crear nuevas
entradas aleatoriamenteMuy difícil
Un poco más de seguridad
Configuración de Asterisk 57
Adicional al campo secret, siempre que sea posible debemos utilizar el permity deny.
• Solo en aquellos usuarios externos dinámicos no será posible aplicarlo
El orden es importante• Lo común es negar todo y
luego permitir lo que queremos
Podemos usar nomenclatura estándar (/255.255.255.0) o abreviada (/24)
[juan]
type=friendcontext=agenteshost=dynamicdeny=0.0.0.0/0permit=192.168.5.1/24
[carrier]
type=peercontect=from-trunkhost=201.194.200.9deny=0.0.0.0/0.0.0.0permit=201.194.200.9/255.255.255.255
Es posible crear plantillas de usuarios
• Los campos comunes se aplican una única vez y de ahí se reutilizan las veces que sean necesarias
• Ahorro de código al no tener que redeclarar valores
Se declaran con (!)
Es posible aplicar múltiples plantillas al mismo tiempo
[usuario](!)type=friendcontext=micontextohost=dynamic
[local](usuario,!)nat=nodeny=0.0.0.0/0permit=10.1.1.2/24
[100](usuario)secret=55tDyXID
[200](local)secret=32nAc5Tt
Plantillas
Configuración de Asterisk 58
Ejemplo general sip.conf
Configuración de Asterisk 59
[general]disallow=all ; Negamos todos los codecs a todosallow=alaw ; y solo permitimos alaw
[usuarios](!) ; Creamos una plantilla para host=dynamic ; homologar nuestros usuariostype=friendcontext=micontextodeny=0.0.0.0/0permit=192.168.1.0/24
[usuario1](usuarios) ; Invocamos la plantilla y solosecret=abcde12345 ; declaramos la contraseña
[usuario2](usuarios) ; Mismo caso. Podemos repetir cuantassecret=fghij9876 ; veces queramos
[micarrier] ; Una troncal SIP para enviar llamadasusername=ccabrera ; No podemos reaprovechar la plantillasecret=$uYjOpa2! ; porque los campos son muy diferentescontext=from-trunktype=peer
#include “sip_extra.conf” ; Podemos tener la configuración en más ; distribuida en varios archivos
Práctica 2.1
Creación de usuarios SIP yconfiguración de softphone
Práctica 2.2
Configurar un teléfono IP
Plan de marcación
Configuración de Asterisk 62
Se define en el archivo extensions.conf
Contiene 3 secciones:• [general]• [globals]• Área de contextos
[general] configura el manejo del archivo de extensiones (comúnmente no se altera)
[globals] define constantes que pueden ser referenciadas desde cualquier parte del dialplan
El área de contextos declara los diferentes contextos quedefinen el plan de llamadas
Sintaxis
Configuración de Asterisk 63
La sintaxis general del plan de llamadas es:
<extensión> es cualquier valor alfanumérico<prioridad> es el orden con el que se ejecutarán lasdiversas aplicaciones<aplicación> es el comando a ejecutar
[contexto]
exten => <extensión>,<prioridad>,<aplicación>
Ejemplo de extensiones válidas
Configuración de Asterisk 64
exten => 123,1,Answerexten => 123,2,Wait(5)exten => 123,3,Hangup
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
Extensiones especiales
Configuración de Asterisk
Extensión Significado Función
t timeoutExtensión que llega al no ingresar dígitos dentro
del tiempo establecido
Tabsolute
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 invalidActivada 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 Extensión default de entrada
65
Extensión “s” (start)
Configuración de Asterisk
101 101
MEX GDL
¿ Llamada hacia
SIP/GDL ?
Llamada hacia
SIP/GDL/101
s
66
Prioridades
Configuración de Asterisk 67
Determinan el orden de ejecución de los comandosde una extension
• Siempre deben comenzar con 1, de lo contrario Asterisk invalidará toda la extensión
• El orden debe ser consecutivo
Al numerarlas, pueden ser escritas en cualquier orden• Asterisk las ordenará en memoria
El uso de la prioridad ‘n’ (next) facilita la escritura• Facilita hacer inserciones o cambios
Ejemplos de prioridades
Configuración de Asterisk 68
Extensión escrita en desorden pero numeradaexten => 100,3,Hangupexten => 100,1,Noopexten => 100,2,Answer
La misma extensión escrita con prioridad ‘n’exten => 100,1,Noopexten => 100,n,Answerexten => 100,n,Hangup
O bien:exten => 100,1,Noopsame => n,Answersame => n,Hangup
Usar ‘n’ es más fácil al no tener que renumerar
Prioridades (2)
Configuración de Asterisk 69
Para diferenciar una prioridad de otra, la prioridad ‘n’ puede contener etiquetas:
[default]exten => 100,1,Answersame => n,Wait(2)same => n(bienvenida),Playback(welcome)same => n,Hangup
La referencia a estas etiquetas se puede hacermediante un Goto
exten => 100,n,Goto(default,100,bienvenida)
Esto nos permite controlar el flujo de nuestro plan de marcación
Práctica 2.3
Plan de llamadas sencillo
Plan de llamadas
Configuración de Asterisk 71
Usuarios SIP
micontexto
Patrones
Configuración de Asterisk 72
No es posible definir todas las posibles extensiones
Los patrones son caracteres especiales que reemplazan un rango de dígitos:
Todos los patrones deben ser precedidos por “_” para no ser descartados al momento de marcarlos
Patrón 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
Ejemplos
Configuración de Asterisk 73
Patrón Dígitos que reemplaza
_0133ZXXXXXXX
_0181ZXXXXXXX
_0155ZXXXXXXX
Llamadas de LDN hacia MGM
_01NXXZXXXXXX Llamadas de LDN a provincia
_01900XXXXXXX Llamadas a 01900
_ZXXXXXXX Llamadas locales
_ZXXXXX00 Llamadas locales que terminen en 00
_0[347]0 Servicios 030, 040 y 070
_9. Todo lo prefijado por 9
_1XZ Extensiones 101-199, excepto 100, 110, 120, etc.
Patrones (3)
Configuración de Asterisk 74
En caso de que más de un patrón coincida, Asterisk los ordena del más específico al más general:
1. Números/letras (1 única coincidencia)2. Rangos [ ] (coincidencias de 1 a 7 dígitos)3. N (8 coincidencias)4. Z (9 coincidencias)5. X (10 coincidencias)6. . (infinitas coincidencias)
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
Atención especial a los patrones
Configuración de Asterisk 75
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.
[largadistancia]
exten => _01ZXXXXXXXXX,1,Noop(Llamada de LD)
same => n,Dial(SIP/carrier/${EXTEN})
exten => _01900ZXXXXXX,1,Noop(No permitir llamada)
Variables
Configuración de Asterisk 76
Mismo concepto que en un lenguaje de programación• Son etiquetas que hacen referencia a un valor• Podemos extraer el valor en cualquier momento
Hay 4 tipos de variables• 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
Variables globales
Configuración de Asterisk 77
Se declaran en la sección [globals] del archivo extensions.conf
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
[globals]
celular=0445512345678
[micontexto]
exten => 911,1,Dial(DAHDI/g0/${celular})
Variables de canal
Configuración de Asterisk 78
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
Se declaran con la aplicación Set
exten => s,1,Set(MIVAR=hola)
Hay algunas variables pre-definidas por el sistema:• ${CONTEXT}: el contexto actual• ${EXTEN}: la extensión actual (marcada)• ${PRIORITY}: la prioridad de procesamiento actual• ${DIALSTATUS}: el estado del último comando Dial ejecutado
Variables de entorno
Configuración de Asterisk 79
Variables de Linux que se pueden acceder desde Asterisk
Se acceden con la función ${ENV(variable)}
Ejemplo:
exten => 123,1,Noop(El path de Linux es ${ENV(PATH)})
Variables heredadas
Configuración de Asterisk 80
Heredadas• Llevan un guión bajo _• Solo están disponibles para el primer canal creado por el canal padre
Heredadas indefinidamente• Llevan dos guiones bajos __• Disponibles para todos los canales generados por el padre
[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)
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
Manipulando variables
Configuración de Asterisk 81
Se usa la sintaxis:${<nombre variable>[:<offset>:[<cantidad>]]}
• Ejemplo${MIVAR} = holamundo
${MIVAR:3} = amundo
${MIVAR:-5} = mundo
${MIVAR:3:2} = am
• ¿Cómo nos quedaríamos solo con 'hola'?
Útil para reformatear números:Noop(${EXTEN}) ;015546144330
Set(EXTEN=52${EXTEN:2})
Noop(${EXTEN}) ;525546144330
Práctica 2.4
Uso de patrones y variables
Considerar cada contexto como un grupo de permisos único
Reutilizar contextos declarados previamente
• Pueden incluirse contextos dentro de otros
Contextos de extensión
Configuración de Asterisk 83
[nivel3]Celulares
[nivel2]LDN
[nivel1]Locales
Contextos de extensión (2)
Configuración de Asterisk 84
Notar lo siguiente:
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
[internas]exten => _ZXXX,1,Dial(SIP/${EXTEN})
[locales]include => internasexten => _ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})
[largadistancia]include => localesexten => _01ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})exten => _ZXXXXXXX,1,Hangup
Contextos de extensión (3)
Configuración de Asterisk 85
Pueden incluirse contextos basados en tiempo
Sintaxis:
include => contexto,<hora>,<dia>,<dia mes>,<mes>
Ejemplo:
Es recomendable incluir primero lo más específico y al último lo más general
[micontexto]
include => gratis,21:00-23:59,mon-fri,*,*
include => gratis,*,sat-sun,*,*
Prioridades de ejecución
Configuración de Asterisk 86
Exten vs. Exten• Gana el que tenga el patrón de marcación más específico
Exten vs. Include• Siempre gana el exten
Include vs. Include• Gana el que esté declarado primero
Evaluador
Configuración de Asterisk 87
Podemos evaluar una operación lógica o aritmética usando $[ ]
Ejemplo:
Esto puede usarse para hacer reemplazos o evaluar condicionales
• Asterisk no evalúa operaciones por default
Operadores válidos
+, -, *, /, %, >, >=, <, <=, =, !=, &, |, ~
exten => s,1,Set(MiValor=$[10/2])
same => n,Noop(${MiValor}) ; 5
Funciones
Configuración de Asterisk 88
Permiten procesar valores o datos que normalmenteno estarían accesibles:
Se despliegan con el comandocore show functions
desde el *CLI
Se escriben completamente en mayúsculas
Se acceden como si fueran variables ${FUNC()}• No perder de vista el orden de los { ( ) }
exten => s,1,Noop(${MD5(${MI_CLAVE_SECRETA})})
Funciones (2)
Configuración de Asterisk 89
Algunas funciones guardan valores, otras sólo los despliegan
Ejemplo: LEN() regresa la longitud de una cadenaSet(MIVAR=“hola mundo”)
Noop(${LEN(${MIVAR})}) ; 10
Ejemplo: CALLERID(num) permite cambiar o mostrar el caller id
Set(CALLERID(num)=5544332211)
Noop(El valor es ${CALLERID(num)})
Subrutinas
Configuración de Asterisk 90
Conjuntos de acciones agrupadas que reciben parámetros• Hechas por el usuario• Útiles para procesos repetitivos con cambios entre invocaciones
Reemplazan el concepto de macros de versiones anteriores de Asterisk
• Las subrutinas no tienen límite de anidamiento
Al ejecutar una subrutina, se brinca hacia el contexto-extensión-prioridad que la subrutina indique
• Es necesario agretar un Return() para regresar al punto desde el que se invocó a la subrutina.
Subrutinas (2)
Configuración de Asterisk 91
Cuando se invoca una subrutina, se pueden proporcionar argumentos
• Se usan para personalizar la subrutina• Se crean automáticamente en las variables
${ARG1}, ${ARG2}, ${ARG3}, etc
Cada subrutina tiene variables individuales• Los argumentos no se mezclan entre si
Se invocan con la aplicación Gosub• Gosub(<contexto>,<extensión>,<prioridad>([argumentos]) )
Cualquier extensión puede convertirse en subrutina
Ejemplo de una subrutina
Configuración de Asterisk 92
De esta manera, pueden alterarse todas las acciones modificando solamente la subrutina
• En este ejemplo el Return sobra porque de cualquier manera, la llamada se cuelga antes de llegar a él.
[sub-llamada]exten => s,1,Answer ; Este es el código quesame => n,Dial(${ARG1},20) ; declara la subrutina.same => n,Voicemail(${ARG2}) ; No sirve de nada hasta
same => n,Hangup ; que no la invoquemossame => n,Return
[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}))
En resumen
Configuración de Asterisk 93
Cada archivo en Asterisk tiene una labor específica• Usuarios SIP en sip.conf• Plan de llamadas en extensions.conf
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
Las variables almacenan valores que podemos reutilizar
Podemos agrupar tareas usando subrutinas• E invocarlas las veces que sean necesarias cambiando solo los
argumentos
Práctica 2.5
Subrutinas e inclusiones
Plan de llamadas
Configuración de Asterisk 95
Usuarios SIP
micontexto
internas
adicional
llamada
Capítulo Básico #3Arquitectura de Asterisk
Ing. Christian Cabrera R.
Antecedentes
Arquitectura de Asterisk 97
Los módulos de Asterisk se configuran de manera independiente
• Alto nivel de control
En el núcleo, Asterisk solo es un conmutador
• Ajeno a cualquier tecnología
Fuente: wiki.asterisk.org
Sistema de archivos
Arquitectura de Asterisk 98
Asterisk coloca sus archivos en diferentes carpetas:
Tipo de archivo Ubicación
Configuración /etc/asterisk
Módulos /usr/lib/asterisk/modules
Logs /var/log/asterisk
AGIs /var/lib/asterisk/agi-bin
Sonidos /var/lib/asterisk/sounds
Voicemail /var/spool/asterisk/voicemail
Grabaciones /var/spool/asterisk/monitor
Salida de llamadas /var/spool/asterisk/outgoing
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
• AMI, AGI, CLI
Responsable de • Administrar módulos• Carga de configuración• Sincronía del sistema• Manejo de canales• Control del plan de
llamadas
Núcleo de Asterisk
Arquitectura de Asterisk 99
Haciendo crecer a Asterisk
Arquitectura de Asterisk 100
Para agregar/quitar funcionalidades, controlamos los módulos que Asterisk carga
• Editando /etc/asterisk/modules.conf limitamos cuales módulos serán cargados
Tenemos 4 clases principales de módulos:• Canales• Códecs• Aplicaciones/funciones• Recursos adicionales
Lista de módulos
Arquitectura de Asterisk 101
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
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
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
Módulos: Canales
Arquitectura de Asterisk 102
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)
Módulos: Aplicaciones
Arquitectura de Asterisk 103
Ejecutan acciones durante una llamada
Se cargan dinámicamente conforme se necesitan
Ejecutadas síncronamente• 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
• Asterisk carga 180+ aplicaciones al momento de arrancar el sistema
Pueden consultarlas usando *CLI> core show applications
Módulos: Aplicaciones (2)
Arquitectura de Asterisk 104
Algunas aplicaciones:Aplicación Acción
Dial Marca hacia la tecnología/canal especificado
Wait Espera ‘x’ segundos
Goto Brinca hacia la prioridad especificada
GotoIf Brinca condicionalmente
Macro Permite agrupar más aplicaciones y repetirlas
AGI Invoca un AGI script externo
Playback Reproduce un archivo de sonido
Background Igual que Playback, pero permite ingresar DTMFs
Read Pide dígitos al usuario y los almacena en una variable
Hangup Cuelga la llamada
Set Guarda un valor en una variable
Módulos: Recursos
Arquitectura de Asterisk 105
Integran a Asterisk con recursos externos• Bases de datos• Calendarios• Música en espera• Monitoreo (grabación)
Se cargan de manera estática• Requieren una recarga de módulo al modificarse
Pueden operar simultáneamente en varios canales• Cada canal recibe lo mismo que los otros
Asterisk CLI
Arquitectura de Asterisk 106
La interfaz humano-Asterisk• 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
Módulos pueden agregar comandos al *CLI• Ej. sip show peers depende del módulo chan_sip.so
AGI: Asterisk Gateway Interface
Arquitectura de Asterisk 107
Ejecuta scripts externos a Asterisk
Escritos en diferentes lenguajes• Perl, PHP, Python, Bash, etc
Permite que Asterisk sea una puerta de enlace (gateway) entre un teléfono y una aplicación no-telefonica
• Encuestas, IVRs, juegos, etc
Se verá más a detalle en un capítulo propio
AMI: Asterisk Manager Interface
Arquitectura de Asterisk 108
A diferencia del CLI, esta es una interfaz computadora-Asterisk
Permite ejecutar comandos o monitorear al sistema
Al igual que el CLI, algunos módulos agregan comandos
Usada por aplicaciones como el FOP, popups de agente para callcenter, sistemas de click-to-call, etc
Se verá más a detalle al final del curso
Práctica 3.1
Instalando un módulo desde source: format_mp3 para música en espera
Práctica 3.2
Instalando un módulo precompilado: Códec G729
Práctica 3.3(opcional)
Cambiando el idioma de Asterisk
Capítulo Básico #4Aplicaciones
Ing. Christian Cabrera R.
Introducción
Aplicaciones de Asterisk 113
Existen muchas aplicaciones en Asterisk • Más de 150+
Cada aplicación tiene su propia sintaxis• No es necesario aprenderlas todas, pero si las másimportantes
Todas son consultables desde el *CLIcore show applicationscore show application <aplicación>
Buzones de voz
Aplicaciones de Asterisk 114
Ofrecer funcionalidad de dejar mensaje a un usuario.
Los buzones se crean en archivo voicemail.conf• Allí se definen los usuarios, sus nombres, contraseñas y
correos para envio de mensajes
Se usa a través de 2 aplicaciones:• Dejar el mensaje: Voicemail• Recuperar los mensajes: VoicemailMain
Es necesario programar estas aplicaciones en el extensions.conf
voicemail.conf
Aplicaciones de Asterisk 115
Aquí configuramos los buzones y sus contraseñas
Configuración general y múltiples contextos de buzones de voz
Si queremos tener activo el envío de correos debemos instalar un MTA (Mail Transfer Agent) en Linux
[general]
; Aquí va la configuración general de los buzones de voz
[default]
101 => 1234,Juan Pérez,[email protected],,attach=yes
102 => 1234,Jorge López,[email protected],,attach=yes
Voicemail
Aplicaciones de Asterisk 116
Permite dejar un mensaje de voz al buzón especificado
• El buzón/contexto deben existir en el voicemail.conf• Podemos dejar un mensaje en más de un buzón a la vez
Sintaxis:Voicemail(<buzón>[@<contexto>],<opciones>)
Ejemplos:Voicemail(100,b)
Voicemail(201&202,u)
VoicemailMain
Aplicaciones de Asterisk 117
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: VoicemailMain([buzón],[opciones])
Ejemplos:VoicemailMain(100,s)
VMAuthenticate
Aplicaciones de Asterisk 118
Autentica al usuario a partir de la contraseña de su buzón• 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: VMAuthenticate([buzón][@contexto],[opciones])
Ejemplos:VMAuthenticate(101@default)
Ejemplos de uso
Aplicaciones de Asterisk 119
; voicemail.conf
[default]
101 => 1234,Juan Pérez,[email protected],,attach=yes
; extensions.conf[sub-llamar]exten => s,1,Dial(${ARG1},20)same => s,n,Voicemail(${ARG2}@default)same => s,n,Hangupsame => s,n,Return
[internas]include => larga-distanciaexten => _*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})
Práctica 4.1
Agregar servicio de voicemail para nuestras extensiones
Interacción con el usuario
Aplicaciones de Asterisk 121
En ocasiones tenemos necesidades como:• Repetir alguna grabación (bienvenidas)• Dar opciones de menu• Capturar dígitos ingresados en el teléfono• Reproducir números
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
Playback
Aplicaciones de Asterisk 122
Reproduce el sonido especificado• Obliga al usuario a escucharlo (no puede saltarse)• No pueden recibirse tonos mientras se reproduce
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
Sintaxis: Playback(<archivo>,[opciones])
Ejemplo:Playback(bienvenida)
Background
Aplicaciones de Asterisk 123
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)
Sintaxis: Background(<archivo>)
Ejemplo:Background(digite-opciones)
Read
Aplicaciones de Asterisk 124
Pide dígitos al usuario• No se hace nada con ellos, solo se almacenan en una
variable para uso posterior
Sintaxis: Read(<var>,[archivo],[maxdigitos],[opciones],[intentos],[timeout])
Ejemplo:Read(pass,enter-account,4)
Entendiendo la diferencia
Aplicaciones de Asterisk 125
Read pide datos para almacenar o procesar• Ej. Contraseñas o números de cuenta
Background transfiere hacia la ext. marcada• Ej. «Para ventas, digite 1. Soporte digite 2»
Playback solo reproduce archivos• Obligamos al usuario a que escuche la grabación
SayDigits
Aplicaciones de Asterisk 126
Reproduce un número dígito por dígito• 12345 = Uno dos tres cuatro cinco
Se usa para reproducir números que no correspondan a una cantidad
• Números de contrato• Números de cuenta• Contraseñas
Ejemplo:SayDigits(123192)
SayNumber
Aplicaciones de Asterisk 127
Lee un número como una cantidad• 12345 = Docemil trescientos cuarenta y cinco
Debe recibir solamente números enteros• No hace distinción de números o cadenas
Ejemplo:Saynumber(123192)
Sobre las aplicaciones de audio
Aplicaciones de Asterisk 128
Todos los sonidos se buscan por default en /var/lib/asterisk/sounds
Para cambiar el idioma de los sonidos, hay 2 maneras:• 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)
Si algún archivo de sonido no existe en el idioma deseado, se usará el mismo archivo en inglés
• Si tampoco existe el archivo en inglés, dará un error
Ejemplo
Aplicaciones de Asterisk 129
[from-pstn]include => horario-habil,9:00-18:00,mon-fri,*,*include => fuera-de-horario
[horario-habil]include => internasexten => 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
Práctica 4.2
Rutinas con reproducción de audio
Control de llamadas
Aplicaciones de Asterisk 131
Para asegurar que el audio fluya a través del canal, es recomendable contestarlo primero
• Algunas aplicaciones lo hacen automáticamente
Es ocasiones es necesario insertar silencios antes o después del audio
• Dar mejor espacio entre llamadas o dar oportunidad al usuario a que ingrese dígitos
Answer
Aplicaciones de Asterisk 132
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 otraaplicación haga un contestado implícito
Sintaxis: Answer([milisegundos])
Ejemplo:Answer(3000)
Wait
Aplicaciones de Asterisk 133
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
Sintaxis: Wait(<segundos>)
Ejemplo:Wait(10)
WaitExten
Aplicaciones de Asterisk 134
Funciona igual que Wait, pero el usuario puedeingresar dígitos
• Asterisk intentará comunicar al usuario a la extensiónmarcada
• Útil para dar tiempos adicionales en IVRs• Es equivalente a un Background en silencio
Sintaxis: WaitExten(<segundos>,[opciones])
Ejemplo:WaitExten(3.5)
Comunicación entre usuarios
Aplicaciones de Asterisk 135
La tarea más importante en un conmutador es comunicar extensiones
Asterisk ofrece la posibilidad de comunicar varios usuarios en una misma llamada
Dial
Aplicaciones de Asterisk 136
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
Sintaxis: Dial(<tech/user>,[timeout],[opciones])
Ejemplo:Dial(SIP/100,30,tT)Dial(SIP/201&SIP/202,30,tT)
Meetme
Aplicaciones de Asterisk 137
Establece cuartos de conferencia• 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
Sintaxis: MeetMe([conferencia][,opciones[,nip]])
Ejemplo:Meetme(8500,d)Meetme(8501,D,2198)
Controles de flujo
Aplicaciones de Asterisk 138
El dialplan sigue una programación secuencial• 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
Goto
Aplicaciones de Asterisk 139
Hace saltos incondicionales hacia cualquier contexto-extensión-prioridad
Puede recibir 1, 2 o 3 parámetros• 1: Solo prioridad (misma ext. y contexto)• 2: Extensión y prioridad (mismo contexto)• 3: Contexto, extensión y prioridad
Sintaxis: Goto([contexto],[extensión],<prioridad>)
Ejemplos:Goto(opciones)Goto(s,continua)Goto(default,s,1)
GotoIf
Aplicaciones de Asterisk 140
Igual que Goto, pero solo brinca si la condición se cumple
• Dos posibles destinos• Es importante evaluar la condicional
Sintaxis: GotoIf(<condición>?<verdadero>:[falso])
Ejemplos:GotoIf($[${var}>3]?s,1:default,123,1)
ExecIf
Aplicaciones de Asterisk 141
Permite ejecutar una aplicación única basada en una condicional
• Útil para hacer variaciones en un solo comando
Ejemplo:
ExecIf($[${var}>1]?Playback(hola):Playback(adios))
Ejemplo global: IVR
Aplicaciones de Asterisk 142
[from-pstn]include => internasexten => 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)
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)
Práctica 4.3
Crear un menu IVR
Práctica 4.4 (opcional)
Uso de funciones
Plan de llamadas
Aplicaciones de Asterisk
Usuarios SIP
micontexto
internas
adicional
saldo
llamada
contador
menu
servicios
145
Capítulo Básico #5Conexión con la PSTN
usando DAHDI
Ing. Christian Cabrera R.
Introducción
Interconexión por DAHDI 147
Asterisk tiene la posibilidad de interactuar con la PSTN• Se requiere de hardware adicional o rentar un servicio de terceros
Para la interconexión directa pueden usarsegateways externos o tarjetas internas
• Los gateways se configuran por SIP• Nos centraremos en las tarjetas
Al no usar protocolos propietarios, la libre competencia ha reducido los costos del equipo
Los 3 principales fabricantes del mercado:
• Digium• Sangoma• Openvox
Cualquiera de sus tarjetas funciona con Asterisk, solo se configuran un poco diferente
Fabricantes
Interconexión por DAHDI 148
Tarjetas analógicas
Interconexión por DAHDI 149
FXO (Foreign Exchange Office)• Reciben corriente (de la telefónica)• Aquí conectas una línea que viene de la calle
(Telmex, Axtel, Alestra, etc)
FXS (Foreign Exchange Station)• Entregan corriente hacia el teléfono• Conectas un teléfono convencional (Panasonic,
Alcatel, Siemens, etc)
Puertos analógicos
Interconexión por DAHDI 150
Son los más comunes• Estos son los puertos que usaríamos para poner un PBX en
casa
Limitados a una llamada simultánea por canal• El par de cobre está dedicado a un único circuito
En otros conmutadores se llaman diferente:• FXO = CO• FXS = EXT
¡Nunca conectar FXS-FXS!• Podrías quemar los puertos
Tarjetas digitales
Interconexión por DAHDI 151
Todas soportan tanto E1s como T1s• Configurable por software
T1: Estándar Americano• 23 canales de voz + 1 señalización
E1: Estándar Europeo• 30 canales de voz + 1 de señalización + 1 de
sincronía
Conexión física
Interconexión por DAHDI 152
Las tarjetas digitales tienen puertos RJ45 (8 pines), pero los enlaces normalmente vienen en G703 (coaxial)
• Es necesario un convertidor que además de adaptar el conector, acople las impedancias correctamente
Para estos propósitos se usa un balun
Puertos digitales
Interconexión por DAHDI 153
Son troncales de múltiples canales digitales (DS-0)• Usando TDM (Time Division Multiplexing) es posible agrupar
muchos canales en un solo enlace
Usados en entornos de grandes oficinas o corporativos• 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
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
Sincronía
Interconexión por DAHDI 154
Dado que los enlaces digitales están multiplexados en tiempo, requieren de una fuente de sincronía
Las tarjetas digitales tienen 2 opciones:• 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)
Sin una fuente de sincronía precisa, tendremos problemas• Ruidos en la línea• Puede ocasionar que las llamadas se desconecten
Deberemos configurar este parámetro en el system.conf
Framing
Interconexión por DAHDI 155
Según el tipo de enlace, hay diferentes tipos:
Tanto D4 como CAS son tecnologías viejas y no deberían usarse
• Desafortunadamente, en Latinoamérica usamos principalmente R2 modificado, el cual usa CAS
T1s (EUA y CAN) E1s (resto del mundo)
D4 – Super Frame(obsoleto)
CAS – Channel Associated
Signaling (obsoleto)
ESF – Extended Super FrameCCS – Common Channel
Signaling
Comparación ISDN vs R2MFC
Interconexión por DAHDI 156
E1s con ISDN PRI E1s Canalizados (R2 MFC)
30 canales de voz 30 canales de voz
Usa CCS Usa CAS
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
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
Más caro, por ser tecnología nueva
Ofrece mucho más información por
llamada
Interconexión con otros PBX
Interconexión por DAHDI 157
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
Asterisk puede actuar como maestro (simular ser la telefónica) o actuar como esclavo (dejando al otro PBX ser el maestro)
• Puede adaptarse fácilmente a las necesidades del otro conmutador
¿Qué es un DID?
Interconexión por DAHDI 158
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)
Es posible comprar DIDs virtuales que lleguen por SIP• Esto evita tener que comprar tarjetas
Un enlace digital puede tener múltiples DIDs• Al recibir la llamada, la telefónica indica a que DID marcó el
cliente• Una línea análoga tiene un DID único asignado
Interacción en software
Interconexión por DAHDI 159
Asterisk/etc/asterisk/chan_dahdi.conf
DAHDI/etc/dahdi/system.conf
Tarjetas
Digium
Wanpipe/etc/wanpipe/wanpipe1.conf
Tarjetas
Sangoma
OpenR2Solo en caso que
usemos R2 MFC
/etc/dahdi/system.conf
Interconexión por DAHDI 160
Archivo base de configuración de las tarjetas• Liga los módulos de DAHDI con los puertos de las tarjetas
Por cada puerto digital, declaramos un span• 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
Los puertos análogos de declaran cruzados• FXO se declaran como FXS y viceversa
Los canales deben ser consecutivos de acuerdo al ordenen que se cargan los módulos
• /etc/dahdi/modules
system.conf
Interconexión por DAHDI 161
Los spans se declaran con la sintaxis:span=<número>,<sincronía>,<atenuación>,<framing>,<coding>
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
system.conf (2)
Interconexión por DAHDI 162
Ejemplo para 1 E1 ISDN + 4 FXO + 1 FXS
# 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
# R2 MFC
span=1,1,0,cas,hdb3
cas=1-15:1101
cas=17-31:1101
dchan=16
system.conf (3)
Interconexión por DAHDI 163
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
Tomar nota del orden de los canales, ya que los ocuparemos en el siguiente archivo
/etc/asterisk/ chan_dahdi.conf
Interconexión por DAHDI 164
Aquí hacemos que Asterisk trabaje con los canales de DAHDI instalados
Configuramos la señalización, las funciones del canal, los grupos y los contextos a los que pertenecen
Prestar atención a la sintaxis
chan_dahdi.conf
Interconexión por DAHDI 165
; 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
; 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
context=from-pstn
group=0
channel => 1-15,17-31
chan_dahdi.conf (2)
Interconexión por DAHDI 166
Para aplicar los cambios (se caerán las llamadas):*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 => _ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})exten => _01ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})exten => _04455ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})exten => _045ZXXXXXXXXX,1,Dial(DAHDI/g0/${EXTEN})exten => _01900.,1,Congestion
Práctica 5.1
Instalación de una tarjeta DAHDI
Plan de llamadas
Interconexión por DAHDI 168
Usuarios SIPUsuarios SIP
micontexto
internas
adicional
salida
saldo
llamada
contador
menu
PSTN
entrada
Capítulo Intermedio #1Enlaces IAX y troncales SIP
Ing. Christian Cabrera R.
IAX es un protocolo de comunicación
Se define en el archivo /etc/asterisk/iax.conf
El protocolo SIP se ocupa principalmente paraextensiones• Pero también podemos tener troncales en SIP
Recapitulando
Enlaces IAX y troncales SIP 2
IAX = Inter Asterisk eXchange
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 agruparmúltiples llamadas en un solo enlace
Introducción
Enlaces IAX y troncales SIP 3
SIP IAX2
Pro
s• 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
Co
ntr
as
• 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
Comparativa SIP vs IAX
Enlaces IAX y troncales SIP 4
En SIP, cada paquete tiene su propio encabezado
En ocasiones, el tamaño de los encabezados supera al del mensaje
Si los paquetes son siempre entre el punto A y B, se repite mucha información
Trunking IAX desactivado
Enlaces IAX y troncales SIP 5
54
3
5 4 3
54
3
2 2 2 1 1 1
Con IAX podemos habilitar el trunking y compartir los encabezados
• Solo cambia el cuerpo de los mensajes
La relación encabezados/cuerpo es mucho menor
• El ancho de banda se aprovecha mejor
Trunking IAX activado
Enlaces IAX y troncales SIP 6
54
3
5 4 3
54
3
2 2 2 1 1 1
Igual que en SIP• Campos context, type y host• Sección general y sección de múltiples usuarios
Si no se especifica secret, cualquier usuario sin contraseña podrá llamar
• Esto se usa para poder recibir llamadas anónimas• Es preferible declarar una cuenta iax sin contraseña con
accesos muy restringidos
Alta de usuarios IAX
Enlaces IAX y troncales SIP 7
Hay 3 escenarios para interconectar equipos:
1. Ambos equipos cuentan con IP fija• El más sencillo de implementar• Cada host siempre conoce la ubicación del otro
2. Uno tiene IP fija y el otro dinámica• 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)
Conectando los equipos
Enlaces IAX y troncales SIP 8
Creando el enlace
Enlaces IAX y troncales SIP 9
; Host A
; sip.conf/iax.conf
[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32
; Host B
; sip.con/iax.conf
[usuario A]
username=<usuario B>
host=<ip A>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip A>/32
; Host A
; sip.conf/iax.conf
[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32
; Host B
; sip.con/iax.conf
[usuario A]
username=<usuario B>
host=<ip A>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip A>/32Si en verdad eres el usuario 101,
¿Cuál es tu contraseña?
¡Correcto! Quedas registrado
desde la IP 192.168.1.145
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 otro proxy)
Proceso de registro
Enlaces IAX y troncales SIP 10
101 @ 192.168.1.145
(IP dinámica)
192.168.1.200
(IP fija)
Soy el usuario 101 y estoy en la
IP 192.168.1.145. Registrame por
favor
Mi contraseña es ******
Los registros se hacen en la sección [general] del iax.conf/sip.conf y tienen el siguiente formato:
register => <usuario>:<password>@<dominio>
Ejemplos:register => 10025:[email protected] => 5550181181:[email protected]
Al registrarse, el equipo que recibe (el fijo) ya conocela dirección del dispositivo dinámico
• Ya sabe a donde enviar las llamadas
Proceso de registro (2)
Enlaces IAX y troncales SIP 11
Creando el enlace (2)
Enlaces IAX y troncales SIP 12
; Host A (dinámico)
; sip.con/iax.conf
[general]
register => usuarioA:elmismo@<ip B>
[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32
; Host B (fijo)
; sip.con/iax.conf
[usuario A]
username=<usuario B>
host=dynamic
secret=<elmismo>
context=entrada
type=friend
; Host A (dinámico)
; sip.con/iax.conf
[general]
register => usuarioA:elmismo@<ip B>
[usuario B]
username=<usuario A>
host=<ip B>
secret=<elmismo>
context=entrada
type=friend
deny=0.0.0.0/0
permit=<ip B>/32
; Host B (fijo)
; sip.con/iax.conf
[usuario A]
username=<usuario B>
host=dynamic
secret=<elmismo>
context=entrada
type=friend
Existen varios formatos para mandar las llamadas:
IAX2/usuario_iax/extension• IAX2/proveedor/0140
IAX2/username:password@dominio/extension• IAX2/10999:[email protected]/525512345678
IAX2/dominio/extension• IAX2/asteriskmx.com/101
Todos estos formatos aplican para SIP e IAX• Algunos pueden simplificarse creando previamente una
entrada en el archivo de configuración
Envío de llamadas
Enlaces IAX y troncales SIP 13
[micontexto]include => salidainclude => sucursales
[salida]; Llamadas locales en DF y LDNexten => _ZXXXXXXX,1,Dial(SIP/micarrier/${EXTEN})exten => _01ZXXXXXXXXX,1,Dial(SIP/micarrier/52${EXTEN:2}); Pido prestadas las lineas de mis otros conmutadoresexten => _0133ZXXXXXXX,1,Dial(IAX2/pbxGDL/${EXTEN:4})exten => _0181ZXXXXXXX,1,Dial(IAX2/pbxMTY/${EXTEN:4})
[sucursales]; Llamadas internas entre conmutadores. El primer dígito; identifica a que conmutador vanexten => _3XXX,1,Dial(IAX2/pbxGDL/${EXTEN})exten => _4XXX,1,Dial(IAX2/pbxMTY/${EXTEN})
Ejemplos de llamadas
Enlaces IAX y troncales SIP 14
Práctica 6.1
Crear un enlace IAX entre2 servidores Asterisk
Práctica 6.2
Recibir llamadas IAX anónimas
Práctica 6.3
Conexión con un carrier IAX/SIP
Plan de llamadas
Usuarios SIP
micontexto
internas
adicional
salida
saldo
llamada
contador
menu
sucursal
IAX anónimos
PSTN/
Vecinos IAX
servicios
entrada
IAX autenticados
Capítulo Intermedio #2Distribució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 esbuena opción
El plan de llamadas no permite controlar de maneraespecífica a quienes se les enviarán las llamadas en base a su ocupación
Recapitulando
Distribución automática de llamadas (ACD) 20
¿Qué puede ofrecernos la plataforma?• 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
Asterisk como CallCenter
Distribución automática de llamadas (ACD) 21
Hay 2 partes importantes en todo esquema de atenciónal usuario: miembros y colas
Una cola es una fila donde entran aquellos que deseancomunicarse 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
Componentes
Distribución automática de llamadas (ACD) 22
Si una cola no tiene miembros asignados, no podráatender llamadas
• Si no ha nadie al teléfono, ¿quién contesta?
Los miembros pueden ser estáticos o dinámicos• Los estáticos se configuran en el queues.conf• Los dinámicos se dan de alta por CLI o por el dialplan
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
Características
Distribución automática de llamadas (ACD) 23
Archivo donde se configuran todas las colas del sistema• Existe la sección de [general] y múltiples [colas]
Podemos agregar miembros estáticos a cada cola usandoel campo de member:
member => <Tech>/<usuario>, [penalización],[nombremiembro]
Ejemplo:[soporte] ; Agrego 2 miembros a soporte
member => SIP/100,0,Christian Cabreramember => IAX2/vecino/200,1,Juan Lopez
Los miembros estáticos siempre se consideran en línea• Para tener el concepto de login/logout, debemos usar miembros
dinámicos
Colas: queues.conf
Distribución automática de llamadas (ACD) 24
Colas: queues.conf (2)
Distribución automática de llamadas (ACD) 25
Campo Valores posibles Función
musicclass <clase de MOH>Especificar la clase de la música en espera.
Se define en el archivo musiconhold.conf
announce<archivo de sonido
del anuncio>
Reproducir un anuncio para el agente al
momento de contestar una llamada. Util para
miembros registrados en más de una cola
strategy
linear, leastrecent,
ringall, fewestcalls,
random, rrordered,
rrmemory,wrandom
Define la estrategia de timbrado a seguir
(random, rrordered y rrmemory son los más
justos)
timeout <segundos>Tiempo máximo que se le timbrará a un
miembro antes de considerarlo no disponible
weight <peso>Importancia de la cola con respecto a otras. Una
cola más importante será atendida antes
[general]persistentmembers=yesmonitor-type=MixMonitor ; Activar la grabación general
[ventas]announce=salesmusicclass=nuevosproductosstrategy=linealweight=5member => SIP/ventas1 ; Miembros estáticosmember => SIP/ventas2
[soporte]timeout=10strategy=rrmemorymember => SIP/soporte1member => SIP/soporte2
Ejemplo de queues.conf
Distribución automática de llamadas (ACD) 26
Esto crea las colas del sistema, ahora es
necesario dejar que los clientes lleguen
a ella
Permite a los clientes formarse en una cola• Pueden introducirse posiciones en la cola para tomar
preferencias
[from-pstn]exten => s,1,Answer(3000)same => n(opciones),Background(digite-opcion)same => n,WaitExten(4)same => n,Goto(opciones)
exten => 1,1,Queue(ventas)exten => 2,1,Queue(soporte)
En este ejemplo, ventas y soporte deben existir en el queues.conf
Aplicación: Queue
Distribución automática de llamadas (ACD) 27
Permiten al miembro dejar de tomar llamadas temporalmente
• Se especifican con las aplicaciones PauseQueueMember() y UnpauseQueueMember()
Ejemplo:; Pausar solamente la cola de ventasexten => *60,1,PauseQueueMember(ventas,SIP/${CALLERID(num)})exten => *61,1,UnpauseQueueMember(ventas,SIP/${CALLERID(num)})
; Pausar todas las colasexten => *70,1,PauseQueueMember(,SIP/${CALLERID(num)})exten => *71,1,UnpauseQueueMember(,SIP/${CALLERID(num)})
También podemos pausar desde el *CLI*CLI> queue pause member SIP/101 ; Para todas*CLI> queue unpause member SIP/101 queue ventas ; Para ventas
Pausas
Distribución automática de llamadas (ACD) 28
Práctica 7.1
Crear un centro de atención a clientes
Permiten simular el uso de agentes• 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; 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
Miembros dinámicos
Distribución automática de llamadas (ACD) 30
Práctica 7.2
Agregar miembrosdinámicos a una cola
Capítulo Intermedio #3Asterisk DB
Ing. Christian Cabrera R.
Las variables solo existen mientras dura la llamada• Al terminar la llamada, se destruyen las variables
relacionadas
Podemos guardar información como constantes en el plan de llamadas
Algunas funciones requieren un medio de almacenamiento permanente para pasar datos entre sesiones
Recapitulando
Asterisk Database 33
Asterisk posee su propio manejador de base de datos sencillo
• Asterisk DB
Desde Asterisk 10, el AstDB está basado en SQLite• En versiones inferiores se usaba la Berkeley DB
Se puede utilizar mediante funciones de Asterisk:• DB()• DB_EXISTS()• DB_DELETE()
Introducción
Asterisk Database 34
DB() permite modificar y obtener valores contenidos en la base de datos de Asterisk
DB(<familia>/<llave>)
Los valores se leen y escriben como si fueran variables
Set(DB(sigueme/100)=5546144330)
Noop(${DB(sigueme/100)})
Es posible especificar más de una familia/llaveDB(usuario/100/fwd)
Asterisk DB
Asterisk Database 35
Cada familia puede descomponerse en subniveles• Familias dentro de familias dentro de familias• Cualquier nivel se crea automáticamente al declararlo la
primera vez
Estructura jerárquica
Enlaces IAX y troncales SIP 36
Familia1
Llave1 Valor1
Llave2 Valor2
SubFamilia1 Llave3 Valor3
Familia2Llave5(vacía)
DB_DELETE() elimina la llave especificada
DB_EXISTS() determina si la llave especificadaexiste• Regresa un 1/0 según si la llave existe o no• Es indiferente a valores vacios
Ambas funciones crean la variable ${DB_RESULT}
• Contiene el valor que existía en la BD• Útil para evitar reconsultarla
DB_DELETE y DB_EXISTS
Asterisk Database 37
Funciones que deban recordar el status de los teléfonos
• DND (no molestar)• Redireccionamiento• Contraseñas• *69 (último número marcado)
Cualquier dato pequeño y único que no tenga que ser consultado para razones históricas
• No recomendable para información que deba ser modificada desde fuera de Asterisk
Usos prácticos del AstDB
Enlaces IAX y troncales SIP 38
[servicios] exten => *31,1,Set(DB(dnd/${CALLERID(num):-1}00)=${destino})same => n,Playback(do-not-disturb&enabled)same => n,Hangup
exten => *22,1,Noop(${DB_DELETE(dnd/${CALLERID(num):-1}00)})same => n,Playback(do-not-disturb&disabled)same => n,Hangup
[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
[internas]exten => _[12]00,1,Gosub(sub-llamada,s,1(SIP/usuario${EXTEN:0:1},100))
Ejemplo de DND
Enlaces IAX y troncales SIP 39
Sencilla y fácil de usar en el dialplan
No requiere controladores externos
Toda la información almacenada en un solo archivo/var/lib/asterisk/astdb
Permanece aunque Asterisk se reinicie
Solo pueden extraerse datos únicos en base a unafamilia y una llave
• No pueden hacerse querys• No son tablas, sino listas ordenadas
Características de AstDB
Asterisk Database 40
Rápida
Asterisk la utiliza para guardar información• Ej. Registro de usuarios SIP
Puede verse el contenido completo usando*CLI> database show
Características de AstDB (2)
Asterisk Database 41
Práctica 8.1
Usar Asterisk DB para crear un redireccionamiento de llamada
Práctica 8.2 (opcional)
Usar Asterisk DB para bloquear extensiones al final del día
Plan de llamadas
Asterisk Database 44
Usuarios SIP
micontexto
internas
adicional
salida
saldo
llamada
contador
menu
sucursal
IAX anónimos
PSTN/
Vecinos IAX
servicios
entrada
permitidos
IAX autenticados
permitir
Capítulo Intermedio #4Integración con bases de datos
Ing. Christian Cabrera R.
45
Todos los datos que Asterisk posee son estáticos• 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
Recapitulando
Integración con bases de datos 46
Asterisk puede integrarse con diferentes manejadoresde 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
Introducción
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
Escogiendo el manejador
Integración con bases de datos 48
Asterisk soporta ODBC a través de 3 módulos• res_odbc• res_config_odbc• cdr_odbc
Linux ofrece conectividad con ODBC mediante el paquete unixODBC
Asterisk y ODBC
Integración con bases de datos 49
Nos permite conectarnos por ODBC con cualquiermanejador
• Punto único de interacción con múltiples manejadores
Debemos conseguir la librería necesaria para el manejador deseado
• Puede tener costo
unixODBC
Integración con bases de datos 50
unixODBC
ODBC -> MySQL requiere la librería libmyodbcapt-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 usaremoscuando nos conectemos con cada manejador
unixODBC (2)
Integración con bases de datos 51
Configura los controladores necesarios paraque ODBC interactue con la base de datosrequerida
Ejemplo para MySQL:
odbcinst.ini
Integración con bases de datos 52
[MySQL]
Description =MySQL driver
Driver =/usr/lib/odbc/libmyodbc.so
Setup =/usr/lib/odbc/libodbcmyS.so
Configura los data sources de ODBC
Ejemplo para MySQL:
odbc.ini
Integración con bases de datos 53
[MySQL-asterisk]
Description=MySQL ODBC Driver Testing
Driver=MySQL
Socket=/var/run/mysqld/mysqld.sock
Server=localhost
Database=asterisk
Call Detail Recording• Detalle de llamadas
Por default, los CDRs se escriben en un archivo CSV• /var/log/asterisk/cdr-csv/Master.csv
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
Instalando un CDR
Integración con bases de datos 54
res_odbc.conf• Creamos los perfiles de
conexión para Asterisk• El usuario y contraseña
debe haberse creadopreviamente
cdr_odbc.conf• Especificamos que tablas y
que perfil usar para guardar el CDR
ODBC en Asterisk
Integración con bases de datos 55
[cdr-asterisk]
enabled => yes
dsn => MySQL-asterisk
username => cdruser
password => cdrpass
pre-connect => yes
[global]
dsn=cdr-asterisk
loguniqueid=yes
dispositionstring=yes
table=cdr
Todo relacionado
Integración con bases de datos 56
; /etc/asterisk/res_odbc.conf
[cdr-asterisk]
dsn => MySQL-asterisk
; /etc/odbc.ini
[MySQL-asterisk]
Driver=MySQL
; /etc/odbcinst.ini
[MySQL]
Driver=/usr/lib/odbc/libmyodbc.so
Setup=/usr/lib/odbc/libodbcmyS.so
libmyodbc
; /etc/asterisk/cdr_odbc.conf
[general]
dsn => cdr-asterisk
Práctica 9.1
Configurar el CDR por ODBC (MySQL)
57
Asterisk Realtime Architecture (ARA)• Capa intermedia que abstrae el código de BD• No es necesario hacer queries
Reemplaza archivos de texto por tablas• Convertimos los archivos de texto a formato tabular• Permite actualizar datos sin recargar el sistema
Realtime
Integración con bases de datos 58
Diferentes mecanismos para diferentes propósitos:
Los archivos de texto son excelentes para iniciar, pero no son tan flexibles ni escalan tan bien como Realtime
Comparación entre mecanismos de configuración
Integración con bases de datos 59
Archivos de
textoCLI AMI Realtime
Setup Inicial Bajo Alto Alto Medio
Mantenimiento Medio Medio Medio Bajo
Escalabilidad Media Baja Media Alta
Flexibilidad Baja Baja Baja Alta
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)
Dos versiones de Realtime
Integración con bases de datos 60
1. Escoger el manejador de base de datos: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óncon ODBC
Requerimientos
Integración con bases de datos 61
Creamos un nuevo perfil en res_odbc.conf para la conexión con Realtime
• En este ejemplo, usamos el mismo DSN que el que definimospara nuestra conexión del CDR
Con esto le indicamos a Asterisk que futuras conexionesutilizarán estas credenciales
• Darle los privilegios necesarios al usuario realtimeuser en MySQL
Configurando Realtime
Integración con bases de datos 62
[realtime-asterisk]
enabled => yes
dsn => MySQL-asterisk
username => realtimeuser
password => realtimepass
pre-connect => yes
Por cada tabla a consultar por Realtime, necesitamoscrear una familia en el archivo extconfig.conf
[settings]<familia> => <controlador>,<conector>,<tabla>
Donde:• <familia> es una referencia a Realtime• <controlador> es el tipo de BD a usar (ODBC, MySQL,, etc) • <conector> es el nombre del perfil creado para esta
conexión (res_config_mysql.conf, res_odbc.conf, etc)• <tabla> es la tabla para esta familia de Realtime
Configurando Realtime (2)
Integración con bases de datos 63
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)
Se puede escoger cualquier nombre para los [conectores] y para las tablas
• Solo hay que recordar hacer referencia al nombre correcto
Ejemplo: extconfig.conf
Integración con bases de datos 64
[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
Por default, el nombre de la familia se usa como tablasipusers => mysql,asterisk
es igual asipusers => mysql,asterisk,sipusers
Debemos ocupar una tabla diferente para cada familia• Los campos que cada familia requiere son únicos• Comúnmente, solo se comparten tablas para users/peers
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
Configurando Realtime (3)
Integración con bases de datos 65
Almacena la configuración de usuarios SIP• Configuración general permanece en sip.conf
La tabla puede tener cualquier campo para SIP, aunque no se usen todos
• Si no se llenan, Asterisk usará los default• Podemos crear una tabla básica, con solo 4 campos
Asterisk automáticamente empieza a leer las tablasen cuanto encuentra las familias:
• sippeers• sipusers
Realtime SIP
Integración con bases de datos 66
Recordar que al usar Realtime no se guardan en memoria los peers registrados
• El sip show peers regresará vacio
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
• A partir de este momento comienzan a almacenarse en memoria
Realtime SIP (2)
Integración con bases de datos 67
Se puede usar para casi cualquier tipo de extensión(ej. no macros)
• El resto debe existir en extensions.conf
En extensions.conf es necesario usar: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 palabraextensions
Realtime extensions
Integración con bases de datos 68
No hay que olvidar de utilizar switch
es lo mismo que usar
Siempre es necesario utilizar switch, o nunca se buscarán extensiones en la BD
Realtime extensions (2)
Integración con bases de datos 69
[micontexto]
switch => Realtime/@
[micontexto]
switch => Realtime/micontexto@extensions
Todo relacionado
Integración con bases de datos 70
; /etc/asterisk/extconfig.conf
sipusers => odbc,realtime-asterisk,rt_sipfriends
extensions=> odbc,realtime-asterisk,rt_extensions
; /etc/asterisk/res_odbc.conf
[realtime-asterisk]
dsn => MySQL-asterisk
[cdr-asterisk]
dsn => MySQL-asterisk
; /etc/asterisk/cdr_odbc.conf
[general]
dsn => cdr-asterisk
; /etc/asterisk/extensions.conf
[internas]
switch => Realtime/internas@extensions
Práctica 9.2
Realtime SIP yRealtime extensions
71
Una función muy poderosa que nos permite consultar o cambiar valores de una tabla
• Se requiere de una familia para poder usarse
Sintaxis para lecturaSet(Fila=${REALTIME(familia,columna,valor,sep1)})
Sintaxis para escrituraSet(REALTIME(familia,columna,valor,campo)=nuevo)
Función REALTIME
Integración con bases de datos 72
REALTIME nos regresa una cadena de texto
Ejemplo:Set(Fila=${REALTIME(saldos,usuario,100,&)})
Nos arroja:Set(Fila=usuario=100&saldo=123.45)
Es equivalente a SELECT * FROM saldos WHERE usuario=100
De ahí podemos usar CUT para quedarnos con los valores que queremos
Leer valores
Integración con bases de datos 73
Ejemplo:Set(REALTIME(saldos,usuario,100,saldo)=302)
Es equivalente a UPDATE saldosSET saldo='302'WHERE usuario=100
Esto modificaría la base de datos y guardaría 302 en el campo ‘saldo’
Escribir valores
Integración con bases de datos 74
Práctica 9.3
Uso de Realtimepersonalizado
75
Tenemos esta línea:Set(Fila=${REALTIME(saldos,usuario,${CALLERID(num)},&)})
Es equivalente a:Set(Fila=usuario=100&saldo=1234.56)
Entonces:Set(${CUT(Fila,&,2)})
Es igual a:Set(saldo=1234.56)
¿Cómo funciona el CUT?
Integración con bases de datos 76
Plan de llamadas
Integración con bases de datos 77
Usuarios SIP
micontexto
internas
adicional
salida
saldo
llamada
contador
menu
sucursal
IAX anónimos
PSTN/
Vecinos IAX
servicios
entrada
permitidos
IAX autenticados
permitir
El módulo func_odbc permite la posibilidad de crear funciones personalizadas
Podemos hacer cualquier consulta SQL • No estamos limitados a consultas de Realtime
Se configura desde el func_odbc.conf
La sintaxis es como sigue:
Funciones personalizadas
Integración con bases de datos 78
[FUNCION]
dsn=<nombre del DSN en Asterisk>
readsql=<query de lectura>
writesql=<query de escritura>
Ejemplo de función que consulte/actualice un saldo (func_odbc.conf):
[SALDO]dsn=realtime-asteriskreadsql=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})
func_odbc
Integración con bases de datos 79
[menu] ; extensions.confexten => 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 2:
Integración con bases de datos 80
[PASS] ; func_odbc.conf
dsn=realtime-asterisk
readsql=SELECT pass FROM usuarios WHERE usuario = '${ARG1}'
writesql=UPDATE usuarios SEt pass = '${VAL1}' WHERE usuario = '${ARG1}'
Práctica 9.4 (opcional)
Crear una función personalizadaODBC
81
Capítulo Avanzado #1Asterisk Extensions
Language (AEL)
Ing. Christian Cabrera R.
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 => <extensión>,<prioridad>,<aplicación>
Ejemploexten =>_ZXXXXXXX,1,Dial(SIP/amx/${EXTEN})
Recapitulando
Asterisk Extensions Language 2
Algunas funciones (ej. ciclos) son difíciles de programar en el dialplan básico
Analizar un dialplan puede resultar complicado trasseguir instrucciones como goto y gosub
Se decide crear un lenguaje de programación de extensiones, conocido como Asterisk Extension Language (AEL)
Introducción
Asterisk Extensions Language 3
Sintaxis más similar a un lenguaje de programación• Programadores preferirán esta sintaxis
Permite crear estructuras más uniformes para el manejo de extensiones
• Menos código inútil, más trabajo con menos
Se configura en el archivo extensions.ael
AEL 2.0
Asterisk Extensions Language 4
Saltos de línea indiferentes
Bloques contenidos entre ‘{‘ y ‘};’
Fin de comando con ;
Asignación de variables natural
Comentarios con //(monolínea) y /* */(multilínea)
Sintaxis general
Asterisk Extensions Language 5
context largadistancia {
_01XXX. => {
Answer();
Dial(SIP/user/${EXTEN});
};
// Esto es un comentario
_00XXX. => {
NoOp(No permitido);
Hangup;
/* Tambien es
un comentario */
};
};
Se definen con context. Un contexto va delimitadopor sus llaves respectivas
Hay que cuidar no dejar extensiones fuera del contexto
Siempre terminar la última ‘}’ con ;
Contextos
Asterisk Extensions Language 6
context default {
// Las extensiones van aquí
};
Sintaxis:
<extensión> => <aplicación>;
ó
<extensión> => {<aplicación 1>;<aplicación 2>;
};
Las prioridades ya no se numeran, pero deben ser escritas en orden
Extensiones
Asterisk Extensions Language 7
context default { 1234 => Playback(tt-monkeys);
8000 => {NoOp(uno);
etiqueta: NoOp(dos); NoOp(tres);
};
_5XXX => goto 8000,etiqueta;};
Todos los includes deben estar contenidos en el mismobloque:
También pueden incluirse archivos enteros usando #include
#include “more_extensions.ael”
No olvidar que al dejar {} abiertos en un archivo, continúanabiertos en los que siguen
Inclusiones de contextos
Asterisk Extensions Language 8
context default {
includes {
longdistance,16:00-23:59,mon-fri,*,*;
local;
};
};
Las variables y funciones se asignan directamente sobre el dialplan:
El lado derecho de la asignación es evaluado, de manera que estasexpresiones 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;
Variables
Asterisk Extensions Language 9
context default {
100 => {
CALLERID(num)=1234567890;
NoOp(Mi CID es ${CALLERID(num)});
};
};
Soporte para for y while• El valor intermedio también es evaluado ( $[] )
Ciclos
Asterisk Extensions Language 10
context ciclos {
1 => {
for (x=0; ${x}<3; x=${x}+1) {
Verbose(x vale ${x});
};
};
2 => {
y=10;
while (${y} >= 0) {
Verbose(y vale ${y});
y=${y}-1;
};
};
};
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
Condicionales: if, else
Asterisk Extensions Language 11
_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
Condicionales: ifTime, random
Asterisk Extensions Language 12
);
);
_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%);
};
};
Equivalente a un if anidado
¿Qué número nunca se activa en el ejemplo?
Condicionales (switch)
Asterisk Extensions Language 13
_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);
};
};
Se definen e invocan como si fueran funciones de un lenguaje de programación
Reciben variables en vez de argumentos
Para invocar un macro, se hace con un & al inicio&llamada(0140,0120) ;
Macros
Asterisk Extensions Language 14
macro llamada(exten,voicemail) {
Dial(Local/${exten}@default);
if (“${DIALSTATUS}” = “BUSY”)
Voicemail(${voicemail},b);
else
Voicemail(${voicemail},u);
};
context menu { ; extensions.ael
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
}; // Cierre de contextoAsterisk Extensions Language 15
Práctica 10.1
Crear un pseudo marcador predictivousando Realtime y ciclos
Plan de llamadas
Asterisk Extensions Language 17
Usuarios SIP
micontexto
internas
adicional
salida
saldo
llamada
contador
menu
sucursal
IAX anónimos
PSTN/
Vecinos IAX
servicios
micontexto-ael
entrada
permitidos
IAX autenticados
permitir
Capítulo Avanzado #2Asterisk Gateway
Interface (AGI)
Ing. Christian Cabrera R.
Tenemos control del dialplan a partir del extensions.conf
Existe una lógica de programación más avanzadautilizando extensions.ael
Aún con estas características más avanzadas, algunasfunciones resultarían muy complejas de programarutilizando el plan de llamadas
Recapitulando
Asterisk Gateway Interface 19
AGI no es un lenguaje: es una interfaz para controlarAsterisk
No está ligado a ningún lenguaje en específico• Podemos usar Perl, PHP, Python, C, Java, Bash, etc
Los scripts se colocan en la carpeta/var/lib/asterisk/agi-bin
Similar al CGI de Apache
Se interactua con Asterisk a traves de flujos de datos:• STDIN, STDOUT y STDERR
Introducción
Asterisk Gateway Interface 20
Por cada escritura que se haga al STDOUT, existe unalectura en el STDIN
Escribimos en el STDOUT para enviar comandos
Leemos del STDIN para obtener respuestas
Escribimos en el STDERR para hacer notificaciones de sistema
• Hacia Linux, no hacia Asterisk
Flujos
Asterisk Gateway Interface 21
Y el proceso puede repetirse indefinidamente
AGI envía comandos a Asterisk• El AGI toma todas las decisiones
Asterisk envía respuestas al AGI• Asterisk solo es un intermediario entre usuario <-> AGI
Flujos (2)
Asterisk Gateway Interface 22
Script
AGI
get data "please-enter-your"
Ext. 777AGI(script.agi)
"Por favor ingrese su"
Ingresa "12345"data=12345, result=200
Procesamiento
interno en BD
stream file "usuario-valido""Su usuario es válido"
Es una clase para PHP que nos permite ahorrarcódigo
• Permite concentrarnos en la aplicación
Maneja automáticamente el flujo de datos• Solo invocamos métodos de la clase y se nos entrega el
resultado, sin preocupaciones de formato
Creamos una instancia de la clase para despuesenviar/leer comandos desde allí
$var = $agi->get_variable(‘CALLERID(num)’);
PHPAGI
Asterisk Gateway Interface 23
Reproducir los números del 1 al 10:
Ejemplo de AGI
Asterisk Gateway Interface 24
#!/usr/bin/php –q<?php
include ‘phpagi.php’;
$agi = new AGI();
foreach (range(1,10) as $x) {
$agi->say_number($x);
}
$agi->hangup();
?>
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ónde Asterisk está disponible para su uso con AGIs
• Usar comando Exec
Comandos
Asterisk Gateway Interface 25
• 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
Comandos (2)
Asterisk Gateway Interface 26
• 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
Práctica 11.1
Crear un juego interactivousando AGIs
Capítulo Avanzado #3Asterisk Manager
Interface (AMI) y archivos de llamadas
Ing. Christian Cabrera R.
Nuestro conocimiento del plan de llamadas esreactivo
• Creamos extensiones esperando que alguien las marque y actuamos acorde
En ocasiones, tenemos necesidad de que Asterisk haga llamadas sin nadie que las origine
• Marcadores predictivos, sistemas automáticos, etc
Existen 2 maneras de instruir a Asterisk a que hagallamadas
Recapitulando
Asterisk Manager Interface 29
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
Su puerto default es el TCP 5038
Comunicación en texto plano• Se recomienda un túnel SSH para resolver esto
• Asterisk 1.6+ soporta uso de TLS
Asterisk Manager Interface
Asterisk Manager Interface 30
Solicitar nuevas llamadas
Grabar bajo demanda
Transferir/colgar llamadas
Ejecutar comandos del CLI
Acceso remoto al AstDB
Obtener el estado de las extensiones
Editar archivos de configuración
Recibir información de eventos del sistema
Funciones principales
Asterisk Manager Interface 31
Los datos que se envían al AMI tienen la sintaxis:
Campo: valor
Según la acción que se envíe (Login, Originate, Command, etc) son los campos a enviar.
Para ver la lista completa de acciones, usar
*CLI> manager show commands
Un doble salto de línea significa que el grupo de valores termino y que el AMI debe procesar la solicitud
Envío de comandos
Asterisk Manager Interface 32
Conexión por telnet al puerto TCP 5038
Para que el login sea válido, debe existir un usuario creado en el manager.conf
Ejemplo de autenticación
Asterisk Manager Interface 33
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
Response: Success
Message: Authentication accepted
Aquí se activa el AMI y conceden los permisos• Siempre restringir a 127.0.0.1
Archivo: manager.conf
Asterisk Manager Interface 34
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[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
Ventanas emergentes para agentes• Sistemas de callcenter que le dan al agente información
sobre quien le llama
Aplicaciones de marcado automático• Click 2 dial
• Llamadas via web
• Marcadores automáticos/predictivos
Monitoreo del sistema
Consolas de operadora (Flash Operator Panel)
Usos del AMI
Asterisk Manager Interface 35
Tras hacer login, ejecutamos un comando como el que sigue
• Tener cuidado con la escritura, ya que el AMI no se lleva bien con los errores
Esto es equivalente a hacer un*CLI> originate SIP/100 extension 200@micontexto
Solicitando llamadas
Asterisk Manager Interface 36
Action: Originate
Channel: SIP/100
Context: micontexto
Exten: 200
Priority: 1
Timeout: 10000
ActionId: ABCDE12345
El AMI es la manera más poderosa de controlar Asterisk
Por obvias razones, el AMI no es user-friendly• El AMI nunca se pensó para que un humano lo usara
Existen clases en diferentes lenguajes que nos permiten conectarnos fácilmente al AMI
• Ej. AGI_AsteriskManager() de PHPAGI
¿Existe algo más sencillo para hacer que Asterisk solicite llamadas?
Interactuando con el AMI
Asterisk Manager Interface 37
Los archivos de llamada son comandas de llamadas• Instrucciones en texto que le dicen a Asterisk a quien, como
y cuando llamar
Se colocan en la carpeta /var/spool/asterisk/outgoing
Sintaxis muy similar al Originate de AMI• Nota: los archivos deben ser movidos, no copiados
• Si un archivo se copia al momento que se está creando, puede dar problemas
Call files
Asterisk Manager Interface 38
Creamos un archivonano /root/test.call
Movámoslo a la carpeta adecuadamv /root/test.call /var/spool/asterisk/outgoing
¿Qué ocurre?
Podemos consultar todos los campos igual que con el comando Originate del AMI
*CLI> manager show command originate
Ejemplo de call file
Asterisk Manager Interface 39
Channel: SIP/usuario2
Application: Playback
Data: demo-congrats
Los archivos de llamada nos permiten especificar la hora en que se ejecutarán
• 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
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
Controlando los tiempos
Asterisk Manager Interface 40
Práctica 12.1
Crear un verdadero marcador predictivo que lea un saldo adeudado
Capítulo Avanzado #4Cifrado de llamadas en
SIP
Ing. Christian Cabrera R.
Asterisk usa SIP como su principal protocolo de comunicación
Una llamada SIP viaja en 2 flujos diferentes:• La señalización (5060 UDP)
• La voz (RTP aleatorio)
Por default, ninguno de los dos va cifrado• Cualquiera que intercepte los paquetes puede reconstruir la
conversación
Recapitulando
Cifrado de llamadas en SIP 43
Asterisk 1.4 • No existía mecanismo de seguridad para SIP
Asterisk 1.6• Se soporta SIP sobre TCP
• Se agrega soporte experimental para TLS (solo se encriptala señalización)
Asterisk 1.8• Se soporta TLS completamente
• Se agrega soporte para Secure RTP (SRTP). La voz viaja cifrada
Antecedentes
Cifrado de llamadas en SIP 44
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
Transport Layer Security (TLS)
Cifrado de llamadas en SIP 45
Flujo del handshake
Cifrado de llamadas en SIP 46
Cliente Servidor Resultado
ClientHello 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
ServerHello Servidor escoge la versión de TLS más alta
posible y los algoritmos a usar. Envía un número
aleatorio
Certificate Servidor envía su certificado para que cliente
pueda autenticarlo
ServerHelloDone Servidor finaliza handshake
ClientKeyExchange Cliente envía PreMasterSecret, llave pública o
nada (según algoritmo elegido)
MasterSecret Se calcula el MasterSecret
TLS Handshake
Cifrado de llamadas en SIP 47
Cliente 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
ChangeCipherSpec «Todo lo que venga a continuación viene
autenticado/cifrado»
Finished Se envía un hash del condensado de todos los
mensajes anteriores
A partir de aquí, todo viaja encriptado
TLS Handshake (2)
Cifrado de llamadas en SIP 48
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
OpenSSL nos da herramientas para crear certificados• Podemos usar certificados autofirmados, pero eso permitiría
que cualquiera nos reemplace
Configurando Asterisk para TLS
Cifrado de llamadas en SIP 49
Ya existe un script proporcionado dentro del código fuente de Asterisk:
<astsrcdir>/contrib/scripts/ast_tls_cert
Lo invocamos dando los siguientes argumentos:• IP de Asterisk• Nombre de la empresa• Directorio que almacenará la llave y certificado
./ast_tls_cert -C <IP> -O "<Empresa>" -d <Directorio>
El sistema nos pedirá una contraseña que deberemos confirmar para firmar nuestros certificados
Creando la llave y certificado
Cifrado de llamadas en SIP 50
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
Por último, habilitamos TLS al cliente SIP (también podemos bajo [general])
transport=tls
Configurando Asterisk
Cifrado de llamadas en SIP 51
¿Qué significa cada opción en [general]?
Configurando Asterisk (2)
Cifrado de llamadas en SIP 52
Campo Significado
tlsenableHabilita el uso de TLS en todo el equipo (requiere
reiniciar Asterisk)
tlsbindaddrDirección IP donde escucharemos por nuevas peticiones
TLS (debe coincidir con la IP del certificado)
tlscertfile Ubicación del certificado para TLS
tlscafileUbicación del certificado para la entidad certificadora
(CA)
tlsdontverifyserverActivar/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
Con TLS, los encabezados SIP ya no pueden ser descifrados
• Sin embargo, es posible interceptar la voz, aunque no conozcamos los datos de la llamada
Para hacer que la voz viaje cifrada, requerimos hacer uso de Secure RTP (sRTP)
• 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.
Transporte seguro, carga no
Cifrado de llamadas en SIP 53
Conseguir, compilar e instalar la librería libSRTP• http://srtp.sourceforge.net/srtp.html
Recompilar Asterisk para agregar el soporte para el módulo res_srtp.so
Editar el archivo sip.conf para habilitar la encriptación (encryption=yes) para cada usuario SIP que queramos que la use.
Requisitos para usar SRTP
Cifrado de llamadas en SIP 54
Ejemplo de usuarios SIP seguros
Asterisk Manager Interface 55
[usuario1]type=friendhost=dynamiccontext=micontextotransport=tlsencryption=yes
secret=aYtK4I1!
Con Wireshark se observan estos paquetes:
Llamada con UDP
Cifrado de llamadas en SIP 56
El análisis de VoIP detecta fácilmente la llamada:
Llamada con UDP (2)
Cifrado de llamadas en SIP 57
Es posible graficarla:
Llamada con UDP (3)
Cifrado de llamadas en SIP 58
E inclusive, guardar el audio:
Llamada con UDP (4)
Cifrado de llamadas en SIP 59
No es posible ver el contenido SIP
Llamada con TLS/sRTP
Cifrado de llamadas en SIP 60
El stream de la llamada no es detectado
Obviamente, no es posible graficarla ni reproducir el audio
Llamada con TLS/sRTP (2)
Cifrado de llamadas en SIP 61
Práctica 13.1
Configurar SIP mediante TLS y sRTP
Capítulo Avanzado #5Seguridad en Asterisk
Ing. Christian Cabrera R.
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)
• Contraseñas inseguras
• Puertos abiertos
• Validar al teléfono, no al usuario
Recapitulando
Seguridad en Asterisk
Instalar Asterisk es muy rápido• 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
Introducción
Seguridad en Asterisk
No usemos secret=100 si nuestro username=100
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
1) Contraseñas inseguras
Seguridad en Asterisk
En FreePBX/Elastix/Asterisk, cambiar:• root de ssh
• root de MySQL
• Asterisk Manager Ingerface (manager.conf)
• admin de FreePBXTabla MySQL asterisk.ampusers
• asteriskuser en /etc/amportal.conf
• admin de ElastixTabla SQLite3 /var/www/db/acl.db
• Todos los usuarios SIP/IAX
1) Contraseñas inseguras
Seguridad en Asterisk
Si no tenemos agentes externos, ¿Por qué permitir que las extensiones se registren desde cualquier IP?
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
Mejor aún, cerrar los puertos a nivel de firewall• Usar iptables
2) Limitar el acceso a ciertas IPs
Seguridad en Asterisk
Si hemos de recibir conexiones desde afuera, entregar siempre el mismo mensaje de error
• Usar alwaysauthreject=yes en sip.conf
Esto impedirá que los atacantes conozcan si el usuario es válido o no
3) Rechazar sin dar información
Seguridad en Asterisk
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
Esto ayuda en casos que a usuarios legítimos les fue robada su contraseña
4) Limitar llamadas simultáneas
Seguridad en Asterisk
Hay llamadas muy caras que son esporádicas (ej. Internacionales)
• Podemos pedir contraseña via DTMFs
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
5) Autenticar al usuario
Seguridad en Asterisk
Definir adecuadamente el context default dentro de [general] en sip.conf
• Cualquier usuario NO autenticado puede marcar a través de él
Nuestro contexto default siempre debe ser limitado• Nunca permitir llamadas que puedan tener costo
6) Negar llamadas anónimas
Seguridad en Asterisk
Herramientas como fail2ban pueden analizar logs y bloquear múltiples intentos de registro
• Inclusive enviar correos de la notificación
Aplicable a cualquier log (SSH, HTTP, etc)
7) Bloquear fuerza bruta
Seguridad en Asterisk
No utilizar patrones como_9.,1,Dial(DAHDI/g0/${EXTEN:1})
mejor usar_9ZXXXXXXX,1,Dial(DAHDI/g0/${EXTEN:1})
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
8) Patrones de marcado claros
Seguridad en Asterisk
Cuidar a que dispositivos les permitimos la autenticación sin contraseña
• insecure=invite• Siempre usar permit/deny en conjunción con insecure
No usar el parámetro de host como una restricción de IP
• Para eso existe permit/deny
9) Confianza
Seguridad en Asterisk
Práctica 14.1
Aseguramiento del conmutador
Asterisk Manager Interface76
Queremos que la siguiente experiencia sea aún mejor, así que pedimos su muy valioso apoyo para contestar una encuesta sobre el curso
enlaza.mx/encuestaEs anónima
• No tienen que proporcionar su nombre si no lo desean
¿Qué les pareció el curso?
Asterisk Manager Interface 77
Christian Cabrera [email protected]
(55) 50 181 181SIP/enlaza.mx
Twitter y Facebook: @AsteriskMX@EnlazaMX
Contacto
Asterisk Manager Interface 78
Top Related