Enviado por admin el
La implementación de Asterisk en entornos cloud se ha convertido en una alternativa cada vez más atractiva para empresas que buscan flexibilidad y escalabilidad en sus sistemas de comunicaciones. Con el lanzamiento de Asterisk 20 LTS en octubre de 2022 y su soporte extendido hasta 2026, contamos con una plataforma madura y robusta que aprovecha al máximo las capacidades del canal PJSIP, el cual ha reemplazado definitivamente al antiguo chan_sip que fue eliminado en esta versión.
La migración hacia arquitecturas cloud no solo representa un cambio de ubicación física de los servidores sino una transformación completa en la manera de diseñar, desplegar y mantener sistemas de telefonía IP. Asterisk 20 viene optimizado para estos escenarios con mejoras significativas en el manejo de conexiones remotas, NAT traversal y codecs de alta eficiencia como Opus que reduce considerablemente el consumo de ancho de banda sin sacrificar calidad de audio.
Preparando el Entorno Cloud
Antes de lanzarnos a la instalación necesitamos seleccionar el proveedor cloud adecuado. Amazon AWS, Google Cloud Platform, Microsoft Azure y DigitalOcean son opciones populares que ofrecen diferentes ventajas. Para un deployment típico de Asterisk recomiendo una instancia con al menos 2 vCPUs y 4GB de RAM aunque esto variará según el volumen de llamadas concurrentes esperado. Un servidor con estas características puede manejar cómodamente entre 50 y 100 llamadas simultáneas dependiendo de los codecs utilizados y la complejidad del dialplan.
La elección del sistema operativo es crucial y para Asterisk 20 las distribuciones más recomendadas son Ubuntu 22.04 LTS o Debian 12 que ofrecen soporte de largo plazo y excelente compatibilidad con las dependencias necesarias. Rocky Linux 9 o AlmaLinux 9 son alternativas sólidas si prefieres el ecosistema Red Hat. Personalmente trabajo mucho con AlmaLinux por su estabilidad en entornos de producción aunque Ubuntu facilita más la instalación de paquetes adicionales.
Una vez seleccionada la instancia el primer paso es asegurar el sistema operativo. Configurar el firewall es absolutamente crítico porque expondrás puertos RTP y SIP directamente a internet. Con UFW en Ubuntu o firewalld en sistemas basados en Red Hat debes permitir únicamente los puertos necesarios: 5060 UDP para SIP, 5061 TCP para SIP sobre TLS y el rango 10000-20000 UDP para RTP. Nunca abras rangos de puertos más amplios de los necesarios porque te expones a ataques de flooding y escaneos maliciosos.
Instalación de Asterisk 20
La instalación desde código fuente nos da control total sobre los módulos compilados y optimizaciones específicas para nuestro hardware. Primero instalamos las dependencias necesarias que en Ubuntu serían algo como apt-get install build-essential libssl-dev libncurses-dev libnewt-dev libxml2-dev libsqlite3-dev uuid-dev libjansson-dev y luego descargamos el tarball desde el sitio oficial de Asterisk.
El proceso de compilación comienza con el script configure que detecta las librerías disponibles en el sistema. Aquí es importante ejecutar contrib/scripts/install_prereq install para asegurarnos de tener todas las dependencias. Luego con make menuselect accedemos a una interfaz que permite seleccionar exactamente qué módulos queremos compilar. Para un deployment cloud enfocado en PJSIP debemos asegurarnos de incluir res_pjsip y todos sus módulos relacionados como res_pjsip_endpoint_identifier_ip, res_pjsip_outbound_registration y res_pjsip_nat.
Un aspecto que muchos pasan por alto es la optimización del compilador. Si agregas CFLAGS como -march=native -O3 durante el configure puedes obtener mejoras de rendimiento del 10 al 15 por ciento aunque esto hace que el binario resultante solo funcione en CPUs similares a donde fue compilado. En cloud esto generalmente no es problema porque conoces exactamente el hardware subyacente de tu proveedor.
Configuración de PJSIP
El canal PJSIP representa una evolución completa respecto a chan_sip con mejor manejo de NAT, soporte nativo para múltiples transports en paralelo y una arquitectura modular mucho más limpia. La configuración se centraliza en pjsip.conf aunque también puedes usar archivos separados con la directiva include.
Empecemos con la configuración de transport que define cómo Asterisk escuchará las conexiones SIP. Un transport básico UDP se vería así:
[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=10.0.0.0/8
local_net=172.16.0.0/12
local_net=192.168.0.0/16
Las directivas external_media_address y external_signaling_address son fundamentales en cloud porque permiten que Asterisk anuncie correctamente su IP pública en los mensajes SIP mientras escucha en su IP privada interna. El parámetro local_net indica qué redes considera locales para aplicar las transformaciones NAT necesarias.
Para endpoints que se conectan desde internet como softphones móviles o teléfonos remotos necesitas configurar cada uno con su propia sección. Un ejemplo completo sería:
[6001]
type=endpoint
context=from-internal
disallow=all
allow=opus
allow=g722
allow=ulaw
auth=6001
aors=6001
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
ice_support=yes
[6001]
type=auth
auth_type=userpass
password=TuPasswordSeguro123
username=6001
[6001]
type=aor
max_contacts=3
remove_existing=yes
qualify_frequency=60
La sección endpoint define las características del dispositivo permitiendo los codecs Opus G722 y ulaw en orden de preferencia. El parámetro direct_media=no fuerza que todo el audio RTP pase por Asterisk en lugar de establecer conexión directa entre endpoints lo cual es necesario cuando tienes NAT de por medio. Las opciones rtp_symmetric force_rport y rewrite_contact trabajan juntas para manejar correctamente el NAT reescribiendo direcciones según sea necesario.
La sección auth maneja la autenticación SIP digest y la sección aor o Address of Record mantiene el registro de dónde contactar al endpoint. El parámetro max_contacts=3 permite que el mismo usuario registre hasta tres dispositivos simultáneamente útil para quien tiene softphone en móvil PC y teléfono de escritorio. El qualify_frequency envía OPTIONS cada 60 segundos para verificar que el endpoint sigue accesible.
Configuración de Trunks SIP
Conectar Asterisk con proveedores de telefonía o carriers requiere configuración específica de trunks. La mayoría de proveedores modernos soportan autenticación por IP eliminando la necesidad de usuario y contraseña. Un trunk típico basado en IP se configuraría así:
[trunk-proveedor]
type=endpoint
context=from-trunk
disallow=all
allow=ulaw
allow=alaw
aors=trunk-proveedor
outbound_auth=trunk-proveedor
from_domain=sip.tuproveedor.com
[trunk-proveedor]
type=aor
contact=sip:sip.tuproveedor.com:5060
[trunk-proveedor]
type=auth
auth_type=userpass
username=tucuenta
password=tupassword
[trunk-proveedor]
type=identify
endpoint=trunk-proveedor
match=IP_DEL_PROVEEDOR
La sección identify permite que llamadas entrantes desde la IP del proveedor se asocien automáticamente con este endpoint sin necesidad de autenticación adicional. Esto es importante porque muchos carriers envían llamadas desde IPs diferentes a las que usas para originar.
Para trunks que requieren registro activo necesitas agregar una sección registration:
[trunk-proveedor]
type=registration
outbound_auth=trunk-proveedor
server_uri=sip:sip.tuproveedor.com
client_uri=sip:tucuenta@sip.tuproveedor.com
retry_interval=60
Esta configuración hace que Asterisk envíe REGISTER periódicamente manteniendo activo el trunk. El retry_interval define cada cuántos segundos reintenta si el registro falla.
Dialplan y Enrutamiento
El dialplan en extensions.conf es donde defines la lógica de llamadas. Para un sistema cloud típico con extensiones internas y salida a PSTN podrías estructurarlo así:
[from-internal]
exten => _6XXX,1,NoOp(Llamada interna a ${EXTEN})
same => n,Dial(PJSIP/${EXTEN},30)
same => n,Hangup()
exten => _9NXXNXXXXXX,1,NoOp(Llamada saliente a ${EXTEN:1})
same => n,Set(CALLERID(num)=TUNUMERO)
same => n,Dial(PJSIP/${EXTEN:1}@trunk-proveedor)
same => n,Hangup()
[from-trunk]
exten => _TUNUMERO,1,NoOp(Llamada entrante para ${EXTEN})
same => n,Dial(PJSIP/6001&PJSIP/6002,30)
same => n,VoiceMail(6001@default,u)
same => n,Hangup()
Este dialplan maneja tres escenarios: llamadas entre extensiones 6XXX marcan directamente a través de PJSIP, llamadas salientes que empiezan con 9 se enrutan al trunk removiendo el prefijo y llamadas entrantes que llegan desde el trunk hacen ring simultáneo en dos extensiones antes de ir a voicemail.
Para implementar IVR o menús interactivos puedes usar la aplicación Background que reproduce audio mientras espera entrada DTMF:
[from-trunk]
exten => _TUNUMERO,1,NoOp(Llamada entrante)
same => n,Answer()
same => n,Background(bienvenida)
same => n,WaitExten(5)
exten => 1,1,Dial(PJSIP/6001,30)
same => n,VoiceMail(6001@default,u)
exten => 2,1,Dial(PJSIP/6002,30)
same => n,VoiceMail(6002@default,u)
exten => i,1,Playback(opcion-invalida)
same => n,Goto(from-trunk,TUNUMERO,2)
exten => t,1,Playback(no-respuesta)
same => n,Hangup()
Seguridad y Hardening
Un Asterisk expuesto a internet requiere medidas de seguridad estrictas. Fail2ban es absolutamente esencial para bloquear IPs que intentan ataques de fuerza bruta. Configura un filtro específico para Asterisk que detecte intentos de autenticación fallidos en los logs:
[asterisk]
enabled = true
port = 5060,5061
protocol = all
filter = asterisk
logpath = /var/log/asterisk/security.log
maxretry = 3
bantime = 86400
En el archivo de filtro defines patrones regex que detectan líneas de log específicas indicando intentos fallidos. Con maxretry=3 bloqueas la IP después de tres intentos en el período findtime.
Dentro de Asterisk mismo activa el módulo res_security_log que registra eventos de seguridad relevantes en un log separado facilitando el monitoreo. En modules.conf asegúrate de tener:
load = res_security_log.so
Y en logger.conf agrega:
security.log => security
El uso de contraseñas fuertes es obvio pero frecuentemente ignorado. Para cada endpoint usa contraseñas de al menos 16 caracteres con combinación de letras números y símbolos. Nunca uses contraseñas basadas en el número de extensión como 6001pass porque son las primeras que prueban los atacantes.
Implementar TLS para cifrar la señalización SIP agrega una capa importante de seguridad especialmente si transmites datos sensibles. Primero generas certificados con OpenSSL o mejor aún usa Let's Encrypt para certificados válidos públicamente. Luego configuras un transport TLS en pjsip.conf:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
ca_list_file=/etc/asterisk/keys/ca.crt
method=tlsv1_2
Los endpoints que se conecten a este transport deben configurarse para usar transport=transport-tls en su sección endpoint.
Monitoreo y Optimización
En producción necesitas visibilidad constante del estado del sistema. El CLI de Asterisk ofrece comandos útiles como pjsip show endpoints que lista todos los endpoints y su estado de registro, o core show channels para ver llamadas activas en tiempo real. Estos comandos pueden automatizarse con scripts que ejecutan asterisk -rx "comando" y parsean la salida.
Para métricas más profundas el módulo res_statsd permite enviar estadísticas a servidores Grafana o Prometheus. Configuras en statsd.conf:
[general]
enabled = yes
server = localhost
port = 8125
prefix = asterisk
Esto enviará métricas como número de llamadas activas, uso de canales y estadísticas de calidad RTP que puedes visualizar en dashboards personalizados.
La calidad de las llamadas puede monitorearse activando rtcp en los endpoints con rtcp_mux=yes que multiplexa RTCP y RTP en el mismo puerto simplificando NAT. Los reportes RTCP incluyen datos de jitter pérdida de paquetes y latencia accesibles mediante pjsip show channel statistics.
Para optimizar rendimiento ajusta el número de threads que manejan tareas asíncronas en asterisk.conf:
[options]
minmemfree = 256
internal_timing = yes
cache_media_frames = yes
El parámetro minmemfree indica cuántos MB de RAM libre mantener antes de empezar a liberar cachés. Con cache_media_frames=yes Asterisk reutiliza estructuras de frames de audio reduciendo allocations y mejorando latencia.
Respaldo y Alta Disponibilidad
Un sistema de producción necesita estrategias de respaldo y recuperación. La configuración completa de Asterisk reside principalmente en /etc/asterisk y las grabaciones de voicemail en /var/spool/asterisk. Un script de backup simple podría usar rsync para copiar estos directorios a almacenamiento remoto:
#!/bin/bash
BACKUP_DIR="/backup/asterisk-$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
rsync -av /etc/asterisk/ $BACKUP_DIR/etc/
rsync -av /var/spool/asterisk/ $BACKUP_DIR/spool/
tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR
rm -rf $BACKUP_DIR
Ejecutado diariamente mediante cron mantiene copias comprimidas de la configuración. Para alta disponibilidad puedes implementar un cluster activo-pasivo donde dos servidores Asterisk comparten una IP virtual mediante keepalived o Pacemaker. El servidor pasivo monitorea el activo y asume la IP si detecta falla.
Una alternativa más sofisticada usa Kamailio como balanceador SIP delante de múltiples instancias Asterisk distribuyendo carga entre ellas. Kamailio maneja el registro de endpoints y enruta llamadas al Asterisk con menos carga o siguiente disponible si uno falla.
Integración con WebRTC
Asterisk 20 con PJSIP ofrece soporte robusto para WebRTC permitiendo que navegadores web se comuniquen directamente sin plugins. Configuras un transport específico para WebRTC:
[transport-wss]
type=transport
protocol=wss
bind=0.0.0.0:8089
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
Los endpoints WebRTC requieren configuración especial habilitando codecs compatibles y protocolos de cifrado:
[webrtc-6001]
type=endpoint
context=from-internal
disallow=all
allow=opus
allow=vp8
auth=webrtc-6001
aors=webrtc-6001
webrtc=yes
transport=transport-wss
use_avpf=yes
media_encryption=dtls
dtls_cert_file=/etc/asterisk/keys/asterisk.crt
dtls_private_key=/etc/asterisk/keys/asterisk.key
dtls_setup=actpass
El parámetro webrtc=yes activa automáticamente varios ajustes necesarios como uso de ICE para NAT traversal y habilitación de RTCP feedback. Con media_encryption=dtls el audio se cifra end-to-end usando DTLS-SRTP.
Para que clientes web se conecten necesitas implementar un servidor WebSocket que traduzca entre HTTP/WebSocket y SIP nativo. Librerías como JsSIP en JavaScript facilitan esto enormemente manejando la complejidad del protocolo SIP desde el navegador.
Casos de Uso Avanzados
En escenarios empresariales complejos Asterisk 20 puede integrarse con CRMs y sistemas de tickets mediante AMI o Asterisk Management Interface. AMI permite control externo completo de Asterisk pudiendo originar llamadas monitorear eventos y modificar configuración en tiempo real. Un script Python usando la librería Panoramisk puede suscribirse a eventos de llamada y actualizar registros CRM automáticamente.
La grabación selectiva de llamadas implementada mediante MixMonitor en el dialplan permite cumplir requerimientos de compliance grabando solo llamadas específicas según criterios como destino origen o extensión:
exten => _9NXXNXXXXXX,1,NoOp(Llamada saliente)
same => n,Set(CALLFILE=/var/spool/asterisk/monitor/${UNIQUEID}.wav)
same => n,MixMonitor(${CALLFILE},b)
same => n,Dial(PJSIP/${EXTEN:1}@trunk-proveedor)
Para contact centers implementa colas de llamadas con queue.conf asignando agentes dinámicamente y distribuyendo llamadas según estrategias como ringall leastrecent o random. Las métricas de cola accesibles vía AMI alimentan dashboards en tiempo real mostrando llamadas esperando tiempo promedio de espera y estado de agentes.
La implementación de Asterisk en cloud representa una solución madura y escalable que con la versión 20 y el canal PJSIP ofrece todas las capacidades necesarias para sistemas empresariales modernos. La flexibilidad de deployment la reducción de costos de hardware y la facilidad de escalamiento hacen que cada vez más organizaciones migren sus comunicaciones a arquitecturas cloud basadas en esta plataforma probada y confiable.
Comentarios recientes