Configuración de Asterisk para Telefonía VoIP
Introducción
Asterisk es una plataforma de comunicaciones de código abierto que permite crear soluciones de telefonía completas. En esta guía, aprenderás a configurar un servidor Asterisk desde cero.
Instalación de Asterisk
Requisitos del Sistema
# Actualizar sistema
sudo apt update && sudo apt upgrade -y
# Dependencias necesarias
sudo apt install -y build-essential wget libssl-dev libncurses5-dev \
libnewt-dev libxml2-dev linux-headers-$(uname -r) libsqlite3-dev \
uuid-dev libjansson-dev
Compilación desde código fuente
# Descargar Asterisk
cd /usr/src
sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
sudo tar xzf asterisk-20-current.tar.gz
cd asterisk-20.*
# Configurar y compilar
sudo ./configure
sudo make menuselect # Seleccionar módulos
sudo make && sudo make install
sudo make samples # Instalar configuraciones de ejemplo
sudo make progdocs # Documentación (opcional)
Configuración inicial
# Crear usuario asterisk
sudo adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk PBX" asterisk
# Permisos
sudo chown -R asterisk:asterisk /etc/asterisk /var/lib/asterisk /var/log/asterisk /var/spool/asterisk
# Servicio systemd
sudo systemctl enable asterisk
sudo systemctl start asterisk
Configuración Básica
/etc/asterisk/asterisk.conf
[directories]
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk
[options]
verbose = 3
debug = 3
documentation_language = en_US
/etc/asterisk/sip.conf
[general]
context = default
allowoverlap = no
allowguest = no
alwaysauthreject = yes
musiconhold = default
mohinterpret = default
mohsuggest = default
; RTP Configuration
rtpstart = 10000
rtpend = 20000
; SIP Configuration
bindport = 5060
bindaddr = 0.0.0.0
srvlookup = yes
disallow = all
allow = ulaw
allow = alaw
allow = g729
; NAT Configuration
nat = force_rport,comedia
externip = TU_IP_PUBLICA
localnet = 192.168.1.0/255.255.255.0
[template_phone](!)
type = friend
host = dynamic
qualify = yes
canreinvite = no
context = internal
disallow = all
allow = ulaw
allow = alaw
; Extensiones SIP
[1001](template_phone)
secret = password123
callerid = "Usuario 1" <1001>
[1002](template_phone)
secret = password456
callerid = "Usuario 2" <1002>
[1003](template_phone)
secret = password789
callerid = "Usuario 3" <1003>
Configuración del Dialplan
/etc/asterisk/extensions.conf
[globals]
CONSOLE = Console/dsp
TRUNK = SIP/trunk
[general]
static = yes
writeprotect = no
autofallthrough = yes
clearglobalvars = no
priorityjumping = no
[internal]
; Llamadas entre extensiones
exten => _1XXX,1,Dial(SIP/${EXTEN},20,tr)
exten => _1XXX,n,Voicemail(${EXTEN}@default,u)
exten => _1XXX,n,Hangup()
; Buzón de voz
exten => *98,1,VoiceMailMain(${CALLERID(num)}@default)
exten => *98,n,Hangup()
; Verificar buzón de voz de otra extensión
exten => _*98XXXX,1,VoiceMailMain(${EXTEN:3}@default)
exten => _*98XXXX,n,Hangup()
; Echo test
exten => 600,1,Answer()
exten => 600,n,Wait(1)
exten => 600,n,Playback(demo-echotest)
exten => 600,n,Echo()
exten => 600,n,Playback(demo-echodone)
exten => 600,n,Hangup()
; Conferencia
exten => 700,1,Answer()
exten => 700,n,Wait(1)
exten => 700,n,ConfBridge(conference)
exten => 700,n,Hangup()
[outgoing]
; Llamadas salientes (ejemplo)
exten => _9XXXXXXXXX,1,Dial(SIP/trunk/${EXTEN:1})
exten => _9XXXXXXXXX,n,Hangup()
; Llamadas de emergencia
exten => 911,1,Dial(SIP/trunk/911)
exten => 911,n,Hangup()
[incoming]
; Llamadas entrantes
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Background(welcome)
exten => s,n,WaitExten(10)
; Operadora
exten => 0,1,Dial(SIP/1001,20,tr)
exten => 0,n,Voicemail(1001@default,u)
exten => 0,n,Hangup()
; Directorio por nombre
exten => #,1,Directory(default,internal)
exten => #,n,Hangup()
Configuración de Buzón de Voz
/etc/asterisk/voicemail.conf
[general]
format = wav49|gsm
serveremail = asterisk@tudominio.com
attach = yes
skipms = 3000
maxsilence = 10
silencethreshold = 128
maxlogins = 3
emaildateformat = %A, %B %d, %Y at %r
emailsubject = [PBX] Nuevo mensaje de voz
emailbody = Estimado ${VM_NAME},\n\nHay un nuevo mensaje de voz en tu buzón:\n\n\tDe: ${VM_CALLERID}\n\tDuración: ${VM_DUR}\n\tFecha: ${VM_DATE}\n\nPuedes escucharlo marcando *98.\n\nSaludos.
[default]
1001 => 1234,Usuario Uno,user1@tudominio.com
1002 => 1234,Usuario Dos,user2@tudominio.com
1003 => 1234,Usuario Tres,user3@tudominio.com
Configuración de Conferencias
/etc/asterisk/confbridge.conf
[general]
[default_bridge]
type = bridge
max_members = 50
record_conference = no
[default_user]
type = user
quiet = no
startmuted = no
marked = no
end_marked = no
wait_marked = no
dsp_drop_silence = no
[admin_user](default_user)
admin = yes
marked = yes
Trunk SIP (Proveedor VoIP)
Configuración de trunk
; En sip.conf
[trunk](!)
type = peer
host = sip.proveedor.com
fromdomain = sip.proveedor.com
insecure = port,invite
canreinvite = no
context = incoming
disallow = all
allow = ulaw
allow = alaw
[mi-proveedor](trunk)
username = tu_usuario
secret = tu_password
fromuser = tu_usuario
Rutas salientes
; En extensions.conf - contexto outgoing
exten => _9XXXXXXXXX,1,Set(CALLERID(num)=TU_NUMERO)
exten => _9XXXXXXXXX,n,Dial(SIP/mi-proveedor/${EXTEN:1},30,tr)
exten => _9XXXXXXXXX,n,Hangup()
Seguridad
Configuración de firewall
# UFW rules
sudo ufw allow 5060/udp
sudo ufw allow 10000:20000/udp
# iptables rules
iptables -A INPUT -p udp --dport 5060 -j ACCEPT
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
Fail2ban para Asterisk
# /etc/fail2ban/jail.local
[asterisk]
enabled = true
port = 5060
protocol = udp
filter = asterisk
logpath = /var/log/asterisk/security
maxretry = 5
bantime = 86400
/etc/fail2ban/filter.d/asterisk.conf
[Definition]
failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
NOTICE.* <HOST> failed to authenticate as '.*'
NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
ignoreregex =
Monitoreo y Logs
Configuración de logs
; /etc/asterisk/logger.conf
[general]
dateformat = %F %T
[logfiles]
console => notice,warning,error
messages => notice,warning,error
security => security
Scripts de monitoreo
#!/bin/bash
# check_asterisk.sh
# Verificar estado del servicio
if ! systemctl is-active --quiet asterisk; then
echo "ERROR: Asterisk no está corriendo"
exit 1
fi
# Verificar canales activos
CHANNELS=$(asterisk -rx "core show channels" | grep "active call" | awk '{print $1}')
echo "Canales activos: $CHANNELS"
# Verificar peers SIP
PEERS=$(asterisk -rx "sip show peers" | grep "Monitored" | wc -l)
echo "Peers conectados: $PEERS"
# Verificar uso de memoria
MEMORY=$(ps aux | grep asterisk | grep -v grep | awk '{print $4}')
echo "Uso de memoria: $MEMORY%"
Optimización y Tuning
Configuración de sistema
# /etc/security/limits.conf
asterisk soft nofile 65536
asterisk hard nofile 65536
# /etc/sysctl.conf
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.udp_mem = 65536 131072 262144
Configuración Asterisk avanzada
; asterisk.conf
[options]
maxcalls = 1000
maxload = 1.0
cache_record_files = yes
record_cache_size = 1024
transmit_silence_during_record = yes
Comandos Útiles CLI
# Conectar a CLI
asterisk -r
# Comandos básicos
core show channels
sip show peers
sip show users
sip show registry
dialplan show
core reload
module reload
# Debug
sip set debug on
core set verbose 5
core set debug 5
# Información del sistema
core show version
core show uptime
core show channels count
Troubleshooting Común
Problemas de audio
- No hay audio: Verificar configuración NAT y RTP ports
- Audio cortado: Ajustar jitter buffer y QoS
- Echo: Configurar cancelación de eco
Problemas de registro
- Falla autenticación: Verificar username/password
- No encuentra peer: Revisar configuración SIP
- Timeout: Verificar conectividad de red
Backup y Mantenimiento
Script de backup
#!/bin/bash
BACKUP_DIR="/backup/asterisk"
DATE=$(date +%Y%m%d_%H%M%S)
# Crear directorio
mkdir -p $BACKUP_DIR
# Backup de configuración
tar -czf $BACKUP_DIR/asterisk_config_$DATE.tar.gz /etc/asterisk/
# Backup de buzones de voz
tar -czf $BACKUP_DIR/asterisk_voicemail_$DATE.tar.gz /var/spool/asterisk/voicemail/
# Backup de base de datos
sudo -u asterisk sqlite3 /var/lib/asterisk/astdb.sqlite3 ".backup $BACKUP_DIR/astdb_$DATE.sqlite3"
# Limpiar backups antiguos (30 días)
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
find $BACKUP_DIR -name "*.sqlite3" -mtime +30 -delete
Conclusión
Asterisk es una plataforma poderosa y flexible para implementar soluciones de telefonía. Con esta configuración básica, tendrás un PBX funcional que puedes expandir según tus necesidades específicas.
Próximos pasos
- Configurar interfaz web (FreePBX)
- Implementar grabación de llamadas
- Integrar con CRM
- Configurar rutas de failover
- Implementar métricas y alertas
¿Necesitas ayuda con la implementación de Asterisk en tu organización? Contáctanos para consultoría especializada.