Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(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
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.
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.
$ 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 [*]):
sip.conf
extensions.conf
Ya podemos arrancar Asterisk:
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:
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 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:
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:
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:
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.
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.
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.
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
SIGNIFICADO EXPRESIÓN
pág. 17
SIGNIFICADO EXPRESIÓN
por 3
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í:
FICH
APLICACIÓN A DESCRIPCIÓN
pág. 18
FICH
APLICACIÓN A DESCRIPCIÓN
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.
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.
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.
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.
EJEMPLO COMPLETO
Supongamos un hotel con una recepción y tres habitaciones que
cumple lo siguiente:
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.
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.
PROVEEDOR PROPÓSITO
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”.
CAMPO DESCRIPCIÓN
pág. 25
CAMPO DESCRIPCIÓN
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
pág. 27
Crear el contexto “callin-netelip”
Añadiremos a nuestro DialPlan lo siguiente:
CAMPO DESCRIPCIÓN
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.
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:
pág. 32
Y punto. No tiene más misterio.
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
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.
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.
Como siempre, hay que reiniciar Asterisk para que los cambios se
apliquen.
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:
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.
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.
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:
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:
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.
pág. 42
Reinicia el servicio de Fail2Ban para aplicar los cambios y ya
estaremos protegidos:
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.
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