Curso Asterisk Enlaza

83
Capítulo Básico #1 Introducció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 Tipo Fecha de lanzamiento Actualizaciones de seguridad Fin de vida 1.4.X LTS Dic 2006 Abr 2011 Abr 2013 1.6.2.X Estándar Dic 2009 Abr 2011 Abr 2012 1.8.X LTS Oct 2010 Oct 2014 Oct 2015 10.X Estándar Dic 2011 Dic 2012 Dic 2013 11.X LTS Oct 2012 Oct 2016 Oct 2017 12.X Estándar Oct 2013 Oct 2014 Oct 2015

description

Asterisk IP PBX open source configuration course in spanish.

Transcript of Curso Asterisk Enlaza

Page 1: Curso Asterisk Enlaza

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

Page 2: Curso Asterisk Enlaza

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

Page 3: Curso Asterisk Enlaza

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

Page 4: Curso Asterisk Enlaza

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!

Page 5: Curso Asterisk Enlaza

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.

Page 6: Curso Asterisk Enlaza

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

Page 7: Curso Asterisk Enlaza

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

Page 8: Curso Asterisk Enlaza

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

Page 9: Curso Asterisk Enlaza

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

Page 10: Curso Asterisk Enlaza

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.

Page 11: Curso Asterisk Enlaza

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

Page 12: Curso Asterisk Enlaza

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

Page 13: Curso Asterisk Enlaza

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

Page 14: Curso Asterisk Enlaza

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

Page 15: Curso Asterisk Enlaza

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

Page 16: Curso Asterisk Enlaza

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

Page 17: Curso Asterisk Enlaza

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

Page 18: Curso Asterisk Enlaza

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

Page 19: Curso Asterisk Enlaza

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

Page 20: Curso Asterisk Enlaza

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

Page 21: Curso Asterisk Enlaza

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

Page 22: Curso Asterisk Enlaza

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})})

Page 23: Curso Asterisk Enlaza

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}))

Page 24: Curso Asterisk Enlaza

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.

Page 25: Curso Asterisk Enlaza

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

Page 26: Curso Asterisk Enlaza

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

Page 27: Curso Asterisk Enlaza

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

Page 28: Curso Asterisk Enlaza

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.

Page 29: Curso Asterisk Enlaza

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)

Page 30: Curso Asterisk Enlaza

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

Page 31: Curso Asterisk Enlaza

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)

Page 32: Curso Asterisk Enlaza

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

Page 33: Curso Asterisk Enlaza

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)

Page 34: Curso Asterisk Enlaza

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)

Page 35: Curso Asterisk Enlaza

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)

Page 36: Curso Asterisk Enlaza

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

Page 37: Curso Asterisk Enlaza

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

Page 38: Curso Asterisk Enlaza

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

Page 39: Curso Asterisk Enlaza

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

Page 40: Curso Asterisk Enlaza

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

Page 41: Curso Asterisk Enlaza

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

Page 42: Curso Asterisk Enlaza

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

Page 43: Curso Asterisk Enlaza

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

Page 44: Curso Asterisk Enlaza

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

Page 45: Curso Asterisk Enlaza

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

Page 46: Curso Asterisk Enlaza

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

Page 47: Curso Asterisk Enlaza

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

Page 48: Curso Asterisk Enlaza

¿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

Page 49: Curso Asterisk Enlaza

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

Page 50: Curso Asterisk Enlaza

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.

Page 51: Curso Asterisk Enlaza

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)

Page 52: Curso Asterisk Enlaza

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

Page 53: Curso Asterisk Enlaza

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

Page 54: Curso Asterisk Enlaza

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

Page 55: Curso Asterisk Enlaza

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

Page 56: Curso Asterisk Enlaza

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

Page 57: Curso Asterisk Enlaza

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

Page 58: Curso Asterisk Enlaza

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

Page 59: Curso Asterisk Enlaza

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

Page 60: Curso Asterisk Enlaza

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

Page 61: Curso Asterisk Enlaza

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

Page 62: Curso Asterisk Enlaza

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}'

Page 63: Curso Asterisk Enlaza

Práctica 9.4 (opcional)

Crear una función personalizadaODBC

81

Page 64: Curso Asterisk Enlaza

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

Page 65: Curso Asterisk Enlaza

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;

};

};

Page 66: Curso Asterisk Enlaza

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%);

};

};

Page 67: Curso Asterisk Enlaza

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

Page 68: Curso Asterisk Enlaza

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

Page 69: Curso Asterisk Enlaza

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();

?>

Page 70: Curso Asterisk Enlaza

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.

Page 71: Curso Asterisk Enlaza

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

Page 72: Curso Asterisk Enlaza

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

Page 73: Curso Asterisk Enlaza

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

Page 74: Curso Asterisk Enlaza

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

Page 75: Curso Asterisk Enlaza

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

Page 76: Curso Asterisk Enlaza

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

Page 77: Curso Asterisk Enlaza

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

Page 78: Curso Asterisk Enlaza

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

Page 79: Curso Asterisk Enlaza

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

Page 80: Curso Asterisk Enlaza

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

Page 81: Curso Asterisk Enlaza

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

Page 82: Curso Asterisk Enlaza

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

Page 83: Curso Asterisk Enlaza

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