Artículos / Configuración de Asterisk para Telefonía VoIP

Configuración de Asterisk para Telefonía VoIP

Configuración de Asterisk para Telefonía VoIP

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

  1. No hay audio: Verificar configuración NAT y RTP ports
  2. Audio cortado: Ajustar jitter buffer y QoS
  3. Echo: Configurar cancelación de eco

Problemas de registro

  1. Falla autenticación: Verificar username/password
  2. No encuentra peer: Revisar configuración SIP
  3. 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

  1. Configurar interfaz web (FreePBX)
  2. Implementar grabación de llamadas
  3. Integrar con CRM
  4. Configurar rutas de failover
  5. Implementar métricas y alertas

¿Necesitas ayuda con la implementación de Asterisk en tu organización? Contáctanos para consultoría especializada.

Volver a Artículos