Instalación y Configuración de Asterisk PBX
Asterisk es la plataforma de telefonía IP de código abierto más extendida del mundo, que permite construir sistemas de centralita (PBX) completos con extensiones, colas de llamadas, menús IVR, buzón de voz y trunks SIP sin licencias de pago. Utilizado por empresas de todos los tamaños, Asterisk se integra con proveedores SIP externos para llamadas entrantes y salientes, manteniendo bajo control total el sistema de telecomunicaciones. Esta guía cubre la instalación en Linux, la configuración de trunks SIP, extensiones, el dialplan y el hardening de seguridad.
Requisitos Previos
- Ubuntu 20.04/22.04 o CentOS 8+/Rocky Linux 8+
- 1 GB de RAM mínimo (2 GB para sistemas medianos)
- CPU con soporte para bajo jitter de red
- Puertos abiertos: 5060 UDP/TCP (SIP) y rango 10000-20000 UDP (RTP de audio)
- Cuenta con un proveedor SIP (opcional para llamadas externas)
Instalación de Asterisk
Instalación en Ubuntu/Debian
# Instalar dependencias del sistema
sudo apt update
sudo apt install -y build-essential git wget libssl-dev libncurses5-dev \
libnewt-dev libxml2-dev linux-headers-$(uname -r) libsqlite3-dev \
uuid-dev libjansson-dev libedit-dev
# Descargar la versión LTS más reciente (verificar en asterisk.org)
ASTERISK_VERSION=20.8.1
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-${ASTERISK_VERSION}.tar.gz -P /tmp
cd /tmp && tar xzf asterisk-${ASTERISK_VERSION}.tar.gz
cd asterisk-${ASTERISK_VERSION}
# Instalar dependencias de Asterisk automáticamente
sudo contrib/scripts/install_prereq install
# Configurar los módulos a compilar
./configure --with-jansson-bundled
make menuselect # Abre un menú para seleccionar módulos opcionales
# Asegurarse de incluir: chan_pjsip, app_voicemail, app_queue, res_parking
# Compilar e instalar
make -j$(nproc)
sudo make install
sudo make samples # Instalar configuraciones de ejemplo
sudo make config # Instalar scripts de inicio
# Habilitar e iniciar el servicio
sudo systemctl enable asterisk --now
sudo systemctl status asterisk
Instalación desde repositorio (Ubuntu)
# Para Ubuntu 20.04/22.04, hay paquetes disponibles pero pueden ser versiones antiguas
sudo apt install -y asterisk
# Verificar la versión instalada
asterisk -V
Estructura de Configuración
Los archivos de configuración se encuentran en /etc/asterisk/:
| Archivo | Función |
|---|---|
pjsip.conf | Configuración de endpoints SIP (canales) |
extensions.conf | Dialplan (enrutamiento de llamadas) |
voicemail.conf | Configuración del buzón de voz |
queues.conf | Configuración de colas de llamadas |
musiconhold.conf | Música en espera |
asterisk.conf | Configuración general del sistema |
Configuración de SIP (PJSIP)
Asterisk recomienda PJSIP (chan_pjsip) sobre el antiguo chan_sip:
; /etc/asterisk/pjsip.conf
; Configuración global de transporte
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0:5060
; === EXTENSIONES INTERNAS ===
; Extensión 101 - Recepción
[101]
type=endpoint
context=internas
disallow=all
allow=ulaw,alaw,g722
auth=101-auth
aors=101-aor
callerid="Recepción" <101>
mailboxes=101@default
direct_media=no
[101-auth]
type=auth
auth_type=userpass
username=101
password=contraseña_segura_101
[101-aor]
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=30
; Extensión 102 - Departamento de Ventas
[102]
type=endpoint
context=internas
disallow=all
allow=ulaw,alaw,g722
auth=102-auth
aors=102-aor
callerid="Ventas" <102>
mailboxes=102@default
direct_media=no
[102-auth]
type=auth
auth_type=userpass
username=102
password=contraseña_segura_102
[102-aor]
type=aor
max_contacts=2
remove_existing=yes
Trunk SIP con Proveedor Externo
; /etc/asterisk/pjsip.conf (continuación)
; === TRUNK SIP CON PROVEEDOR EXTERNO ===
; Sustituir con los datos reales de tu proveedor SIP
[proveedor-sip-trunk]
type=registration
transport=transport-udp
outbound_auth=proveedor-sip-auth
server_uri=sip:sip.proveedor.com
client_uri=sip:[email protected]
retry_interval=60
[proveedor-sip-auth]
type=auth
auth_type=userpass
username=TU_USUARIO_SIP
password=TU_CONTRASEÑA_SIP
[proveedor-sip-aor]
type=aor
contact=sip:sip.proveedor.com
[proveedor-sip]
type=endpoint
transport=transport-udp
context=entrantes-externos
disallow=all
allow=ulaw,alaw,g722
outbound_auth=proveedor-sip-auth
aors=proveedor-sip-aor
from_user=TU_NUMERO
from_domain=sip.proveedor.com
direct_media=no
Extensiones y Dialplan
El dialplan en extensions.conf define el comportamiento de las llamadas:
; /etc/asterisk/extensions.conf
[globals]
; Variables globales
VOICEMAIL_TIMEOUT=20
BUSINESS_HOURS_START=9
BUSINESS_HOURS_END=18
; === LLAMADAS ENTRE EXTENSIONES INTERNAS ===
[internas]
; Llamadas al rango 1XX (extensiones internas)
exten => _1XX,1,NoOp(Llamada interna a ${EXTEN})
same => n,Dial(PJSIP/${EXTEN},20)
same => n,GotoIfElse($["${DIALSTATUS}" = "NOANSWER"]?buzon,1:colgado)
same => n(buzon),VoiceMail(${EXTEN}@default,u)
same => n(colgado),HangUp()
; Llamadas al buzón de voz propio
exten => *97,1,VoiceMailMain(${CALLERID(num)}@default)
; Llamadas al buzón de otra extensión
exten => *98,1,Read(BUZON_DESTINO,beep,3)
same => n,VoiceMailMain(${BUZON_DESTINO}@default)
; === LLAMADAS ENTRANTES DESDE EL EXTERIOR ===
[entrantes-externos]
; Número DID principal de la empresa
exten => TU_NUMERO_DID,1,NoOp(Llamada entrante de ${CALLERID(all)})
same => n,Answer()
same => n,Set(CHANNEL(language)=es)
same => n,GotoIfTime(${BUSINESS_HOURS_START}:00-${BUSINESS_HOURS_END}:00,mon-fri,*,*?horario_laboral,1)
same => n,Goto(fuera_horario,1)
; Llamadas en horario laboral
exten => horario_laboral,1,Playback(bienvenida-empresa)
same => n,Goto(ivr-principal,start)
; Llamadas fuera de horario
exten => fuera_horario,1,Playback(mensaje-fuera-horario)
same => n,VoiceMail(receptionist@default,u)
same => n,HangUp()
; === MENÚ IVR PRINCIPAL ===
[ivr-principal]
exten => start,1,Answer()
same => n,Background(menu-principal)
same => n,WaitExten(5)
; Opción 1: Ventas
exten => 1,1,Dial(PJSIP/102,20)
same => n,VoiceMail(102@default,u)
same => n,HangUp()
; Opción 2: Soporte técnico
exten => 2,1,Dial(PJSIP/103&PJSIP/104,20)
same => n,Queue(soporte,t,,,60)
same => n,VoiceMail(soporte@default,u)
same => n,HangUp()
; Opción 0: Operadora
exten => 0,1,Dial(PJSIP/101,30)
same => n,VoiceMail(101@default,u)
same => n,HangUp()
; Repetir menú si no se pulsa nada
exten => t,1,Goto(start)
exten => i,1,Playback(opcion-no-valida)
same => n,Goto(start)
; === LLAMADAS SALIENTES ===
[salientes]
; Llamadas con prefijo 0 para salida al exterior
exten => _0.,1,NoOp(Llamada saliente a ${EXTEN:1})
same => n,Set(CALLERID(num)=TU_NUMERO_PRESENTACION)
same => n,Dial(PJSIP/TU_NUMERO_PRESENTACION${EXTEN:1}@proveedor-sip)
same => n,HangUp()
; Emergencias siempre disponibles
exten => 112,1,Dial(PJSIP/112@proveedor-sip)
exten => 062,1,Dial(PJSIP/062@proveedor-sip)
Buzón de Voz y Menú IVR
; /etc/asterisk/voicemail.conf
[general]
format=wav49|gsm|wav
[email protected]
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %d de %B de %Y a las %H:%M
emailbody=Tienes ${VM_MSGNUM} nuevo(s) mensaje(s) en el buzón ${VM_MAILBOX}.\nLa llamada fue de ${VM_CIDNAME} (${VM_CIDNUM}) a las ${VM_DATE}.\nDuración: ${VM_DUR} segundos.
emailsubject=[Asterisk PBX] Nuevo mensaje de voz de ${VM_CALLERID}
[default]
101 => 1234,Recepción,[email protected]
102 => 5678,Ventas,[email protected]
103 => 9012,Soporte,[email protected]
; formato: extensión => PIN,Nombre completo,email
Seguridad y Hardening
# Firewall: solo permitir SIP desde IPs conocidas
sudo ufw allow from IP_PROVEEDOR_SIP to any port 5060 proto udp
sudo ufw allow from IP_PROVEEDOR_SIP to any port 5060 proto tcp
sudo ufw allow 10000:20000/udp # Puertos RTP de audio
# Instalar fail2ban para proteger contra ataques SIP
sudo apt install -y fail2ban
# Crear filtro para Asterisk
sudo tee /etc/fail2ban/filter.d/asterisk.conf > /dev/null <<EOF
[Definition]
failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>(:\d+)?' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '<HOST>(:\d+)?' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>(:\d+)?' - Username/auth name mismatch
NOTICE.* .*: Registration from '.*' failed for '<HOST>(:\d+)?' - Device does not match ACL
NOTICE.* <HOST> failed to authenticate as .*$
NOTICE.* .*: No registration for peer '.*' (from <HOST>)
NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
VERBOSE.*SIP/2.0 403 Forbidden\n.*\nVia: SIP/2.0/UDP <HOST>
ignoreregex =
EOF
# Crear jail para Asterisk
sudo tee /etc/fail2ban/jail.d/asterisk.conf > /dev/null <<EOF
[asterisk]
enabled = true
filter = asterisk
action = ufw[application="OpenSSH", blocktype=reject]
logpath = /var/log/asterisk/full
maxretry = 5
findtime = 3600
bantime = 86400
EOF
sudo systemctl restart fail2ban
; En /etc/asterisk/pjsip.conf - Añadir restricciones de ACL a los endpoints
[101]
; ... configuración anterior ...
; Permitir solo conexiones desde la red local
deny=0.0.0.0/0
permit=192.168.1.0/255.255.255.0
Solución de Problemas
Conectar a la consola de Asterisk:
# Conectar a la consola de Asterisk en modo depuración
sudo asterisk -rvvv
# Comandos útiles en la consola:
# pjsip show endpoints - Ver endpoints SIP
# pjsip show registrations - Ver registros activos
# pjsip show contacts - Ver contactos registrados
# core show channels - Ver llamadas activas
# dialplan show [contexto] - Ver el dialplan compilado
# module reload chan_pjsip - Recargar módulo SIP sin reiniciar
# module reload pbx_config - Recargar el dialplan
Las extensiones no se registran:
# En la consola de Asterisk
asterisk -rv -e "pjsip set logger on; pjsip show endpoints"
# Verificar errores de autenticación
sudo tail -f /var/log/asterisk/full | grep -i "registration\|auth\|401\|403"
No hay audio en las llamadas (one-way audio):
# El problema más común es NAT. Configurar en pjsip.conf:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=TU_IP_PUBLICA
external_signaling_address=TU_IP_PUBLICA
local_net=192.168.1.0/24 # Tu red local
# Y en cada endpoint:
direct_media=no
rtp_symmetric=yes
La llamada al IVR no reproduce audio:
# Verificar que los archivos de audio existen
ls /var/lib/asterisk/sounds/es/
# Instalar paquetes de sonido en español
sudo apt install asterisk-prompt-es # Ubuntu
# O descargar manualmente desde asterisk.org
Conclusión
Asterisk es una plataforma de telefonía extremadamente potente que puede adaptarse desde una pequeña empresa con 5 extensiones hasta call centers con cientos de agentes. La clave para una implementación exitosa es configurar correctamente el NAT y el firewall desde el inicio, usar contraseñas robustas en todos los endpoints SIP y proteger el servidor con fail2ban para prevenir ataques de fuerza bruta que pueden generar facturas telefónicas abultadas. Con el dialplan bien diseñado, Asterisk ofrece flexibilidad ilimitada para construir cualquier flujo de llamadas que el negocio requiera.


