Curso Asterisk (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:

[general]
udpbindaddr=0.0.0.0:5060
context=default
srvlookup=yes
allowguest=no
alwaysauthreject=yes

[3001]
type=friend
host=dynamic
username=3001
secret=password3001
callerid="Pepe" <3001>
context=extensiones-internas
canreinvite=no

[3002]
type=friend
host=dynamic
username=3002
secret=password3002
callerid="Juan" <3002>
context=extensiones-internas
canreinvite=no

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.
  • 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 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:

[plantilla](!)
parametro1=valor1
parametro2=valor2

[extension1](plantilla)
parametro3=valor3

[extension2](plantilla)
parametro3=valor4

[extension-n](plantilla)
parametro3=valor5

Esta configuración SIP es exactamente igual que la propuesta inicialmente, pero utilizando plantillas:

[general]
udpbindaddr=0.0.0.0:5060
context=default
srvlookup=yes
allowguest=no
alwaysauthreject=yes

[plantilla-extensiones](!)
type=friend
host=dynamic
context=extensiones-internas
canreinvite=no

[3001](plantilla-extensiones)
username=3001
secret=password3001
callerid="Pepe" <3001>

[3002](plantilla-extensiones)
username=3002
secret=password3002
callerid="Juan" <3002>

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:

  • 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:

[general]
static=yes
writeprotect=yes
autofallthrough=yes
clearglobalvars=no
priorityjumping=no

[default]
; Recibe lo que no tiene un contexto propio definido. 
; Rechaza todo por seguridad.
exten => _X.,1,Hangup(21)
exten => s,1,Hangup(21)

[extensiones-internas]
; Extensiones internas SIP 
exten => _3XXX,1,Dial(SIP/${EXTEN}) 
same => n,Hangup(16)

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:

[extensiones-internas]
; Extensiones internas SIP 
exten => _3XXX,1,Dial(SIP/${EXTEN}) 
same => n,Hangup(16)

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

exten => patrón,índice,acción(parámetros)
  •  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
      • 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:

exten => _3XXX,1,NoOp(Llamada a terminal interno)
exten => _3XXX,2,Dial(SIP/${EXTEN})
exten => _3XXX,3,Hangup(16)

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:

exten => _3XXX,1,NoOp(Llamada a terminal interno)
exten => _3XXX,n,Dial(SIP/${EXTEN})
exten => _3XXX,n,Hangup(16)

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.

exten => _3XXX,1,NoOp(Llamada a terminal interno)
same => n,Dial(SIP/${EXTEN})
same => n,Hangup(16)

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:

exten => _3XXX,1,Dial(SIP/${EXTEN})
  • _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:

same => n,Hangup(16)
  • 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:

[default]
exten => _X.,1,Hangup(21)
exten => s,1,Hangup(21)

Probando el conjunto

Vamos a probar el sistema con un par de teléfonos Android y la aplicación CSipSimple que 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:

# /etc/init.d/asterisk restart

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».

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.

Índice del Curso Asterisk:

10 comentarios en “Curso Asterisk (III): Extensiones Internas

  1. Gracias por compartir tiempo y conocimiento, estoy visitando regularmente este «curso» espero lo continues y termines.

    Saludos!

  2. Muchas gracias por el curso, solo una cosa, si después instalo la GUI de FreePBX me respetará las configuraciones que ya hice por consola?

    Saludos!

  3. Está genial esta pagina!!!!!! Gracias
    Por cierto, CSipSimple parece que ya no esta disponible en Play Store.
    Sin embargo, parece que 3CX para Android tiene buenos comentarios!

  4. que tal. buen dia oye tengo un detalle con un Xorcom Completepbx 4.5, que esta basado en asterisk y elastix las ultimas versiones.
    mi detalle esta que no esta funionando mi IVR no esta entrando como primer plano y como segundo estoy dirigiendo todo las llamadas a una extension pero no entran. ej. 9265 y no entra se van a la 9250. ya revise la configuracion y no le veo nada raro

  5. Hola buenas tardes. un gusto en saludarle, yo monte una freepbx para puras llamadas internas y las llamadas solo me duran 30 segundo como puedo resolver este inconveniente

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *