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»Este laboratorio tiene como objetivo
Sección titulada «Este laboratorio tiene como objetivo»✔ ️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.
# Navegamos al directorio de configuración de Asterisk.cd /etc/asterisk
# Creamos una copia de seguridad recursiva del directorio completo.cp -rfv . ../asterisk.bkEsto 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.
# Habilitamos el cortafuegos. Asegúrate de permitir SSH primero si estás conectado remotamente.ufw allow sshufw 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 IPufw allow from IP
# (Opcional) Puerto para IAX2, si planeas usarlo para interconectar servidores.# ufw allow 4569/udpVerificamos 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.»ufw status verboseDeberí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.
# Estando en /etc/asterisk/> pjsip.confnano pjsip.confAhora, pega la siguiente configuración completa en el archivo pjsip.conf:
;================================================================================; TRANSPORTES - Cómo escucha Asterisk;================================================================================[transport-udp]type=transportprotocol=udpbind=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 abstractatype=endpointcontext=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 preferenciaallow=alawallow=opus ; Opus es un códec moderno y eficientetransport=transport-udp
[auth-template](!)type=authauth_type=userpass
[aor-template](!)type=aormax_contacts=1 ; Por defecto, solo 1 dispositivo por extensiónqualify_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=1001aors=1001callerid = Usuario Oficina <1001>
[1001](auth-template)username=1001password=pass1001 ; En producción, usar contraseñas mucho más seguras
[1001](aor-template)
; --- Extensión 1002: Softphone de Soporte ---[1002](endpoint-template)auth=1002aors=1002callerid = Agente Soporte <1002>
[1002](auth-template)username=1002password=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=1003aors=1003callerid = Almacen <1003>
[1003](auth-template)username=1003password=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, yaor-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ón1002sobrescribimosmax_contactsa2, 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.
# Estando en /etc/asterisk/> extensions.confnano extensions.confPega la siguiente configuración en el archivo extensions.conf:
[general]static=yeswriteprotect=noclearglobalvars=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 sonidoexten => 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 elcontext=internalque 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.100es un prefijo fijo.Xes 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 durante30segundos, y las opcionestTpermiten transferir la llamada.Hangup(): Cuelga la llamada cuando la aplicaciónDialtermina.
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.
# Conéctate al CLI de Asteriskasterisk -rvvvDentro del CLI, ejecuta los siguientes comandos:
*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:
- Usa un teléfono IP físico o un softphone (como Zoiper, MicroSIP).
- Crea una cuenta PJSIP/SIP con los siguientes datos:
- Dominio/Servidor: La IP de tu servidor Asterisk.
- Usuario:
1001 - Contraseña:
pass1001
- Haz lo mismo para la extensión
1002en otro dispositivo.
Vuelve al CLI de Asterisk y ejecuta de nuevo:
*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.
4.4.1- La Herramienta Definitiva: sngrep
Sección titulada «4.4.1- La Herramienta Definitiva: sngrep»Para “ver” la conversación SIP que aprendimos en la teoría, usaremos sngrep.
# 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.sngrepAhora, 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.
✅ Checklist Final del Taller
Sección titulada «✅ Checklist Final del Taller»- 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
🧰 Resumen de Comandos Clave
Sección titulada «🧰 Resumen de Comandos Clave»| Tarea | Comando |
|---|---|
| Habilitar UFW y abrir puertos | ufw allow ssh · ufw allow 5060/udp · ufw allow 10000:20000/udp |
| Editar configuración | nano /etc/asterisk/pjsip.conf · nano /etc/asterisk/extensions.conf |
| Recargar PJSIP | asterisk -rx "pjsip reload" |
| Recargar Dialplan | asterisk -rx "dialplan reload" |
| Ver endpoints PJSIP | asterisk -rx "pjsip show endpoints" |
| Ver canales activos | asterisk -rx "core show channels" |
| Inspeccionar tráfico SIP | sngrep |