Asterisk es un software de código abierto para construir centralitas telefónicas IP (PBX): registra teléfonos SIP como extensiones, enruta las llamadas según un plan de marcación (dialplan) y conecta con proveedores de telefonía para llamar a números externos. En este tutorial instalarás Asterisk en Ubuntu 24.04, crearás dos extensiones con PJSIP y buzón de voz, configurarás un trunk SIP para llamadas entrantes y salientes, y protegerás el servidor con UFW y fail2ban.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS y una IP pública fija, por ejemplo un VPS de CubePath, con un usuario no root con privilegios
sudo. - 1 GB de RAM y 1 vCPU son suficientes para una oficina pequeña.
- Un softphone para las pruebas, como Linphone, Zoiper o MicroSIP, instalado en tu ordenador o móvil.
- Opcional: una cuenta con un proveedor SIP (el usuario, la contraseña, el servidor SIP y tu número DID) para llamadas externas.
A lo largo de la guía, sustituye your_server_ip por la IP pública del servidor y sip.provider.example por el servidor SIP de tu proveedor.
Paso 1: Instalar Asterisk
Ubuntu 24.04 incluye Asterisk 20, una versión con soporte a largo plazo (LTS), en el repositorio universe. Instalarlo desde el paquete te da el servicio systemd, el usuario de sistema asterisk y las actualizaciones de seguridad de Ubuntu sin compilar nada:
sudo apt update
sudo apt install asterisk
Comprueba la versión y el estado del servicio:
asterisk -V
sudo systemctl status asterisk
Asterisk 20.6.0~dfsg+~cs6.13.40431414-2build5
● asterisk.service - Asterisk PBX
Loaded: loaded (/usr/lib/systemd/system/asterisk.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-25 09:41:03 UTC; 12s ago
Conéctate a la consola de Asterisk para confirmar que responde. La opción -r se conecta al proceso en marcha y -x ejecuta un comando y sale:
sudo asterisk -rx "core show version"
Notasi necesitas una versión más reciente que la del paquete (por ejemplo Asterisk 22 LTS), puedes compilarla desde las fuentes de downloads.asterisk.org. El resto de la configuración de esta guía es la misma.
Paso 2: Conocer los archivos de configuración
La configuración vive en /etc/asterisk/. El paquete instala allí archivos de ejemplo muy extensos; en esta guía reemplazarás los tres que necesitas por versiones mínimas y comentadas:
| Archivo | Función |
|---|---|
pjsip.conf | Transportes SIP, extensiones (endpoints) y trunks |
extensions.conf | Dialplan: qué pasa con cada número marcado |
voicemail.conf | Buzones de voz y su PIN |
rtp.conf | Rango de puertos UDP para el audio (10000 a 20000 por defecto) |
logger.conf | Qué se registra y en qué archivos de /var/log/asterisk/ |
Guarda una copia de los originales antes de sustituirlos:
cd /etc/asterisk
sudo cp pjsip.conf pjsip.conf.orig
sudo cp extensions.conf extensions.conf.orig
sudo cp voicemail.conf voicemail.conf.orig
Paso 3: Crear las extensiones con PJSIP
PJSIP (chan_pjsip) es el canal SIP actual de Asterisk; el antiguo chan_sip ya no existe en las versiones modernas. Cada extensión se define con tres objetos que comparten nombre: un endpoint (el teléfono y sus opciones), un auth (usuario y contraseña) y un aor (dónde está registrado). Las plantillas, marcadas con (!), evitan repetir las mismas opciones en cada extensión.
Abre el archivo y sustituye su contenido por el siguiente:
sudo nano /etc/asterisk/pjsip.conf
; Transporte SIP por UDP en el puerto 5060
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; ---------- Plantillas ----------
[endpoint-interno](!)
type=endpoint
context=internas
disallow=all
allow=ulaw,alaw,g722
direct_media=no
; Opciones para teléfonos detrás de NAT (el caso habitual)
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
[auth-userpass](!)
type=auth
auth_type=userpass
[aor-telefono](!)
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=60
; ---------- Extensión 101 ----------
[101](endpoint-interno)
auth=101
aors=101
callerid="Recepcion" <101>
mailboxes=101@default
[101](auth-userpass)
username=101
password=your_strong_password_101
[101](aor-telefono)
; ---------- Extensión 102 ----------
[102](endpoint-interno)
auth=102
aors=102
callerid="Ventas" <102>
mailboxes=102@default
[102](auth-userpass)
username=102
password=your_strong_password_102
[102](aor-telefono)
Sustituye your_strong_password_101 y your_strong_password_102 por contraseñas largas y aleatorias. Los servidores SIP expuestos a Internet reciben intentos de fuerza bruta a los pocos minutos de arrancar; puedes generar una contraseña con openssl rand -base64 18.
Como el archivo contiene contraseñas, restringe los permisos para que solo root y el usuario asterisk puedan leerlo:
sudo chown root:asterisk /etc/asterisk/pjsip.conf
sudo chmod 640 /etc/asterisk/pjsip.conf
Recarga la configuración de PJSIP y comprueba que aparecen las dos extensiones:
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show endpoints"
Endpoint: 101/101 Unavailable 0 of inf
InAuth: 101/101
Aor: 101 1
Endpoint: 102/102 Unavailable 0 of inf
InAuth: 102/102
Aor: 102 1
El estado Unavailable es correcto: todavía no hay ningún teléfono registrado.
Paso 4: Configurar el buzón de voz
Cada buzón se define con el formato extensión => PIN,Nombre,email. Abre el archivo y sustituye su contenido:
sudo nano /etc/asterisk/voicemail.conf
[general]
format=wav49|gsm|wav
maxmsg=100
maxsecs=180
; Envío del mensaje por email (requiere un MTA local como Postfix)
serveremail=pbx@your_domain
attach=yes
[default]
101 => 4821,Recepcion,recepcion@your_domain
102 => 7390,Ventas,ventas@your_domain
Cambia los PIN de ejemplo por otros propios. Si el servidor no tiene un agente de correo configurado, los mensajes se guardan igualmente en /var/spool/asterisk/voicemail/default/ y se escuchan desde el teléfono; simplemente no llegará el aviso por email.
Paso 5: Escribir el dialplan
El dialplan de extensions.conf se organiza en contextos. Las extensiones del paso 3 usan el contexto internas, así que todo lo que marquen se busca ahí. Cada línea exten => número,prioridad,aplicación ejecuta una aplicación, y same => n continúa en la siguiente prioridad de la misma extensión.
Abre el archivo y sustituye su contenido:
sudo nano /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=yes
[internas]
; Llamadas entre extensiones 100-199: suena 20 segundos y, si no contesta, buzón de voz
exten => _1XX,1,NoOp(Llamada interna a ${EXTEN})
same => n,Dial(PJSIP/${EXTEN},20)
same => n,VoiceMail(${EXTEN}@default,u)
same => n,Hangup()
; *97: escuchar el buzón propio
exten => *97,1,VoiceMailMain(${CALLERID(num)}@default)
same => n,Hangup()
; 600: prueba de eco para comprobar el audio en los dos sentidos
exten => 600,1,Answer()
same => n,Playback(demo-echotest)
same => n,Echo()
same => n,Hangup()
; Llamadas externas: se marca 0 + número y se envía por el trunk sin el 0
exten => _0X.,1,NoOp(Llamada saliente a ${EXTEN:1})
same => n,Dial(PJSIP/${EXTEN:1}@proveedor,60)
same => n,Hangup()
; Emergencias sin prefijo
exten => 112,1,Dial(PJSIP/112@proveedor)
same => n,Hangup()
[entrantes]
; Todas las llamadas que llegan del proveedor suenan en recepción
exten => _X.,1,Goto(recepcion,1)
exten => _+X.,1,Goto(recepcion,1)
exten => recepcion,1,NoOp(Llamada entrante de ${CALLERID(all)})
same => n,Dial(PJSIP/101,25)
same => n,VoiceMail(101@default,u)
same => n,Hangup()
En los patrones, _ indica que la extensión es un patrón, X es cualquier dígito y . es uno o más caracteres. ${EXTEN:1} es el número marcado sin su primer carácter.
Recarga el dialplan y el buzón de voz y comprueba que Asterisk ha cargado el contexto:
sudo asterisk -rx "dialplan reload"
sudo asterisk -rx "voicemail reload"
sudo asterisk -rx "dialplan show internas"
[ Context 'internas' created by 'pbx_config' ]
'112' => 1. Dial(PJSIP/112@proveedor)
2. Hangup()
'600' => 1. Answer()
...
Paso 6: Abrir el cortafuegos
Asterisk necesita el puerto 5060/udp para la señalización SIP y el rango 10000-20000/udp para el audio (RTP). Si tus teléfonos se conectan siempre desde las mismas IP (la oficina y el proveedor), limita SIP a esas direcciones:
sudo ufw allow OpenSSH
sudo ufw allow from your_office_ip to any port 5060 proto udp
sudo ufw allow from your_provider_ip to any port 5060 proto udp
sudo ufw allow 10000:20000/udp
sudo ufw enable
sudo ufw status
Si tienes usuarios remotos con IP cambiante, tendrás que abrir 5060/udp a todo el mundo con sudo ufw allow 5060/udp. En ese caso el paso 8 (fail2ban) es imprescindible.
Paso 7: Registrar un softphone y hacer la primera llamada
Configura una cuenta SIP en tu softphone con estos datos:
| Campo | Valor |
|---|---|
| Usuario / extensión | 101 |
| Contraseña | la de [101] en pjsip.conf |
| Dominio / servidor | your_server_ip |
| Transporte | UDP |
Cuando el softphone indique que está registrado, compruébalo desde el servidor:
sudo asterisk -rx "pjsip show contacts"
Contact: 101/sip:[email protected]:52814;ob a1b2c3d4e5 Avail 38.412
Marca 600 desde el softphone. Deberías oír el mensaje de la prueba de eco y, después, tu propia voz. Si oyes el mensaje pero no tu eco, o no oyes nada, el audio RTP está bloqueado: revisa el paso 6.
Registra la extensión 102 en otro dispositivo y llama de una a otra marcando 101 o 102. Si no contestas en 20 segundos, la llamada pasa al buzón de voz; escucha los mensajes marcando *97.
Para seguir en directo lo que ocurre durante una llamada, abre la consola con más detalle:
sudo asterisk -rvvv
Sal de la consola con exit (Asterisk sigue funcionando).
Paso 8: Conectar un trunk SIP con tu proveedor
El trunk permite recibir llamadas en tu número y llamar a teléfonos externos. La configuración exacta depende del proveedor, pero la mayoría usan registro con usuario y contraseña. Añade estas secciones al final de pjsip.conf, sustituyendo los valores your_sip_user, your_sip_password y sip.provider.example por los que te haya dado:
sudo nano /etc/asterisk/pjsip.conf
; ---------- Trunk con el proveedor ----------
; Registro: Asterisk se anuncia al proveedor para recibir llamadas
[proveedor-reg]
type=registration
transport=transport-udp
outbound_auth=proveedor-auth
server_uri=sip:sip.provider.example
client_uri=sip:[email protected]
retry_interval=60
[proveedor-auth](auth-userpass)
username=your_sip_user
password=your_sip_password
[proveedor]
type=aor
contact=sip:sip.provider.example
[proveedor]
type=endpoint
transport=transport-udp
context=entrantes
disallow=all
allow=ulaw,alaw
outbound_auth=proveedor-auth
aors=proveedor
from_user=your_sip_user
from_domain=sip.provider.example
direct_media=no
; Identifica las llamadas entrantes del proveedor por su IP
[proveedor]
type=identify
endpoint=proveedor
match=sip.provider.example
La sección identify es la que hace que las llamadas entrantes del proveedor entren en el contexto entrantes en lugar de ser rechazadas como anónimas. Si tu proveedor envía llamadas desde varias IP, añade una línea match= por cada una.
Recarga PJSIP y comprueba el registro:
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
<Registration/ServerURI..............................> <Auth....................> <Status.......>
==========================================================================================
proveedor-reg/sip:sip.provider.example proveedor-auth Registered
Prueba una llamada saliente marcando 0 seguido del número en el formato que acepte tu proveedor (por ejemplo 0612345678 envía 612345678), y una entrante llamando a tu número DID desde un móvil.
Paso 9: Proteger Asterisk con fail2ban
Los bots escanean continuamente el puerto 5060 probando contraseñas para hacer llamadas a números de tarificación especial a tu costa. fail2ban lee el registro de Asterisk y bloquea las IP que fallan la autenticación repetidamente. Instálalo:
sudo apt install fail2ban
fail2ban ya trae un filtro llamado asterisk que reconoce los intentos fallidos de PJSIP. Comprueba cómo se llama el archivo de mensajes en tu sistema, ya que la jaula debe apuntar a él:
ls /var/log/asterisk/
cdr-csv cdr-custom messages.log queue_log
Crea la jaula con la ruta que hayas visto (messages.log o messages):
sudo nano /etc/fail2ban/jail.d/asterisk.local
[asterisk]
enabled = true
logpath = /var/log/asterisk/messages.log
maxretry = 5
findtime = 10m
bantime = 1d
Reinicia fail2ban y comprueba que la jaula está activa:
sudo systemctl restart fail2ban
sudo fail2ban-client status asterisk
Status for the jail: asterisk
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/asterisk/messages.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Para comprobar que funciona, configura en un softphone una contraseña incorrecta: tras cinco intentos, su IP aparecerá en Banned IP list. Desbloquéala con sudo fail2ban-client set asterisk unbanip IP_BLOQUEADA.
Solución de problemas
El softphone no se registra (401 Unauthorized o 403 Forbidden). Abre la consola, activa el registro de mensajes SIP y repite el intento desde el softphone:
sudo asterisk -rvvv
Dentro de la consola, ejecuta:
pjsip set logger on
Verás cada petición REGISTER y la respuesta de Asterisk. Revisa que el usuario coincide con la sección auth y que la contraseña es correcta. Desactívalo con pjsip set logger off y sal con exit.
Audio en un solo sentido o sin audio. Casi siempre es NAT o cortafuegos. Comprueba que el rango 10000:20000/udp está abierto y que el endpoint tiene rtp_symmetric=yes, force_rport=yes y rewrite_contact=yes. Si el propio servidor Asterisk está detrás de NAT (con IP privada), añade al transporte external_media_address y external_signaling_address con la IP pública y local_net con tu red privada.
Las llamadas entrantes del proveedor se rechazan. En la consola verás No matching endpoint found. La IP desde la que llega la llamada no coincide con el match de la sección identify; pídele al proveedor su lista de IP de señalización y añádelas.
Los cambios no se aplican. Recuerda recargar el módulo correspondiente: pjsip reload para pjsip.conf, dialplan reload para extensions.conf y voicemail reload para voicemail.conf. Si hay un error de sintaxis, aparece en /var/log/asterisk/messages.log.
Conclusión
Tienes una centralita Asterisk en Ubuntu 24.04 con dos extensiones PJSIP, buzón de voz, prueba de eco, un trunk SIP para llamadas externas y protección contra ataques de fuerza bruta. A partir de aquí puedes añadir un menú de voz (IVR) con las aplicaciones Background() y WaitExten(), crear colas de llamadas con queues.conf, o cifrar la señalización y el audio con un transporte TLS y SRTP para los teléfonos que se conectan por Internet.
