Saltearse al contenido

Taller 4: Construyendo una PBX Básica con PJSIP

Configuración completa de una PBX funcional con 3 extensiones y plan de marcación

Taller 4: Construyendo tu Primera PBX con PJSIP

Sección titulada «Taller 4: Construyendo tu Primera PBX con PJSIP»

️Asegurar nuestro servidor Debian con un cortafuegos (UFW).
️Configurar 3 extensiones PJSIP utilizando una estructura modular y plantillas.
️Crear un plan de marcación (Dialplan) básico para permitir llamadas internas.
️Aprender los comandos CLI esenciales para verificar y depurar PJSIP.
️Instalar y utilizar sngrep para visualizar el tráfico SIP en tiempo real.

4.1.- Preparación: Backup y Seguridad Primero

Sección titulada «4.1.- Preparación: Backup y Seguridad Primero»

Antes de tocar cualquier configuración, siempre es una buena práctica hacer una copia de seguridad y asegurar el perímetro de nuestro servidor.

4.1.1- Backup de los Archivos de Configuración

Sección titulada «4.1.1- Backup de los Archivos de Configuración»

Los archivos de configuración de ejemplo que instalamos con make samples son un excelente punto de partida, pero vamos a modificarlos. Guardemos una copia limpia.

Terminal window
# Navegamos al directorio de configuración de Asterisk.
cd /etc/asterisk
# Creamos una copia de seguridad recursiva del directorio completo.
cp -rfv . ../asterisk.bk

Esto crea una carpeta asterisk.bk en /etc/ que contiene el estado original de todos los archivos. Si algo sale mal, siempre podemos restaurar desde aquí.

4.1.2- Configuración del Cortafuegos (UFW en Debian)

Sección titulada «4.1.2- Configuración del Cortafuegos (UFW en Debian)»

Ahora, aseguraremos nuestro servidor. En Debian, la herramienta estándar es UFW (Uncomplicated Firewall). Abriremos solo los puertos necesarios para Asterisk.

Terminal window
# Habilitamos el cortafuegos. Asegúrate de permitir SSH primero si estás conectado remotamente.
ufw allow ssh
ufw enable
# Ahora, abrimos los puertos que Asterisk necesita para funcionar:
# Puerto 5060/UDP: Es el puerto estándar para la señalización SIP.
ufw allow 5060/udp
# Puertos 10000-20000/UDP: Es el rango por defecto que Asterisk usa para el audio (RTP).
ufw allow 10000:20000/udp
# Por seguridad para el curso, lo recomendable es aceptar solo nuestra IP
ufw allow from IP
# (Opcional) Puerto para IAX2, si planeas usarlo para interconectar servidores.
# ufw allow 4569/udp

Verificamos el estado del cortafuegos para confirmar que las reglas están activas.

Sección titulada «Verificamos el estado del cortafuegos para confirmar que las reglas están activas.»
Terminal window
ufw status verbose

Deberías ver una salida que muestra las reglas ALLOW para los puertos 22, 5060, y el rango 10000:20000. Nuestro servidor ya no está completamente expuesto.


4.2.- El Corazón de la PBX: Configurando pjsip.conf

Sección titulada «4.2.- El Corazón de la PBX: Configurando pjsip.conf»

Olvídate de sip.conf. En Asterisk 22, nuestro mundo es pjsip.conf. Vamos a configurarlo de la manera correcta desde el principio: de forma modular y con plantillas.

Primero, limpiemos el archivo de ejemplo para empezar desde cero.

Terminal window
# Estando en /etc/asterisk/
> pjsip.conf
nano pjsip.conf

Ahora, pega la siguiente configuración completa en el archivo pjsip.conf:

;================================================================================
; TRANSPORTES - Cómo escucha Asterisk
;================================================================================
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060 ; Escucha en todas las interfaces de red
;================================================================================
; PLANTILLAS - Para no repetir código (¡Mejores Prácticas!)
;================================================================================
[endpoint-template](!) ; El (!) denota que esto es una plantilla abstracta
type=endpoint
context=internal ; Todas las extensiones de esta plantilla irán al contexto [internal]
disallow=all ; Prohibimos todos los códecs...
allow=ulaw ; ...y luego permitimos solo los que queremos, en orden de preferencia
allow=alaw
allow=opus ; Opus es un códec moderno y eficiente
transport=transport-udp
[auth-template](!)
type=auth
auth_type=userpass
[aor-template](!)
type=aor
max_contacts=1 ; Por defecto, solo 1 dispositivo por extensión
qualify_frequency=60 ; Asterisk comprobará si el dispositivo está en línea cada 60 segundos
;================================================================================
; EXTENSIONES - Creando nuestros teléfonos
;================================================================================
; --- Extensión 1001: Usuario de Oficina ---
[1001](endpoint-template)
auth=1001
aors=1001
callerid = Usuario Oficina <1001>
[1001](auth-template)
username=1001
password=pass1001 ; En producción, usar contraseñas mucho más seguras
[1001](aor-template)
; --- Extensión 1002: Softphone de Soporte ---
[1002](endpoint-template)
auth=1002
aors=1002
callerid = Agente Soporte <1002>
[1002](auth-template)
username=1002
password=pass1002
[1002](aor-template)
max_contacts=2 ; Este agente puede tener su softphone y su móvil registrados a la vez
; --- Extensión 1003: Teléfono de Almacén ---
[1003](endpoint-template)
auth=1003
aors=1003
callerid = Almacen <1003>
[1003](auth-template)
username=1003
password=pass1003
[1003](aor-template)

Guarda el archivo y sal (Ctrl + X, Y, Enter).

Análisis de la Configuración:

  • Transport: Hemos definido la “puerta” por la que Asterisk escuchará el tráfico SIP.
  • Plantillas: Creamos un endpoint-template, auth-template, y aor-template. Esto hace que añadir una nueva extensión sea increíblemente limpio. Solo necesitamos especificar lo que cambia.
  • Extensiones: Cada extensión está compuesta por sus tres objetos lógicos (endpoint, auth, aor), pero heredando (template-name) toda la configuración base. Observa cómo para la extensión 1002 sobrescribimos max_contacts a 2, demostrando la flexibilidad del sistema.

4.3.- La Lógica: Configurando extensions.conf

Sección titulada «4.3.- La Lógica: Configurando extensions.conf»

Ahora que tenemos teléfonos definidos, necesitamos decirles qué hacer. Ese es el trabajo del Dialplan. Limpiemos el archivo de ejemplo y creemos nuestra lógica básica.

Terminal window
# Estando en /etc/asterisk/
> extensions.conf
nano extensions.conf

Pega la siguiente configuración en el archivo extensions.conf:

[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
; En esta sección podemos definir variables globales, pero la dejaremos vacía por ahora.
[internal]
; Este es el contexto que definimos en nuestros endpoints PJSIP.
; Aquí definimos qué pasa cuando alguien marca un número.
; Lógica para llamar entre extensiones internas (1001, 1002, 1003)
exten => _100X,1,NoOp(Llamada interna a la extension ${EXTEN})
same => n,Dial(PJSIP/${EXTEN},30,tT)
same => n,Hangup()
; Extensión de prueba para reproducir un sonido
exten => 500,1,NoOp(Iniciando prueba de audio)
same => n,Answer()
same => n,Playback(hello-world)
same => n,Hangup()

Análisis del Dialplan:

  • [internal]: Este es el nombre del “vecindario” o contexto donde viven nuestras extensiones. Coincide con el context=internal que pusimos en la plantilla del endpoint.
  • exten => _100X,1...: Esta es la parte más importante.
    • _100X: Es un patrón de marcación. El _ indica que es un patrón. 100 es un prefijo fijo. X es un comodín para cualquier dígito del 0 al 9. Este simple patrón maneja las llamadas a 1001, 1002, 1003… hasta 1009.
    • NoOp(...): Es una aplicación que no hace nada, excepto imprimir un mensaje en la consola. Es invaluable para depurar. ${EXTEN} es una variable que contiene el número que se marcó.
    • Dial(PJSIP/${EXTEN},30,tT): Esta es la aplicación que realiza la llamada. Le dice a Asterisk que llame al endpoint PJSIP correspondiente al número marcado (${EXTEN}), que timbre durante 30 segundos, y las opciones tT permiten transferir la llamada.
    • Hangup(): Cuelga la llamada cuando la aplicación Dial termina.

4.4.- ¡El Momento de la Verdad! Carga, Verificación y Llamada

Sección titulada «4.4.- ¡El Momento de la Verdad! Carga, Verificación y Llamada»

Hemos configurado la PBX. Ahora, vamos a cargar la configuración y a verificar que todo esté en orden.

Terminal window
# Conéctate al CLI de Asterisk
asterisk -rvvv

Dentro del CLI, ejecuta los siguientes comandos:

Terminal window
*CLI> pjsip reload ; Carga la nueva configuración de pjsip.conf
*CLI> dialplan reload ; Carga la nueva configuración de extensions.conf
*CLI> pjsip show endpoints
; Deberías ver tus 3 endpoints (1001, 1002, 1003).
; Su estado será 'Not in use' y 'Unavailable' porque aún no hemos registrado ningún teléfono.
*CLI> pjsip show aors
; Verás los 3 AORs y su estado de contacto (probablemente 0/X).

Ahora, configura tus dispositivos:

  1. Usa un teléfono IP físico o un softphone (como Zoiper, MicroSIP).
  2. Crea una cuenta PJSIP/SIP con los siguientes datos:
    • Dominio/Servidor: La IP de tu servidor Asterisk.
    • Usuario: 1001
    • Contraseña: pass1001
  3. Haz lo mismo para la extensión 1002 en otro dispositivo.

Vuelve al CLI de Asterisk y ejecuta de nuevo:

Terminal window
*CLI> pjsip show endpoints

¡El estado ahora debería ser Reachable!

¡Llama del 1001 al 1002! Deberías ver un montón de actividad en la consola.

Para “ver” la conversación SIP que aprendimos en la teoría, usaremos sngrep.

Terminal window
# Sal del CLI de Asterisk (con 'exit') y vuelve a la shell de Linux.
# Instalamos sngrep en Debian.
apt install sngrep -y
# Ejecutamos sngrep. Escuchará todo el tráfico SIP.
sngrep

Ahora, haz una llamada de nuevo. Verás el flujo INVITE -> TRYING -> RINGING -> OK -> ACK en tiempo real. Es la mejor herramienta para entender y depurar SIP. Presiona Enter sobre una llamada para ver el detalle de los paquetes.



¡Felicidades, has construido y probado tu primera PBX PJSIP!

  • Backup creado en /etc/asterisk.bk
  • UFW habilitado con reglas para SSH, 5060/udp y 10000:20000/udp
  • Extensiones PJSIP definidas en pjsip.conf
  • Dialplan básico creado en extensions.conf
  • Configuración recargada (pjsip reload / dialplan reload)
  • Verificación en CLI (pjsip show endpoints, core show channels)
  • Tráfico SIP verificado con sngrep

TareaComando
Habilitar UFW y abrir puertosufw allow ssh · ufw allow 5060/udp · ufw allow 10000:20000/udp
Editar configuraciónnano /etc/asterisk/pjsip.conf · nano /etc/asterisk/extensions.conf
Recargar PJSIPasterisk -rx "pjsip reload"
Recargar Dialplanasterisk -rx "dialplan reload"
Ver endpoints PJSIPasterisk -rx "pjsip show endpoints"
Ver canales activosasterisk -rx "core show channels"
Inspeccionar tráfico SIPsngrep