Está en la página 1de 45

Contenido

(I): Introducción............................................................................................................................2
(II): Instalación..............................................................................................................................4
(III): Extensiones Internas.............................................................................................................5
(IV): El Dialplan.............................................................................................................................5
(V): Interconexión con proveedores VoIP....................................................................................5
(VI): Lidiando con el NAT..............................................................................................................5
(VII): Seguridad.............................................................................................................................5
(VIII): Plantilla mínima de configuración......................................................................................5

URL: http://www.axelko.com/techblog/2013/11/curso-asterisk-iv-el-dialplan/

pág. 1
(I): Introducción

Varias personas, tanto en persona como en foros, me han


preguntado cómo funciona esto de la telefonía VoIP y cómo se le
puede sacar provecho. Esto me ha motivado para tratar de plasmar
en el blog algo de información sobre el tema. En los próximos
artículos hablaremos de telefonía VoIP, protocolo SIP, y Asterisk.
Pero primero… la introducción.

¿Por qué montar una centralita PBX en tu casa?


Existen multitud de proveedores de telefonía VoIP en el mercado
con tarifas de lo más variadas. Podríamos pensar en contratar una
línea VoIP con un proveedor y no complicarnos más la vida, pero,
¿podríamos sacar mejor provecho de la VoIP?

Con una centralita de VoIP propia podríamos hacer lo siguiente:

 Disponer de extensiones internas para llamar a otros teléfonos


conectados a la misma centralita, gratis. Puedes dar un número de
extensión a cada uno de tus amigos y llamar entre vosotros sin
coste.
 Crear salas de audioconferencia con varios participantes.
 Tener cuantos proveedores quieras para llamadas salientes, y
elegir automáticamente el mejor proveedor en función del número
de destino.
 Tener varios DIDs (números de teléfono) de diferentes países
asociados a la misma cuenta.
 Gestión compleja de llamadas entrantes: hacer sonar varios
teléfonos a la vez (móviles, inalámbricos DECT, etc), o primero en
unos y si no se atiende en cierto tiempo ir saltando a otros (ej:
primero en casa, y si no se atiende, al móvil, a otra persona, etc).
 Grabación de conversaciones.
 Cola de llamadas.
 Crear buzones de voz, menús de opciones (“pulse 1 si quiere
hablar con fulanito…”), y en general, cualquier servicio hombre-
máquina mediante telefonía.

Y todo esto sin olvidarnos de otras ventajas que obtenemos por el


uso del VoIP frente a la telefonía tradicional:

 Mejores tarifas que con la telefonía clásica.

pág. 2
 Disponer de un número de teléfono fijo en tu móvil, y llevártelo
fuera de casa sin coste extra.
 Llamar y recibir llamadas estando en el extranjero como si
estuvieras en casa.
 Tener servicio de telefonía donde no haya cobertura GSM pero sí
haya WiFi (bares, salas de congresos, etc).

pág. 3
¿Por qué Asterisk?
Asterisk es el software de PBX gratuito más extendido en el
mundo de la telefonía IP. Es software libre, dispone de una gran
capacidad para interconectar redes de telefonía de diferente
naturaleza (IAX, SIP, SS7, RDSI, etc), y es extremadamente
potente.

Sin embargo, Asterisk es complicado, la documentación es mala, y


está plagado de bugs. Pero una vez configurado y en marcha da
muy buen servicio y es muy gratificante. Y con el presente curso,
esperemos que a todos os resulte más llevadera su instalación.

En el siguiente capítulo: Instalar Asterisk de cero en Debian


Wheezy. ¡No te lo pierdas!

pág. 4
(II): Instalación
En el capítulo de hoy vamos a instalar Asterisk en una Debian 7 Wheezy.
Para ello tenemos dos formas, en función de si queremos utilizar los
repositorios de Debian o preferimos compilar la última versión de
Asterisk a partir de su código fuente. Yo os recomiendo esta última.

Instalar Asterisk: The Easy Way

En los repositorios de Debian tenemos la versión Asterisk 1.8


disponible. Instalarla es tan fácil como hacer lo siguiente:

La versión 1.8 es suficiente para empezar a cacharrear, pero es


bastante antigua. Para un uso real recomiendo instalar la última
versión disponible, normalmente con más funcionalidades y menos
bugs, a partir del código fuente. También necesitaremos compilar
si queremos hacerlo funcionar en plataforma ARM (RaspBerry Pi,
PandaBoard, etc). La versión estable más reciente en este
momento es Asterisk 11.5.

Instalar Asterisk: The Hard Way


Como no nos dejamos asustar tan fácilmente, vamos a instalar
Asterisk a partir de sus fuentes para poder trabajar con la última
versión. Para aquellos que estén acostumbrados a hacer
instalaciones por esta vía sólo habrá un par de puntos a los que
deban prestar atención.

Primero vamos a instalar las herramientas de desarrollo para


poder compilar:

También necesitaremos instalar algunos requisitos de Asterisk:

Bajamos y descomprimimos el código fuente de Asterisk 11 en su


versión más reciente:
$ wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz

$ tar zxvf asterisk-11-current.tar.gz

$ cd asterisk-11.x.x

pág. 5
Configuramos y revisamos que todos los módulos necesarios para
SIP estén preparados:

pág. 6
En el menú de configuración deberemos comprobar que los
siguientes módulos aparezcan seleccionados (marcados con un
asterisco [*]):

 Channel Drivers / chan_sip


 Resource Modules / res_crypto
 Resource Modules / res_rtp_asterisk

Si alguno no está seleccionado es porque no hemos cumplido con
los requisitos necesarios. En ese caso, en la parte inferior se
indica cuál es el componente que requiere, y deberemos instalarlo
mediante APT. Normalmente se necesitan los paquetes de
desarrollo, es decir, si el componente nos dice que necesita de
“uuid”, tendremos que instalar el paquete “uuid-dev”. Una vez
instaladas las dependencias, deberemos volver a hacer ./configure.

Además de lo anterior, vamos a seleccionar también la colección


de sonidos en español:
 Core Sound Packages / CORE-SOUNDS-ES-GSM

Una vez que todo esté bien, compilamos, instalamos, añadimos


los scripts de arranque para /etc/init.d, y la configuración
de logrotate:

Y por último, podemos instalar una configuración completa de


Asterisk que nos servirá como ejemplo para ir viendo la sintaxis:

La configuración de Asterisk se instala en /etc/asterisk/, y los dos


archivos sobre los que vamos a trabajar en futuras entregas son:

 sip.conf
 extensions.conf

Ya podemos arrancar Asterisk:

En el siguiente capítulo: creación de dos extensiones internas


para hacer llamadas entre ellas por SIP. ¡No te lo pierdas!

pág. 7
(III): Extensiones Internas
Ya es hora de empezar a hacer algo con nuestro flamante y recién
instalado Asterisk. Los objetivos para el capítulo de hoy son:

 Ver algunos parámetros de configuración de SIP


 Crear un par de extensiones SIP
 Crear un dialplan que permita hacer llamadas entre extensiones
 Hacer una llamada de prueba desde un softphone

A partir de ahora el término dialplan empezará a aparecer mucho.


El dialplan es el corazón de Asterisk, y es donde reside buena
parte de su potencial. Más adelante lo veremos en profundidad,
pero de momento es suficiente con saber que es donde se define la
lógica a seguir cuando entra una llamada en el sistema.

Crear extensiones SIP


Vamos a editar el archivo /etc/asterisk/sip.conf para que quede de
esta manera:

Los parámetros de la sección [general] son los siguientes:


 udpbindaddr: Define la interfaz de red y puerto donde Asterisk
escuchará las peticiones entrantes. Podemos especificar la IP de la
interfaz de red que nos interese, o “0.0.0.0” para que escuche en
todas. El puerto por defecto es 5060.

pág. 8
 context: Un contexto es un punto de entrada del dialplan. Aquí
definimos el contexto por defecto para todas las conexiones SIP, y
lo hacemos principalmente por seguridad. Los contextos los
veremos más adelante cuando hablemos del dialplan.
 srvlookup: Esto es un símil al registro MX existente en los DNS
para el envío de emails. De la misma forma que el dominio
“gmail.com” puede tener un registro MX que indique el el servidor
de email está en “smtp.gmail.com”, SIP puede tener un registro
SRV que indique que el servidor VoIP de “ejemplo.com” está en
“sip.ejemplo.com”. Es conveniente tenerlo activado cuando
utilizamos proveedores externos.
 allowguest: Parámetro de seguridad. Curiosamente, la
configuración por defecto de Asterisk permite que usuarios sin
autenticar realicen llamadas. Lógicamente no nos interesa que
ocurra esto.
 alwaysauthreject: Parámetro de seguridad. Por defecto, cuando
un usuario se intenta autenticar con credenciales erroneas, Asterisk
responde de forma diferente en función de si el usuario existe o no.
Con este parámetro activado, la respuesta es siempre la misma sin
distinguir entre usuario inexistente y contraseña equivocada.
(Veremos estas y muchas otras cuestiones de seguridad en capítulos
posteriores. De momento, como estamos preparando una instalación de
pruebas con extensiones internas, el riesgo es inexistente ya que no es
posible realizar llamadas al exterior). 
Las secciones [3001] y [3002] definen los usuarios de nuestras
dos extensiones. Los parámetros de estas secciones son las
siguientes:
 type: Especifica qué tipo de interacción permitiremos al usuario
con nuestro sistema. Los valores permitidos son “user”, “peer” y
“friend”. Normalmente se utiliza “peer” para interconectar con
proveedores VoIP, y “friend” para definir extensiones internas.
 host: Especifica el host o IP desde la que esperamos que el
usuario se comunique con nosotros. Si  el usuario se puede
conectar desde diversas IPs se utiliza “dynamic”, como suele ser el
caso habitual de las extensiones internas.
 username: Nombre de usuario de la cuenta.
 secret: Contraseña de la cuenta.
 callerid: Parámetro opcional que permite definir el nombre del
CallerID. Es decir, cuando llamemos a otras extensiones internas,
además de nuestro número de extensión, en pantalla figurará
nuestro nombre aunque la otra persona no nos tenga en la agenda.
 context: Contexto del dialplan asociado con este usuario.
 canreinvite: Deshabilitando este parámetro forzamos a que el
streaming de audio de la llamada pase por Asterisk, en lugar de ir
directo de terminal a terminal. Esto, aunque sea más ineficiente,
evita problemas de tener sonido sólo en una dirección (one way
audio) o que no tengamos sonido alguno.
Muchos de los parámetros de las extensiones son comunes a
todas ellas. Para evitar repetir, podemos recurrir al uso de
plantillas donde definir todos los parámetros comunes de las

pág. 9
extensiones, y definir en cada extensión sólo aquello que es
propio, como el nombre de usuario o la contraseña.

El esquema básico para el uso de plantillas sería:

Esta configuración SIP es exactamente igual que la propuesta


inicialmente, pero utilizando plantillas:

Esta forma de organizar la configuración SIP es más fácil de


mantener, ya que la configuración crece menos a medida que
añadimos extensiones, y si necesitamos cambiar algún parámetro
común, se hace en un único sitio.

El Dialplan
Vamos a empezar a hablar del dialplan. El dialplan define qué
puede hacer un usuario de nuestra centralita cuando envía a
Asterisk una invitación para participar en una conversación. Una
invitación de conversación puede ser:

pág. 10
 Una llamada saliente: Una llamada iniciada desde una de
nuestras extensiones internas. Puede ser a otra extensión interna
y/o hacia la red de telefonía a través de una interconexión con un
proveedor externo.
 Una llamada entrante: Una llamada recibida desde una
interconexión con un proveedor externo, cuando alguien marca uno
de nuestros DIDs en un teléfono convencional.
El dialplan se define en /etc/asterisk/extensions.conf, y en el
ejemplo que estamos desarrollando tendría este aspecto:

pág. 11
En este dialplan vemos tres secciones
principales, [general], [default] y [extensiones-internas]. La
sección [general] es una sección especial que define algunos
parámetros de comportamiento del dialplan, y donde de momento
no vamos a profundizar. El resto de secciones son contextos de
entrada, y son lo que nos interesa.
Los contextos se definen con un nombre arbitrario entre corchetes
[ ], y contienen una colección de acciones por extensión marcada.
Los contextos se asocian con los usuarios SIP en el archivo de
configuración sip.conf, tal y como hemos visto al principio de este
capítulo.

Vamos a analizar los dos contextos que tenemos. Por un lado, está
el contexto utilizado con las extensiones internas:

Sin haber dicho nada del formato del dialplan, ya podemos intuir
qué hace este contexto al leer “Dial” y “Hangup”. Analicemos el
formato:

  exten: Palabra reservada. Todas las líneas de un dialplan


empiezan por “exten” o por “same”, que veremos después.
 patrón: Es una expresión que especifica a qué extensiones se
aplica la acción. Pueden ser simples números como “1234”, o
patrones complejos que cuadren con varias extensiones a la vez.
 Los patrones comienzan con guión bajo “_” y pueden
contener:
 X representa cualquier cifra de 0 a 9
 Z representa cualquier cifra de 1 a 9
 N representa cualquier cifra de 2 a 9
 [x-y] representa cualquier cifra de “x” a “y”
 [xyz] representa las cifras “x”, “y” o “z”
 . representa una o más repeticiones
 ! representa cero o más repeticiones
 Algunos ejemplos:
 Extensión 3001: 3001
 Todas las extensiones de 4 cifras: _XXXX
 Todas las extensiones de al menos 4 cifras: _XXXX.
 Todas las extensiones de 4 cifras que empiecen por 3:
_3XXX
 Móviles españoles que empiezan por 6: _6XXXXXXXX
 Móviles españoles que empiezan por 7: _7[1-
4]XXXXXXX
 Fijos españoles que empiezan por 9: _9[1-8]XXXXXXX

pág. 12
 Todos los fijos españoles: [8-9][1-8]XXXXXXX
 índice: Orden de ejecución de las acciones de la extensión.
 acción(parámetros): Acción a ejecutar. Ver Asterisk Application
Commands para un listado completo.
Hay tres formatos para encadenar acciones para una extensión.
Primero, con orden explícito en cada acción:

Segundo, con orden implícito, donde en la primera acción se indica


orden “1”, y para el resto se especifica orden “n”. Esto hace que
las acciones se ejecuten de arriba a abajo, en orden de definición:

El tercero es con orden implícito, y sin tener que especificar


constantemente el patrón de la extensión. En ese caso, en lugar de
“exten” se utiliza “same”, y se omite el patrón.

Este último formato es el menos documentado, pero es el más


breve y cómodo, por lo que será el que usaremos en el resto del
curso.

Volvamos a la línea clave del dialplan para las extensiones


internas, y desglosemos su significado:

 _3XXX: Capturar las extensiones de 4 dígitos que comiencen por 3.


 1: Primera acción del dialplan.
 Dial(SIP/${EXTEN}): Llamar a la extensión indicada. El parámetro
de la acción Dial() especifica a dónde enviar la llamada. En este
caso “SIP” indica el protocolo, y “${EXTEN}” contiene el número de
extensión marcado por el usuario.
 Por ejemplo, si el usuario marcó la extensión “3002”, se
ejecutará Dial(SIP/3002).

La segunda línea es esta:

pág. 13
 Hangup(16): Terminar la llamada con código 16: normal call
clearing. Hay que tener en cuenta que, cuando se ejecuta la función
Dial() y se establece la comunicación entre ambos usuarios (el
usuario acepta la llamada), no se ejecuta ninguna instrucción más
del dialplan. Sólo se ejecuta la acción Hangup() cuando la llamada
no consigue establecer la comunicación, bien porque el usuario no
está disponible, no descuelga, o rechaza la llamada. En ese caso,
Hangup() cuelga la llamada al usuario llamante. Es una buena
práctica terminar la definición de cada extensión del dialplan con
Hangup().
Por último, el contexto [default] se utiliza sólo cuando el usuario
no tiene definido un contexto propio. Como lo normal es
especificar un contexto a todos los usuarios de Asterisk, el
contexto por defecto sólo será utilizado por un posible usuario
anónimo. Esto se hace por seguridad: el contexto por defecto
simplemente colgará la llamada bajo todos los patrones de
extensión posibles, evitando que un usuario sin autentificar pueda
realizar llamadas con coste a través de nuestro sistema:

Probando el conjunto
Vamos a probar el sistema con un par de teléfonos Android y la
aplicación CSipSimpleque podéis encontrar en el Play Store. Como
alternativa, podéis probar el softphone 3CXPhone para Windows.
La configuración es muy parecida.
Lo primero es reiniciar Asterisk para reflejar los cambios en la
configuración:

Iniciamos CSipSimple en nuestros teléfonos Android (previamente


conectados por WiFi a la misma red que el servidor Asterisk) y
realizamos los siguientes pasos en ambos teléfonos:

 Cuentas / Añadir una cuenta / Basic (abajo del todo)


 Nombre de cuenta: lo que queráis
 Usuario: una de las extensiones definidas en sip.conf. Ejemplo:
“3001”.
 Servidor: IP local de nuestro Asterisk.
 Contraseña: la contraseña correspondiente a la cuenta utilizada.
Ejemplo: “password3001”.

pág. 14
Una vez configurados ambos teléfonos, deberíamos poder llamar
entre ellos marcando la extensión del otro, “3001” y “3002” según
corresponda. Podemos probar a llamar y no descolgar, rechazar, o
aceptar la llamada. También deberemos comprobar que tenemos
audio en ambas direcciones. Todo debería funcionar bien.

En el siguiente capítulo: Todo sobre el dialplan: patrones, acciones


básicas, etc.

pág. 15
(IV): El Dialplan
En la anterior entrada vimos cómo dar de alta algunas extensiones
internas, y trabajamos muy por encima con el Dialplan para poder
llamar de una extensión a otra.

El Dialplan es el verdadero corazón de Asterisk y de cualquier


sistema VoIP. El Dialplan, o plan de marcado, es una colección
ordenada de acciones que se ejecutan cuando alguien marca un
número dentro de nuestro Asterisk. El ejemplo más trivial sería que
cuando alguien marca la extensión de otra persona, por ejemplo
“3001”, suene el teléfono de ese usuario. Sin embargo, se pueden
hacer cosas mucho más avanzadas, como por ejemplo gestionar
las llamadas en función de un horario, crear una centralita
automática de recepción de llamadas, grabar conversaciones,
poner música en espera, etc.

Antes de entrar en lo que se puede hacer con el Dialplan, vamos a


definir algunos conceptos básicos.

CONCEPTOS BÁSICOS
Extensiones
Definición: Una extensión es una marcación en el teclado de un
teléfono.
Por ejemplo, un usuario podría marcar “3001” en su teléfono, y eso
sería una extensión. También podría marcar un número de teléfono
nacional, como por ejemplo “915881000”, y también sería una
extensión.

Aunque lo normal es que las extensiones sean numéricas, no


debemos pensar sólo en números, ya que en Asterisk también se
pueden definir extensiones como texto. Por ejemplo, “pizza” sería
una extensión válida.

Un plan de marcado empieza con una colección de extensiones a


las que se puede llamar. Esta definición de extensiones puede ser
literal, o puede ser una expresión. Por ejemplo, si hemos definido
las extensiones desde la 3001 hasta la 3009, podemos definirlas
en nuestro dialplan enumerándolas una detrás de otra, de forma
literal:

 3001
 3002

pág. 16
 3003
 3004
 3005
 3006
 3007
 3008
 3009
Sin embargo, si todas ellas van a tener la misma colección de
acciones (en general, pasar la llamada a la extensión marcada),
sería mucho más cómodo definirlas todas a la vez con una
expresión:

 _300X
Las expresiones van precedidas de guión bajo “_”, que indica que
lo que viene a continuación es una expresión que puede cuadrar
con más de una extensión. Para definir expresiones en Asterisk
disponemos del siguiente lenguaje:

SÍMBOLO SIGNIFICADO

X Cualquier cifra de 0 a 9

Z Cualquier cifra de 1 a 9

N Cualquier cifra de 2 a 9

[x-y] Cualquier cifra de "x" a "y"

[xyz] Las cifras "x", "y" o "z"

. Una o más repeticiones del símbolo anterior

! Cero o más repeticiones del símbolo anterior


En general necesitaremos hacer uso de expresiones para definir
las extensiones de nuestro sistema, ya que hay cosas que no se
pueden hacer de forma literal. Por ejemplo, no podemos definir uno
a uno todos los números de teléfono posibles de España. Lo lógico
es decir “los teléfonos móviles en España empiezan por “6” y
tienen 9 dígitos en total”, y no empezar a enumerar las
1.000.000.000 (mil millones) de posibilidades existentes. Veamos
algunos ejemplos:

SIGNIFICADO EXPRESIÓN

Todas las extensiones de 4 cifras _XXXX

Todas las extensiones de 4 cifras que empiecen _3XXX

pág. 17
SIGNIFICADO EXPRESIÓN

por 3

Móviles de España que empiecen por 6 _6XXXXXXXX

Móviles de España que empiecen por 7 _7[1-4]XXXXXXX

Fijos de España que empiezan por 9 _9[1-8]XXXXXXX

Todos los fijos de España _[8-9][1-8]XXXXXXX


A continuación veremos cómo se relacionan las extensiones con
las acciones, llamadas “aplicaciones” en Asterisk.

Aplicaciones (acciones)
Definición: Las aplicaciones son el conjunto de acciones a ejecutar
cuando un usuario inicia una llamada.
Por ejemplo, supongamos que cuando alguien marque “3001”,
queremos que suene el teléfono de esa persona. Sería algo así:

También podríamos querer darle un mensaje a la persona que


llama antes de pasar la llamada a destino. Por ejemplo:

O pasar la llamada sólo entre las 10h de la mañana y las 20h de la


tarde:

Las aplicaciones más utilizadas son las siguientes:

FICH
APLICACIÓN A DESCRIPCIÓN

Answer URL Descuelga la llamada entrante

Dial URL Realiza una llamada saliente

pág. 18
FICH
APLICACIÓN A DESCRIPCIÓN

Hangup URL Termina la llamada en curso

Wait URL Espera X segundos antes de continuar con la


siguiente acción

Festival URL Utiliza el sintetizador Festival para emitir mensajes


de voz

Playback URL Reproduce un archivo de sonido o vídeo

SayUnixTi URL Dice la fecha y hora actual a la persona llamante


me

Backgroun URL Reproduce música en espera


d

NoOp URL No realiza ninguna operación, pero imprime el


mensaje indicado en la consola de Asterisk

ExecIf URL Ejecutar la aplicación indicada si se cumple la


condición dada

ExecIfTime URL Ejecutar la aplicación indicada si se cumple el


requisito de fecha y hora indicados

En esta página web se puede ver un listado completo de


aplicaciones de Asterisk junto con la descripción y sintaxis de
cada una de ellas:

Asterisk Applications

Prioridades
En un lenguaje de scripting, las acciones se van ejecutando de
arriba a abajo, en orden. En cambio, en Asterisk, el orden en el que
se ejecutan las acciones debe ser explícitamente indicado
mediante números. Así, primero se ejecutará la acción 1, después
la acción 2, y así sucesivamente.

Es decir, en los ejemplos anteriores no basta con poner las


aplicaciones (acciones) una debajo de la otra. Hay que indicar
numéricamente el orden, de forma explícita.

pág. 19
Definición: La prioridad representa el orden en el que se ejecutarán
las acciones del dialplan.
La sintaxis para indicar el orden la veremos a continuación.

PONIENDO TODO JUNTO


Hemos visto cómo se definen las extensiones mediante
expresiones, qué aplicaciones (acciones) podemos utilizar, y
también que es necesario especificar de forma explícita el orden
de éstas. ¿Cuál es la sintaxis de Asterisk para poner todo esto
junto?

Por ejemplo, supongamos que cuando alguien marque la extensión


3001, se pase la llamada sólo entre las 10h de la mañana y las 20h
de la tarde:

Generalizando el ejemplo anterior, supongamos que queremos el


mismo comportamiento cuando alguien marque cualquier
extensión desde la 3001 hasta la 3009. Para esto, lo más cómodo
es utilizar expresiones:

Fijaos que en este caso hemos utilizado la variable ${EXTEN}


dentro de la llamada a Dial() para que se lance la llamada a quien
corresponda. La variable ${EXTEN} es una de las variables básicas
que utilizaremos, y que contiene la extensión marcada por la
persona llamante.

pág. 20
PONIENDO TODO JUNTO: VARIANTES
En “Poniendo todo junto” hemos visto la sintaxis básica del
dialplan de Asterisk. Sin embargo, a la larga es una sintaxis muy
engorrosa de mantener. El problema es que hay que repetir la
expresión en cada línea, y hay que indicar la prioridad de ejecución
cuando lo normal es que las acciones se ejecuten de arriba a
abajo.

Supongamos este dialplan de ejemplo, donde la expresión cuadra


con todos los fijos nacionales de España en formato internacional:

Si quisiéramos introducir una nueva aplicación entre Wait() y Dial(),


nos obligaría a actualizar los números de prioridad de todas las
aplicaciones que vienen debajo. Si el dialplan fuese mucho más
largo, digamos 50 acciones en lugar de 5, imaginaos el engorro que
puede suponer esto.

Una solución mejor es indicar que las aplicaciones se ejecuten de


forma consecutiva, de arriba a abajo. Para esto, podemos utilizar
la prioridad “n”, que indica “next”. De esta forma, podemos
introducir nuevas aplicaciones en mitad de un dialplan sin tener
que actualizar los números de prioridad. Sólo tenemos que indicar
cuál es la prioridad “1”, y utilizar prioridad “n” para el resto:

Por otro lado, cambiar la expresión de las extensiones a las que se


hacen referencia también resulta un engorro, ya que la expresión
aparece en cada una de las líneas del dialplan. Si quisieramos que
el segundo dígito admitiera “cero” para poder llamar a números
“902 XXX XXX”, tendríamos que modificar cada una de las líneas
de este dialplan. Sin embargo, hay otra sintaxis que permite definir
la expresión sólo una vez, e indicar en las siguientes líneas que se
trata de la misma extensión:

pág. 21
Esta última sintaxis es la que utilizaremos en el presente curso a
partir de ahora, ya que es la más cómoda y compacta de todas las
posibles.

CONTEXTOS
Ya hemos visto cómo se definen las extensiones de marcación y
las acciones asociadas a ellas. Según lo estudiado hasta ahora,
todos los usuarios tienen las mismas libertades. Ya que no todos
los usuarios son iguales, necesitamos algún mecanismo que nos
permita variar el comportamiento del sistema en función del
mismo. Eso son los contextos.

Cuando definimos un usuario en sip.conf le asignamos un


contexto. Cuando ese usuario inicia una llamada, se utiliza ese
contexto del dialplan para ver qué extensiones tiene accesibles y
qué acciones debe realizar el sistema.
Definición: Los contextos representan la unidad de organización
más básica del dialplan de Asterisk. Un contexto engloba
extensiones y acciones. Se utiliza para aumentar la seguridad del
sistema, y para ofrecer servicios diferenciados en función del
usuario.
Un contexto se define de la siguiente manera:

EJEMPLO COMPLETO
Supongamos un hotel con una recepción y tres habitaciones que
cumple lo siguiente:

 Para llamar a la recepción hay que marcar “0”


 Para llamar a las habitaciones hay que marcar el número de
habitación: “101”, “102” o “103”
 La recepcionista puede llamar a cualquier habitación
 Los huéspedes sólo pueden llamar a recepción (no pueden llamar
a otras habitaciones)

pág. 22
pág. 23
(V): Interconexión con proveedores VoIP
Ha llegado el momento de que nuestra centralita Asterisk pueda
comunicarse con el exterior. Mediante el uso de proveedores de
telefonía VoIP podremos realizar llamadas a la Red de Telefonía
Conmutada, y también que nos puedan llamar desde ella. Aquí
empieza el verdadero potencial de Asterisk.

Podemos separar los proveedores VoIP en dos categorías


diferenciadas en función del servicio que proporcionan:

 Proveedores de minutos: Permiten realizar llamadas hacia la


Red de Telefonía Conmutada, cobrándonos por tiempo u
ofreciéndonos tarifas planas de llamadas. Las tarifas son variadas,
pero podemos encontrar precios de 1 cent/minuto o incluso menos
a destinos tanto nacionales como internacionales.
 Proveedores de DID: Nos proporcionan un número de teléfono
de la Red de Telefonía Conmutada donde cualquier persona nos
pueda llamar, y nos entregan las llamadas  a nuestro Asterisk.
Normalmente se alquilan por meses, y tienen un coste entre 2 y
10€/mes según el proveedor y el tipo de número. Por ejemplo,
podemos tener un DID de numeración fija de Madrid del tipo “91
xxx xx xx”, o de cualquier otra provincia española. También
podemos alquilar números de países extranjeros para que nos
llamen desde allí a precio de llamada local.
Y por supuesto, podemos encontrar proveedores que ofrezcan los
dos servicios al mismo tiempo.
Para configurar un proveedor VoIP tendremos que hacer algunos
cambios en nuestra configuración:

 En “sip.conf”
1. Añadir una nueva sección con los datos de nuestro
proveedor (IP, puerto, username, password y codecs a
utilizar).
2. Añadir la línea de registro. De la misma manera que
nuestras extensiones internas se registran con nuestro
Asterisk, nuestro Asterisk se tiene que registrar con el
proveedor externo. El registro realiza una autenticación con
nuestra cuenta en el servidor VoIP del proveedor.
 En “extensions.conf”
1. Añadir contextos para los proveedores de DID, es decir,
aquellos que sí van a interactuar con nuestro sistema para
entregarnos llamadas.
2. Los proveedores que sólo nos ofrezcan minutos no necesitan
interactuar con nosotros, así que por seguridad siempre les
asignaremos un contexto de rechazo. En nuestros ejemplos, el
contexto “general” es un contexto de rechazo.

pág. 24
3. Añadiremos las reglas de llamada para los destinos que nos
interesen, modificando los contextos de aquellos usuarios que
queramos que tengan salida al exterior.
 

DANDO DE ALTA LOS PROVEEDORES VOiP

Para que resulte más ilustrativo y práctico vamos a centrar los


ejemplos en dos proveedores reales, probablemente dos de los
más utilizados en España:

PROVEEDOR PROPÓSITO

Netelip Proveedor tanto de DIDs (recibir llamadas) como de


minutos (hacer llamadas).

FreeVoIPD Proveedor exclusivamente de minutos.


eal

No me voy a centrar en el proceso de alta en las correspondientes


webs, ya que se escapa de los propósitos de este curso, y además
es sencillo. Vamos a suponer que hemos creado una cuenta y
tenemos el nombre de usuario y clave de ambos proveedores.

Netelip
Tenemos que añadir la siguiente sección al archivo de
configuración sip.conf, poniendo vuestros datos correspondientes
en los campos “username” y “secret”.

A continuación pasaremos a describir los diferentes campos:

CAMPO DESCRIPCIÓN

type Con los proveedores usaremos siempre el tipo de cuenta


"peer".

host El nombre o la IP del servidor SIP de nuestro proveedor.

pág. 25
CAMPO DESCRIPCIÓN

fromdom Establece el dominio asociado a nuestra cuenta de usuario.


ain Este dato nos lo proporciona el proveedor.

usernam Nombre de usuario de nuestra cuenta SIP en el proveedor.


e

secret Password de nuestra cuenta SIP.

insecure El término resulta más preocupante de lo que debería.


Insecure permite cambiar algunos aspectos de la
autenticación, normalmente para permitir llamadas
entrantes desde proveedores. En este caso, "port" indica
que la autenticación se haga exclusivamente en base a IP,
sin tener en cuenta el puerto; e "invite" indica que no se
necesita autenticación con usuario/password para hablar
con nosotros.

context El contexto donde se enviarán las llamadas entrantes desde


este proveedor.

canreinvi Estableciendo a "no" obligamos a que el audio de las


te llamadas pasen obligatoriamente por Asterisk. Esto añade
algo de latencia pero nos ahorra problemas con el NAT.
Además de lo anterior, tenemos que hacer que Asterisk envíe el
usuario y password de nuestra cuenta al proveedor para
registrarnos con él. Esto es necesario para indicar que estamos
activos, y decirle dónde nos puede encontrar cuando nos tenga
que entregar una llamada. Esta parte se hace con la línea de
registro en la sección [general], indicando el nombre de usuario y
el nombre de la sección que hemos definido para el proveedor, en
este caso [trunk-netelip]:

FreeVoIPDeal
Hacemos lo mismo para definir la conexión con FreeVoIPDeal. La
única diferencia es que reenviaremos todas las llamadas entrantes
al contexto general de rechazo. Esto es porque FreeVoIPDeal sólo
proporciona minutos, es decir, sólo nos permite llamar, y nunca
deberíamos recibir llamadas desde este proveedor. Por tanto, por
seguridad le asignamos un contexto que rechaza todas las
llamadas entrantes.

pág. 26
Y también necesitamos una línea de registro en [general]:

CONFIGURANDO EL DIALPLAN

El siguiente paso es configurar el DialPlan tanto para las llamadas


entrantes como para las salientes.

Supongamos que, además de los dos proveedores anteriores,


tenemos dada de alta una extensión interna “3001” asociada al
contexto “extensiones”.

Tenemos que hacer dos cosas:


 Crear el contexto “callin-netelip” donde redirigiremos las
llamadas entrantes para que suenen en nuestra extensión interna
3001.
 Modificar el contexto “extensiones” para permitir llamar al
exterior desde nuestras extensiones internas.

pág. 27
Crear el contexto “callin-netelip”
Añadiremos a nuestro DialPlan lo siguiente:

CAMPO DESCRIPCIÓN

Extensión Extensión especial de Asterisk que se activa cuando no


"s" hay ninguna otra extensión del contexto actual que encaje
con la llamada entrante. Como en este caso nos da igual
el número de destino marcado, usamos la extensión "s"
para capturar todas las llamadas entrantes sin importar el
patrón.

Dial(SIP/30 Redirige la llamada hacia la extensión 3001 de SIP. Es


01) decir, cuando alguien llame a nuestro número de Netelip
desde la Red de Telefonía Conmutada, sonará nuestra
extensión 3001.

Hangup(16 Por último, al terminar la llamada colgaremos a la persona


) que nos ha llamado. El código 16 indica que la llamada ha
terminado con normalidad.
Modificar el contexto “extensiones”
Una de las ventajas de usar Asterisk es que podemos configurar
las rutas de llamadas como mejor nos convenga. Por ejemplo, nos
puede interesar cursar unos tipos de llamadas a través de un
proveedor concreto por razones de calidad o precio, y el resto de
llamadas a través de otro proveedor. La flexibilidad es total.

Supongamos lo siguiente:
 Queremos usar Netelip para llamar a teléfonos fijos de España.
 Queremos usar FreeVoIPDeal para llamar a móviles de España.
 Queremos dar un mensaje de voz cuando se marque un número
no válido (ej: llamadas internacionales).
Para organizar mejor el dialplan y asegurar que las expresiones se
evalúan en el orden correcto vamos a introducir una nueva
directiva: “include”. Esta directiva nos permite definir un contexto
como composición de contextos, y nos permite controlar mejor el
orden de evaluación de extensiones. Veámoslo con un ejemplo:

pág. 28
Hemos definido el contexto “extensiones” como la suma de
“llamadas-externas” + “llamadas-no-validas”, en ese orden.

Al realizarse una llamada a través del contexto “extensiones”,


Asterisk buscará primero una coincidencia de extensión dentro del
contexto “llamadas-externas”. Si hemos marcado un número fijo
español o un móvil que empiece por 6, la extensión marcada
cuadrará con una de las dos definiciones existentes y cursará la
llamada a través del proveedor correspondiente.

Si no cuadra con ninguna definición de “llamadas-externas”,


entonces buscará en el contexto “llamadas-no-validas”. Este
contexto tiene una única extensión definida que lo admite todo,
por lo que siempre que se llegue hasta aquí aceptará realizando lo
siguiente: descuelga, indica que el número marcado no es válido, y
cuelga.

Es decir, cuando marquemos un número definido con alguna regla


en “llamadas-externas”, Asterisk cursará la llamada a través del
proveedor que hayamos asignado. Si el número marcado no está
aceptado por nuestro DialPlan (por ejemplo llamadas
internacionales o líneas 806 xxx xxx), entonces Asterisk nos dará
una locución de aviso y colgará sin enviar la llamada al exterior.

EJEMPLO COMPLETO

Supongamos lo siguiente:
 Tenemos una extensión interna: 3001.
 Tenemos dos proveedores de telefonía: Netelip y FreeVoIPDeal.
 Queremos usar Netelip para llamar a fijos de España.

pág. 29
 Queremos usar FreeVoIPDeal para llamar a móviles de España.
 Queremos que las llamadas entrantes de Netelip suenen en la
extensión 3001.

pág. 30
pág. 31
(VI): Lidiando con el NAT
El enemigo público número uno del protocolo SIP son las
tablas NAT. El NAT es la principal causa de problemas a la hora de
montar nuestro servidor Asterisk. Desafortunadamente para
nosotros, debido a la falta de IPs públicas de IPv4, lo normal en
nuestros hogares es que estemos detrás de un NAT. Por lo tanto, si
queremos montar nuestro Asterisk dentro de casa, tendremos que
pelearnos con él.
Si haciendo pruebas se obtienen alguno de estos resultados, casi
seguro que estemos experimentando problemas derivados de estar
dentro de una red privada con NAT:

 Audio sólo en un sentido


 Ausencia total de audio en ambos sentidos
 No puedes recibir llamadas
 Las llamadas se cortan transcurridos 10-30 segundos desde el
establecimiento
 Los escenarios posibles son los siguientes:

 El servidor está detrás de un NAT


 Sólo un extremo está detrás de un NAT
 Ambos extremos están detrás de un NAT
 Ambos extremos y el servidor están detrás de un NAT
El escenario más complicado es el último, donde uno de los
extremos de la conversación está detrás de un NAT, el otro
extremo está detrás de otro NAT diferente, y el servidor está
detrás de un tercer NAT.

Las soluciones que se encuentran por Internet en ocasiones


resultan confusas, incorrectas o incompletas. Personalmente me
ha costado mucho tiempo y esfuerzo dar con la solución definitiva.
Afortunadamente para vosotros, una vez que tienes el
conocimiento no es tan complicado aplicarlo. Lo vamos a ver en
dos apartados: solucionar los problemas de los extremos, y
solucionar los problemas del servidor.

Extremos detrás de un NAT


Deberemos añadir las siguientes dos líneas en la sección [general]
de la configuración SIP de nuestro Asterisk:

pág. 32
Y punto. No tiene más misterio.

Servidor detrás de un NAT


Tenemos que hacer dos cosas. Por un lado, debemos abrir en el
router los puertos necesarios hacia la IP de nuestro servidor
Asterisk.

Para ello, debemos consultar el contenido de


“/etc/asterisk.rtp.conf” y fijarnos en los valores de los parámetros
“rtpstart” y “rtpend”. Por ejemplo:

Según el ejemplo, debemos abrir en nuestro router el rango de


puertos 10000-20000/UDP, además del 5060/UDP correspondiente
al protocolo SIP. Consulta el manual de tu router para saber cómo
abrir puertos hacia la IP de tu servidor Asterisk.
Por otro lado, necesitaremos un servicio de DNS dinámico del
tipo No-IP o FreeDNS. Si no sabes cómo hacerlo, en Internet hay
numerosas guías que lo explican muy bien.

Vamos a suponer que tenemos un dominio “ejemplo.no-ip.org”


correctamente configurado, y que el rango privado de IPs de
nuestra red es del tipo “192.168.0.x”.  Deberemos añadir las
siguientes líneas en la sección [general] de la configuración SIP de
nuestro Asterisk:

Gracias a esta configuración, nuestro servidor Asterisk sabe


cuándo las peticiones surgen desde dentro de la propia red privada
del servidor, y cuándo provienen del exterior. En este último caso,

pág. 33
en lugar de encapsular la IP privada del servidor en los paquetes
SIP, utiliza la IP pública a la que apunta el dominio especificado.
De esta manera, el extremo obtiene la IP de contacto correcta y
puede responder correctamente al servidor.

Ejemplo completo
Supongamos lo siguiente:
 Queremos poder contactar con extremos que estén detrás de un
NAT
 Nuestro servidor Asterisk está detrás de un NAT
 El rango de IPs privadas de nuestro servidor Asterisk es de la
forma 192.168.0.x
 Tenemos un dominio DNS dinámico “ejemplo.no-ip.org”
correctamente configurado con la IP pública de nuestro Asterisk

Para cumplir con estos objetivos, deberíamos añadir las siguientes


líneas a la sección “general” de nuestra configuración SIP:

Consideraciones adicionales
 Si los clientes disponen de ellas, conviene activar las opciones
STUN e ICE.

pág. 34
(VII): Seguridad
Desde el capítulo 5 estamos conectados a proveedores VoIP, lo que
significa que un atacante malintencionado podría generarnos pérdidas
económicas si no tuviéramos bien configurado nuestro Asterisk.

Configurarlo correctamente no parece complicado: das de alta tus


extensiones y tus proveedores, y listo. Todo tiene clave, todo parece
estar bien. ¿Seguro? Desgraciadamente, la implementación SIP de
Asterisk es insegura en su configuración por defecto y necesitaremos
saber lo que estamos haciendo para proteger nuestro sistema de usos
no autorizados.

Pero que no cunda el pánico, porque si has seguido el curso al pie de la


letra, ya has ido aplicando sin saberlo una gran parte de las medidas que
detallaremos en el presente capítulo. Aun así presta atención, ya que es
necesario conocer ciertos detalles para no meter la pata cuando crees
por ti mismo tu configuración, y para poder llevar a cabo otras cosas que
hasta ahora no hemos hecho.

1. Cambia el puerto por defecto


Estás en tu casa, tienes una IP dinámica, y te sientes seguro. ¿Crees que
nadie escaneará tu Asterisk desde el exterior? Te equivocas.
Existe un importante negocio de venta de minutos de voz a través de
servidores vulnerables, por lo que el puerto 5060/UDP es ampliamente
escaneado en Internet. Si no quieres que tu servidor forme parte de esta
red lo mejor es que no lo encuentren, y un primer paso es cambiar el
puerto por defecto para pasar un poco más desapercibidos.

Modifica el puerto en la propiedad udpbindaddr de /etc/asterisk/sip.conf,


eligiendo un valor por encima de 1024 que no esté en la lista de puertos
conocidos. En este ejemplo usaremos el 42187, pero tú debes elegir
otro:

A continuación reinicia Asterisk. Después, tendrás que


reconfigurar tus clientes y la tabla NAT de tu router para reflejar el
cambio de puerto.

pág. 35
Por supuesto, la seguridad basada en el ocultamiento de
información no es una buena estrategia de seguridad, pero no nos
vamos a quedar aquí. Nuestro objetivo es securizar correctamente
Asterisk basándonos en otros mecanismos. Este primer punto
simplemente persigue el objetivo de ser más discretos bajo el
radar.

2. Cambia el User Agent


Nuestro Asterisk tiene la mala costumbre de dar demasiada
información. Concretamente indica a cada visitante que se trata
de un servidor Asterisk e informa de la versión exacta que estamos
utilizando. No hay mayor problema en que indique lo que es, pero
es una mala idea que devuelva la versión. Vamos a cambiarlo.

Debemos editar /etc/asterisk/sip.conf y añadir la


propiedad useragent en la sección general:

Como siempre, hay que reiniciar Asterisk para que los cambios se
apliquen.

3. El contexto por defecto siempre es de rechazo


Cuando un usuario no autenticado accede a nuestro Asterisk, se
utiliza el contexto definido en la sección [general] para definir las
acciones que puede realizar este usuario. Por supuesto no vamos a
permitir usuarios anónimos en nuestro sistema, pero debemos
asumir que esta situación podría darse ante la aparición de un bug
de seguridad o por una mala configuración.

Para minimizar los riesgos y la capacidad de acciones de un


atacante anónimo, siempre vamos a definir un contexto en la
sección [general] que no permita hacer nada. Es decir, colgará
toda llamada incondicionalmente.

pág. 36
De esta manera, un atacante anónimo que consiga pasar por alto
la autenticación no podrá realizar llamadas.

4. No permitas invitados
Asterisk por defecto permite que usuarios sin autenticar hagan
llamadas a través del sistema. ¿Cómo es eso? Mira:

PARÁMETR VALOR POR


O DEFECTO DESCRIPCIÓN

allowgues yes Permite que los usuarios anónimos (sin


t autenticar) realicen llamadas a través del
contexto definido en [general]
Para evitarlo tendremos que añadir la siguiente línea a nuestra
sección [general]:

Sin esta línea, y sobre todo si tampoco has hecho lo indicado en el


paso anterior, cualquiera podrá realizar llamadas a través de tu
sistema sin necesidad de disponer de usuario y clave válidos.

5. No filtres información de extensiones


Otro problema es la exposición a ataques de fuerza bruta.
Encontrado un servidor Asterisk, lo primero es dar con una
extensión válida para empezar a probar claves sobre ella. La
mayoría de servidores Asterisk tendrán definidas extensiones
internas numéricas de tres o cuatro dígitos en total, así que es
cuestión de probar el rango de extensiones [100, 9999]. Esto se

pág. 37
puede hacer en muy poco tiempo con herramientas específicas,
por ejemplo con SIPVicious.
Por defecto, Asterisk devuelve una respuesta diferente en función
de si el usuario ha intentado registrarse con una extensión válida,
aunque la contraseña enviada sea incorrecta. Esto permite a un
atacante encontrar rápidamente nuestras extensiones para, a
continuación, comenzar ataques de fuerza bruta sobre ellas.

Debemos configurar nuestro Asterisk de tal forma que siempre


ofrezca la misma respuesta independientemente de si la extensión
es válida o no. Esto evita problemas de fugas de información
(information leakage) a nuestros atacantes.
VALOR POR
PARÁMETRO DEFECTO DESCRIPCIÓN

alwaysauthr no Devolver siempre la misma respuesta


eject independientemente de si el usuario es
válido o no.

Debemos añadir la siguiente línea a nuestra sección [general]:

6. La configuración NAT siempre en la sección general


Este es otro problema de filtrado de información de extensiones.
Para entenderlo tenemos que saber cómo funciona SIP detrás de
un NAT.

Cuando un cliente envía una petición a nuestro servidor, dentro del


paquete SIP se especifica la IP y puerto a la que el servidor debe
enviar la respuesta. El problema es que, si el cliente está detrás de
un NAT, la IP y puerto indicados en la cabecera SIP se
corresponden con su red interna privada, que no es alcanzable por
el servidor. Cuando especificamos en la configuración de Asterisk
“nat=force_rport”, estamos indicando al servidor que ignore la
dirección de respuesta indicada en la cabecera SIP, y en su lugar
utilice la indicada en el datagrama UDP, que está manipulada por
el router NAT y apunta correctamente al servidor.

El problema de especificar “nat=force_rport” en cada extensión,


como muchos ejemplos sugieren, es que cambia la respuesta del

pág. 38
servidor en función de si la extensión existe o no. Un atacante
podría ir probando extensiones componiendo un mensaje con un
puerto en su cabecera SIP, y otro puerto diferente en su datagrama
UDP. En función de en qué puerto reciba la respuesta sabrá si la
extensión existe.

Para evitarlo, deberemos especificar la configuración NAT en la


sección [general], para que así el servidor tenga un
comportamiento uniforme.

Esto es algo que curiosamente no se suele mencionar, y la


recomendación en la mayor parte de los ejemplos es especificarlo
por extensión. A mi juicio, hacerlo por extensión supone un gran
riesgo de seguridad.

7. Cuidado con los “insecure”


Nunca tengas un “insecure=very” o “insecure=invite” en la
definición de una extensión interna de tu Asterisk. Si lo haces,
estás permitiendo que cualquiera pueda hacer llamadas sin
autenticarse con contraseña. Es decir, estarías permitiendo
realizar llamadas sólo con adivinar una extensión válida. Esto es
algo que también se ve en algunos ejemplos disponibles en
Internet, así que cuidado con el copy&paste.

El parámetro “insecure=invite” (o “insecure=very”) se utiliza sólo


en las conexiones con proveedores, ya que permite que ellos se
comuniquen con nosotros sin tener que autenticarse,
principalmente para entregarnos llamadas. Esto no supone un
riesgo, ya que en este caso, el contexto definido para el proveedor
lo que hará será hacer sonar una de nuestras extensiones internas,
pero no realizar gasto a través de otro proveedor.

8. Limita el número de llamadas simultáneas


Si tu sistema se ve comprometido y un atacante tiene la
oportunidad de realizar llamadas a través de tu Asterisk, no
interesa que pueda canalizar demasiadas llamadas en paralelo.

pág. 39
Aunque normalmente los proveedores que utilicemos ya tienen una
limitación de llamadas por su propia seguridad, es conveniente que
nosotros también especifiquemos nuestros propios límites. Esto es
tan simple como especificar el siguiente parámetro en cada
extensión que hayamos definido:

Podéis especificar un límite razonable para minimizar los daños en


caso de que nos veamos comprometidos, sin que ello nos limite
nuestro propio uso razonable.

9. Revisa el registro de llamadas (CDR)


Esta es una tarea manual, pero es conveniente realizarla de vez en
cuando. Asterisk guarda registro de todas las llamadas entrantes y
salientes, y conviene echarle un vistazo de vez en cuando en
busca de actividad sospechosa.

Los logs de llamadas están en la ruta: /var/log/asterisk/cdr-


csv/Master.csv

Si lo prefieres, en el logrotate puedes hacer que se envíe una copia


a tu email. Consulta la documentación de logrotate para saber cómo
hacerlo.
 

10. Utiliza Fail2Ban


Lo que viene aquí es aplicable a Asterisk 10 o superior.  Las
versiones anteriores no disponen de un log específico para
seguridad, y Fail2Ban no será capaz de detectar todos los ataques
posibles contra nuestra centralita.

Fail2Ban es una herramienta utilizada para detener accesos por


fuerza bruta mediante IpTables. Su funcionamiento se basa en el
análisis de logs en busca de patrones. Cuando detecta cierto
número de intentos en un intervalo de tiempo, bloquea la IP del
atacante añadiendo una regla de rechazo en IpTables. Es una
herramienta fundamental para proteger cualquier servidor
expuesto a Internet.

pág. 40
Primero debemos activar el log de seguridad en la configuración de
Asterisk, y cambiar el formato de fecha del log para que Fail2Ban
lo pueda interpretar correctamente. Debemos editar el archivo
/etc/asterisk/logger.conf para hacer dos cambios:

Tras las modificaciones, recarga la configuración del logger:

Para instalar Fail2Ban en Debian y derivados debemos hacer:

Una vez instalado debemos añadir un filtro específico para el log


de seguridad de Asterisk. Crea un nuevo archivo en
/etc/fail2ban/filter.d/asterisk.conf con el siguiente contenido:

pág. 41
A continuación, debemos añadir las reglas para Asterisk en la
configuración de Fail2Ban. Concretamente vamos a hacer que si
un usuario comete 5 fallos en 24 horas, se le baneará de todo el
servidor durante otras 24 horas. Esto limita a los atacantes a
hacer un máximo de 5 intentos al día.

Añade este contenido al final de /etc/fail2ban/jail.conf

pág. 42
Reinicia el servicio de Fail2Ban para aplicar los cambios y ya
estaremos protegidos:

Para conocer el estado de Fail2Ban con nuestra regla de Asterisk y


ver cuántos atacantes ha filtrado, haremos lo siguiente:

Además de proteger nuestro Asterisk, Fail2Ban incluye por defecto


reglas para diversos servicios, entre ellos SSH. Nuestro servidor
estará ahora mucho mejor protegido frente a ataques de fuerza
bruta.

Bonus Track: Malas Prácticas


 No declarar “allowguest=no” en [general]
 No declarar “alwaysauthreject=yes” en [general]
 Permitir hacer llamadas desde el contexto definido en [general]
 Definir la configuración NAT por cada peer, y no en [general]
 Indicar “insecure=very” o “insecure=invite” en extensiones
propias

pág. 43
(VIII): Plantilla mínima de configuración
En un comentario del capítulo anterior he recibido una petición que me
ha parecido suficientemente interesante como para dedicarle una
pequeña entrada independiente.

En el comentario, el autor pide si sería posible publicar el contenido de


los archivos sip.conf y extensions.conf reducidos a su mínima expresión,
sin extensiones de ejemplo ni ningún tipo de relleno, salvo los
parámetros de seguridad mencionados en el correspondiente capítulo.

A continuación, os pongo el contenido de dichos archivos. Lo que


incluyen es lo mínimo imprescindible, justo el esqueleto sobre el que
empezar a definir vuestras extensiones y vuestro dialplan.

Atención a los siguientes tres parámetros que tendréis que


adaptar a vuestra instalación:

 udpbindaddr: Cambiar el puerto de ejemplo 42187 por uno


mayor que 1024 y que no esté en la lista de puertos conocidos.
 externhost: Debes tener un servicio de DNS dinámico para que
Asterisk pueda resolver tu IP pública. Hay múltiples opciones
gratuitas que encontrarás en esta lista de proveedores. Uno de los
más conocidos es No-IP. Indica en este campo el dominio que hayas
creado, y asegúrate de instalar el programa cliente correspondiente
que mantenga actualizada tu IP. Si te pierdes en este punto te
recomiendo buscar una guía sobre DNS Dinámico.
 localnet: Adapta el rango y la máscara de red en función de la
configuración de tu red local.

El Dialplan básico quedaría resumido a lo siguiente:

pág. 44
Os animo a seguir enviando sugerencias sobre los contenidos que
queráis ver publicados en este espacio. Intentaré darle salida a
todas las propuestas que me resulten interesantes.

pág. 45

También podría gustarte