Qué es Asterisk y qué no es
El proyecto se describe a sí mismo como "an Open Source PBX and telephony toolkit" (una central telefónica PBX y un conjunto de herramientas de telefonía de código abierto) y, de forma más útil, como "middleware between Internet and telephony channels on the bottom, and Internet and telephony applications at the top" (middleware entre los canales de Internet y telefonía abajo, y las aplicaciones de Internet y telefonía arriba).2 Su documentación define el propósito como "being an engine for building Real Time Communication systems and applications" (ser un motor para construir sistemas y aplicaciones de comunicación en tiempo real).5
En términos de SIP, Asterisk es un agente de usuario back-to-back (B2BUA). La documentación de Asterisk no usa esa frase, pero su propia descripción de una llamada es la definición. Cuando un teléfono llama a otro, "The inbound channel is created from Alice's phone calling Asterisk" (el canal entrante se crea cuando el teléfono de Alice llama a Asterisk), luego "Asterisk then calls the extension dialed by Alice by creating an outbound channel to talk to Bob" (Asterisk llama a la extensión marcada creando un canal saliente hacia Bob), y los dos canales se colocan en un puente.7 La RFC 3261 define un B2BUA como una entidad que "receives a request and processes it as a user agent server" (recibe una solicitud y la procesa como servidor de agente de usuario) y luego "acts as a user agent client (UAC) and generates requests" (actúa como cliente de agente de usuario y genera solicitudes); "Unlike a proxy server, it maintains dialog state and must participate in all requests sent on the dialogs it has established" (a diferencia de un servidor proxy, mantiene el estado del diálogo y debe participar en todas las solicitudes enviadas en los diálogos que ha establecido).1
Ese único hecho explica casi todo lo que Asterisk hace bien y mal. Como termina ambos tramos, puede contestar una llamada, reproducir un mensaje, recoger dígitos, grabar, transcodificar, hacer conferencias y poner personas en espera: es tanto un servidor de medios como un elemento de señalización. Como guarda estado, y normalmente el audio, de cada llamada, no es la herramienta para enrutar grandes cantidades de registros o de llamadas que nunca necesita tocar. Ese trabajo corresponde a proxies SIP como Kamailio y OpenSIPS, y un patrón común en producción es un proxy en el borde con Asterisk detrás, haciendo el trabajo de medios.
Nuestra opinión: si su problema es "contestar llamadas, ofrecer un menú telefónico, hacer sonar teléfonos y tomar mensajes de voz", Asterisk fue diseñado exactamente para eso. Si su problema es "enrutar un millón de registros", es la capa equivocada, y ningún ajuste cambia lo que es un B2BUA.
Licencia y administración del proyecto
Asterisk "is distributed under the GNU General Public License version 2 and is also available under alternative licenses negotiated directly with Sangoma US Inc." (se distribuye bajo la licencia GPL versión 2 y también está disponible bajo licencias alternativas negociadas directamente con Sangoma US Inc.).3 Dos consecuencias del archivo de licencia importan en la práctica:
- Los módulos cargables están cubiertos. "If you obtained Asterisk under the GPL, then the GPL applies to all loadable Asterisk modules used on your system as well" (si obtuvo Asterisk bajo la GPL, la GPL se aplica también a todos los módulos cargables de Asterisk que use en su sistema), con las excepciones que enumera el archivo. Sangoma, que "holds copyright and/or sufficient licenses to all components" (posee los derechos de autor o licencias suficientes sobre todos los componentes), puede otorgar permiso para módulos propietarios.3
- Las aplicaciones externas no. Para AMI, AGI y ARI, el archivo dice "It is our belief that applications using these protocols to manage or control an Asterisk instance do not have to be licensed under the GPL" (creemos que las aplicaciones que usan estos protocolos para administrar o controlar una instancia de Asterisk no tienen que licenciarse bajo la GPL), y agrega una concesión de respaldo por si un tribunal opinara distinto.3 Por eso la mayoría de los productos comerciales construidos sobre Asterisk dejan su lógica en un proceso externo que habla ARI o AMI, y no en un módulo en C.
El nombre "Asterisk" y sus logotipos son marcas de Sangoma.3 En asterisk.org, Sangoma se describe como "the primary sponsor and developer of Asterisk" (el principal patrocinador y desarrollador de Asterisk) y vende soporte; su nivel más alto "requires the utilization of Certified Asterisk" (exige el uso de Certified Asterisk), una línea de versiones separada y de larga duración.4
Los conceptos centrales: canales, puentes y plan de marcado
Asterisk es un núcleo pequeño más muchos módulos. "The heart of any Asterisk system is the core" (el corazón de todo sistema Asterisk es el núcleo), que "reads the configuration files, including dialplan and loads all the other modules" (lee los archivos de configuración, incluido el plan de marcado, y carga todos los demás módulos); "Other than functionality provided by the core of Asterisk, modules provide all other functionality" (aparte de lo que ofrece el núcleo, los módulos aportan todo lo demás).5 Cinco ideas sostienen el resto.
Canales. "A channel is an entity inside Asterisk that acts as a channel of communication between Asterisk and another device" (un canal es una entidad dentro de Asterisk que actúa como canal de comunicación entre Asterisk y otro dispositivo).7 Una llamada entre dos partes son dos canales. Cada uno tiene sus propias variables, identificador de llamada y estado, y cada uno puede colgarse, redirigirse o grabarse por separado.
Controladores de canal. "Channel Drivers provide channels in Asterisk" (los controladores de canal proporcionan canales en Asterisk)7; traducen la señalización de un dispositivo para el núcleo.6 En el árbol de código actual los controladores son chan_pjsip (SIP), chan_iax2 (IAX2), chan_dahdi (tarjetas de telefonía analógica y digital), chan_websocket, chan_audiosocket, chan_rtp, chan_bridge_media, chan_motif (XMPP/Jingle), chan_unistim y chan_console.13 chan_sip, chan_skinny y chan_mgcp ya no existen; la sección sobre chan_sip más abajo indica las versiones.
Puentes. "In Asterisk, a bridge is the construct that shares media among Channels" (en Asterisk, un puente es la construcción que comparte medios entre canales). Hay dos categorías: de dos partes y multipartes. Un puente de núcleo (core bridge) es "the basic two-party bridge" (el puente básico de dos partes), donde Asterisk maneja el audio y puede transcodificar, grabar y ejecutar funciones DTMF. Un puente nativo ocurre "when both participants in a two-party bridge have similar channel technologies" (cuando ambos participantes de un puente de dos partes usan tecnologías de canal similares); la variante remota envía el audio directamente entre los dispositivos, solo es posible con canales SIP y se limita a los casos en que ninguno de los dos dispositivos está detrás de NAT. Los puentes de mezcla sirven a las conferencias; los puentes de espera (holding) son una sala de espera donde los participantes no pueden intercambiar audio. Asterisk "will automatically choose the best mixing technology available based on the channels in the bridge" (elegirá automáticamente la mejor tecnología de mezcla disponible según los canales del puente) y puede cambiarla en medio de la llamada, por ejemplo cuando una transferencia asistida convierte una llamada de dos partes en una de tres.8 Las implementaciones están en el código fuente como bridge_simple, bridge_native_rtp, bridge_softmix y bridge_holding.16
El plan de marcado (dialplan). "The core loads and builds the dialplan, which is the logic of any Asterisk system" (el núcleo carga y construye el plan de marcado, que es la lógica de todo sistema Asterisk).5 Vive en extensions.conf y es "essentially a scripting language specific to Asterisk" (en esencia, un lenguaje de scripts específico de Asterisk).10 Se organiza en contextos ("the basic organizational unit", la unidad básica de organización), cada uno con extensiones ("a named set of actions", un conjunto de acciones con nombre), y cada extensión se compone de prioridades numeradas que se ejecutan en orden. Debe declarar la prioridad 1 de forma explícita; después, n significa "the previous priority number plus one" (el número de la prioridad anterior más uno), y same => evita repetir la extensión.11 Los patrones empiezan con un guion bajo: X es cualquier dígito, Z es del 1 al 9, N es del 2 al 9, y el punto y el signo de exclamación coinciden con el resto de la cadena. La documentación advierte que estos dos últimos "match more than just digits. They match on characters" (coinciden con más que dígitos: coinciden con caracteres), lo cual importa para la seguridad.12
Aplicaciones y funciones. Las aplicaciones hacen cosas con un canal: contestarlo, reproducir un mensaje, marcar. Las funciones leen o establecen datos del canal, como el identificador de llamada saliente.6 En el plan de marcado, Dial() es una aplicación y ${CALLERID(num)} es una función.
Debajo está el bus de mensajes Stasis, agregado en Asterisk 12: "an internal publish/subscribe message bus" (un bus interno de mensajes de publicación y suscripción). Antes, los componentes del núcleo eran "responsible for updating AMI, the CDR Engine, and other modules" (responsables de actualizar AMI, el motor de CDR y otros módulos); después, "the logic for AMI, CDRs, and other consumers of state is no longer tightly coupled with the real-time components" (la lógica de AMI, los CDR y otros consumidores de estado ya no está estrechamente acoplada a los componentes de tiempo real).9 El mismo nombre aparece en la aplicación de plan de marcado Stasis que usa ARI, tratada más abajo.
Módulos y el cargador de módulos
La documentación enumera nueve tipos de módulo: controladores de canal, aplicaciones del plan de marcado, funciones del plan de marcado, recursos (servicios compartidos como música en espera y estacionamiento de llamadas), códecs, controladores de formatos de archivo, controladores de CDR, controladores de CEL (que registran "what happened inside of Asterisk during a particular call", lo que sucedió dentro de Asterisk durante una llamada) y controladores de puentes.6 En el árbol de código, el nombre del archivo indica el tipo: los archivos chan_ en channels/, bridge_ en bridges/ y res_ en res/.131653
modules.conf controla la carga. El archivo de ejemplo trae autoload=yes, es decir, se carga todo módulo instalado en el directorio de módulos salvo que usted indique noload. También documenta require ("Asterisk will exit with a status code of 2 if a required module does not load", Asterisk terminará con código de estado 2 si un módulo requerido no se carga) y dice sobre el viejo truco de preload: "There is no good reason left to use 'preload' anymore" (ya no queda ninguna buena razón para usar preload).17
No todos los módulos reciben el mismo mantenimiento. Los estados de soporte de la documentación son core ("supported by both Sangoma and the community", con soporte de Sangoma y de la comunidad), extended ("supported by the Asterisk community, and may or may not have an active developer", con soporte de la comunidad, y puede tener o no un desarrollador activo; sin corrección de errores por parte de Sangoma) y deprecated ("The module will remain in the tree, but there is a better way to do it", el módulo seguirá en el árbol, pero hay una mejor manera de hacerlo). Los módulos obsoletos no se compilan a menos que se seleccionen explícitamente en menuselect.18
Nuestra opinión: en un servidor de producción, convierta autoload en una lista explícita o, como mínimo, aplique noload a todo controlador de canal e interfaz que no use. Menos módulos cargados significa una superficie de ataque menor, un arranque más rápido y menos sorpresas después de una actualización. Agregue require = chan_pjsip.so, para que una compilación defectuosa falle de forma visible en lugar de iniciar una central que no puede recibir llamadas.
PJSIP: chan_pjsip, res_pjsip y los objetos
SIP en el Asterisk moderno son dos capas. El controlador de canal es "chan_pjsip which depends on res_pjsip and its many associated modules" (chan_pjsip, que depende de res_pjsip y de sus muchos módulos asociados); "The res_pjsip module handles configuration" (el módulo res_pjsip maneja la configuración), que se lee de pjsip.conf.22 Funciones como el registro saliente, la identificación por IP y las ACL son módulos res_pjsip_* independientes, cada uno con su propia referencia de configuración.22 Debajo de ambos está la pila SIP PJPROJECT; como la compilación usa de forma predeterminada la copia incluida ("Use bundled pjproject libraries (default)" en configure.ac), normalmente nunca la instala por separado.60
Donde chan_sip tenía una sección [peer] o [friend] por dispositivo, PJSIP divide un dispositivo en varios objetos vinculados.35 Esta es la parte que más confunde, y vale la pena aprenderla bien, porque todo problema de PJSIP es un problema con uno de estos vínculos.
Objeto (type=) | Qué es | Se vincula con |
|---|---|---|
| transport | Cómo res_pjsip "will operate at the transport layer" (operará en la capa de transporte): protocolo, dirección de enlace y direcciones NAT. Los protocolos son udp, tcp, tls, ws, wss y flow.2329 | Lo usan los endpoints y los registros. Puede haber varios, pero no dos en la misma IP y puerto, ni en la misma IP y protocolo.23 |
| endpoint | El perfil de un dispositivo o proveedor: códecs, contexto, comportamiento de NAT y de medios. "Without an AOR, an endpoint can't be contacted" (sin un AOR, no se puede contactar a un endpoint).23 | Cero o más AOR, una autenticación entrante (auth), autenticación saliente mediante outbound_auth y un transporte.2327 |
| aor | Address of record (dirección de registro): "tell Asterisk where an endpoint can be contacted" (indica a Asterisk dónde se puede contactar a un endpoint), ya sea por registros o con un contact= estático.23 | Muchos endpoints con muchos AOR; cada AOR contiene contactos.23 |
| contact | Un URI SIP donde se puede localizar al AOR. Lo crea un REGISTER o el parámetro contact= del AOR.23 | Pertenece a los AOR.23 |
| auth | Credenciales "related to inbound or outbound authentication" (relacionadas con la autenticación entrante o saliente).23 | Las puede compartir cualquier cantidad de endpoints o registros.23 |
| identify | Le indica a res_pjsip_endpoint_identifier_ip a qué endpoint pertenece una solicitud entrante, por dirección de origen o por encabezado.2328 | Apunta a cero o un endpoint.23 |
| registration | Un REGISTER saliente hacia el registrador de un proveedor.2325 | Cero o una autenticación, al menos un transporte. Sin vínculo con un endpoint.23 |
Deslice la tabla hacia los lados para ver todas las columnas.
Esa última fila es la trampa clásica. La documentación del registro saliente dice que el registro y el endpoint "are considered completely separate from each other, as far as Asterisk is concerned" (se consideran completamente independientes, en lo que respecta a Asterisk), y que para recibir llamadas "you will need to set up an endpoint that represents this provider" (necesitará configurar un endpoint que represente a este proveedor).25 Una troncal que se registra con éxito pero rechaza todas las llamadas entrantes casi siempre es un registro sin el endpoint y el identify correspondientes.
Objetos más pequeños completan el conjunto: domain_alias, acl (que "operates on all inbound SIP communication", opera sobre toda la comunicación SIP entrante, independientemente de los endpoints) y las secciones system y global.23
Cómo decide Asterisk quién está llamando
Toda solicitud SIP entrante debe asociarse con un endpoint antes de que ocurra cualquier otra cosa. El orden lo fija endpoint_identifier_order en la sección global, y el valor predeterminado compilado es ip,username,anonymous.3031
- ip usa objetos
identify.matchacepta "a comma-delimited list of IP addresses or hostnames" (una lista de direcciones IP o nombres de host separados por comas), con máscaras CIDR o decimales con puntos; para un nombre de host, "Asterisk will resolve the hostname and add all A and AAAA records" (Asterisk resolverá el nombre de host y agregará todos los registros A y AAAA).match_headercompara con el valor de un encabezado SIP.28 - username compara "the username and domain in the From header" (el nombre de usuario y el dominio del encabezado From), y reintenta solo con el nombre de usuario si falla la coincidencia exacta. La opción
identify_byde cada endpoint (predeterminadausername,ip) decide qué métodos acepta el endpoint, y también rige la coincidencia de AOR en los registros: "You must list at least one method that also matches for AORs or the registration will fail" (debe indicar al menos un método que también coincida con los AOR, o el registro fallará).2927 - auth_username existe, pero tiene un costo de seguridad documentado: el encabezado Authorization no está presente en la primera solicitud, por lo que el evento de seguridad de una solicitud sin coincidencia debe diferirse, lo que "may result in a delay before an attack is recognized" (puede retrasar el reconocimiento de un ataque).29
- anonymous: "By default anonymous inbound calls via PJSIP are not allowed" (de forma predeterminada no se permiten llamadas anónimas entrantes por PJSIP). Para aceptarlas debe definir un endpoint llamado
anonymous, y el archivo de ejemplo lo dice sin rodeos: "It is not recommended to accept anonymous calls" (no se recomienda aceptar llamadas anónimas).31
Dos valores predeterminados merecen atención. Un endpoint sin context cae en el contexto llamado default.27 Y el max_contacts de un AOR es 0 de forma predeterminada, así que un teléfono no puede registrarse hasta que usted lo aumente; la referencia indica que, para "stick with the older chan_sip behaviour" (mantener el comportamiento anterior de chan_sip), se establece en 1 con remove_existing=yes.29
El contexto en el que cae un endpoint es todo lo que ese endpoint puede marcar. Dé a las troncales un contexto que solo llegue a sus números entrantes, dé a los teléfonos un contexto que pueda llegar al exterior, y nunca deje que ninguno de los dos caiga en default. La guía de seguridad y operaciones de esta sección trata el endurecimiento en profundidad.
chan_sip ya no existe: obsoleto en la 17, eliminado en la 21
El antiguo controlador SIP quedó obsoleto en Asterisk 17 (lanzado en octubre de 2019) y fue "officially removed in Asterisk 21" (eliminado oficialmente en Asterisk 21), que salió en 2023.2120 La tabla de obsolescencia de módulos registra lo mismo, junto con las demás eliminaciones de la 21: app_macro (obsoleto en la 16) y chan_skinny y chan_mgcp (obsoletos en la 19).19 Se puede ver en el árbol: chan_sip.c está en el directorio de canales de la rama 20 y ausente en la rama 21.1415
En la práctica: Asterisk 20 es la última serie que contiene chan_sip, y pasó a recibir solo correcciones de seguridad el 19 de octubre de 2026.55 Un sistema que siga con chan_sip tiene, como máximo, un año de correcciones de seguridad antes de ejecutar software sin soporte. El proyecto incluye un convertidor, sip_to_pjsip.py en contrib/scripts/sip_to_pjsip, pero aclara que "is not intended to work for every scenario or configuration" (no pretende funcionar en todos los escenarios o configuraciones).35 Busque también en el plan de marcado las llamadas Dial(SIP/...): pasan a ser cadenas de marcado PJSIP/, cuya sintaxis es distinta (siguiente sección).
Un pjsip.conf que funciona: una troncal y un teléfono
El siguiente ejemplo sigue la estructura de los ejemplos oficiales24 con los ajustes de NAT de la guía de NAT26 y una plantilla para teléfonos. Los nombres de sección pueden repetirse entre tipos ([itsp] aparece cuatro veces), que es también como están escritos los ejemplos oficiales.24
; /etc/asterisk/pjsip.conf -- one SIP trunk and one desk phone
; Addresses are documentation ranges (RFC 5737); numbers are fictional 555-01xx.
;================ TRANSPORT
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=192.168.10.0/24 ; the office LAN: no NAT rewriting here
external_media_address=203.0.113.10 ; public IP written into SDP for outside peers
external_signaling_address=203.0.113.10
;================ TRUNK: an ITSP that wants a REGISTER and digest auth
[itsp]
type=registration
transport=transport-udp
outbound_auth=itsp-auth
server_uri=sip:sip.example.net
client_uri=sip:[email protected]
contact_user=5145550100 ; becomes the extension calls arrive on
retry_interval=60
[itsp-auth]
type=auth
auth_type=digest ; current name; older samples say userpass
username=5145550100
password=use-a-long-random-secret
[itsp]
type=aor
contact=sip:sip.example.net:5060 ; where outbound calls are sent
qualify_frequency=60 ; check reachability; 0 (the default) never qualifies
[itsp]
type=endpoint
transport=transport-udp
context=from-itsp ; inbound calls start in this context
disallow=all
allow=ulaw
outbound_auth=itsp-auth ; answer the provider's 401 challenges
aors=itsp
direct_media=no ; keep Asterisk in the media path
[itsp]
type=identify ; requests from these addresses ARE the trunk
endpoint=itsp
match=sip.example.net ; resolved to every A/AAAA record; IPs/CIDR also accepted
;================ PHONES: a template, then one section set per phone
[phone-defaults](!)
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=ulaw
direct_media=no
rtp_symmetric=yes ; send RTP back where it came from
force_rport=yes
rewrite_contact=yes ; trust the observed source address (NAT)
[6001](phone-defaults)
auth=6001-auth
aors=6001
callerid="Front desk" <6001>
[6001-auth]
type=auth
auth_type=digest
username=6001
password=another-long-random-secret
[6001]
type=aor
max_contacts=1 ; default is 0: registrations refused
remove_existing=yes ; a re-registration replaces the old contact
Notas sobre las decisiones, cada una verificada contra la referencia:
- NAT.
local_netes "the IP network that we want to consider our local network" (la red IP que queremos considerar nuestra red local);external_media_addressyexternal_signaling_addressson la dirección pública usada para RTP y para SIP hacia todo lo que esté fuera de ella.26rtp_symmetricsignifica "Send RTP back to the same address/port we received it from" (enviar el RTP de vuelta a la misma dirección y puerto de los que lo recibimos);rewrite_contactenvía las solicitudes a la dirección de origen observada en lugar de la anunciada.26 Su valor predeterminado es no, yforce_rporttiene como predeterminado yes.27 direct_mediaes yes de forma predeterminada.27 La documentación de puentes señala que el audio solo puede fluir directamente entre dispositivos cuando ninguno está detrás de NAT.8 En nuestra experiencia, dejar el valor predeterminado con teléfonos detrás de NAT es la causa más común del audio en un solo sentido. Establecerlo en no mantiene a Asterisk en la ruta del audio, como lo hace el ejemplo de la guía de NAT.26auth_type=digest. La referencia actual hace dedigestel valor predeterminado y presenta los valores anterioresuserpassymd5como "Deprecated. Use digest" (obsoleto, use digest); el mismo texto está en las ramas 20 y 22.29 La mayoría de los ejemplos en línea, incluidos los oficiales, todavía dicenuserpass.24 Sigue funcionando porque se convierte, pero escriba la forma actual.- Plantillas.
[phone-defaults](!)define una plantilla;[6001](phone-defaults)hereda de ella, y una sección puede indicar varias plantillas.3637 Si lo prefiere,res_pjsip_config_wizardconstruye los mismos objetos a partir de una sola seccióntype=wizardenpjsip_wizard.conf, y genera por usted los objetos endpoint, AOR, auth, registration e identify.33 - Códecs. Nuestra opinión: un solo códec, G.711 μ-law, es el punto de partida seguro para una troncal norteamericana; agregue otros solo cuando ambos lados los necesiten, porque cada códec adicional es otra forma de que la negociación termine en transcodificación.
Una vez cargado, los comandos de la guía de solución de problemas verifican cada vínculo de la tabla anterior: pjsip show endpoints confirma que el endpoint se cargó, pjsip show endpoint itsp muestra su AOR, autenticación, transporte e identify, pjsip show aor 6001 muestra si el contacto de un teléfono está vinculado y pjsip set logger on imprime el propio tráfico SIP.32
Un extensions.conf mínimo
El plan de marcado que acompaña al anterior. Dial(PJSIP/6001) hace sonar los contactos del AOR con el mismo nombre que el endpoint; Dial(PJSIP/number@itsp) envía el número al contacto del AOR itsp, y la parte de usuario se toma de la cadena de marcado.34 Si un teléfono puede registrarse desde varios dispositivos, ${PJSIP_DIAL_CONTACTS(6001)} los hace sonar todos a la vez.34
; /etc/asterisk/extensions.conf -- the smallest useful dialplan for the config above
[from-itsp]
; Calls from the provider arrive on the contact_user set in pjsip.conf.
exten => 5145550100,1,NoOp(Inbound from ${CALLERID(num)})
same => n,Answer()
same => n,Dial(PJSIP/6001,25) ; ring the front desk for 25 seconds
same => n,Hangup()
[internal]
; Phones (context=internal) can reach each other...
exten => _6XXX,1,Dial(PJSIP/${EXTEN},20)
same => n,Hangup()
; ...can reach 911 with no prefix (47 CFR 9.16(b)(1) applies to US MLTS)...
exten => 911,1,Dial(PJSIP/911@itsp)
same => n,Hangup()
exten => 9911,1,Goto(911,1) ; habit-dialled 9 + 911 still works
; ...and can call out: NANP numbers as 10 digits or 1 + 10 digits.
; Send the number in whatever format your provider documents.
exten => _NXXNXXXXXX,1,Dial(PJSIP/1${EXTEN}@itsp)
same => n,Hangup()
exten => _1NXXNXXXXXX,1,Dial(PJSIP/${EXTEN}@itsp)
same => n,Hangup()
Recárguelo con dialplan reload desde la CLI.10 Tres cosas de este archivo pequeño son deliberadas:
- Contextos separados para la troncal y los teléfonos.
from-itspsolo puede llegar a una extensión. Nada de lo que envíe una persona que llama desde el exterior puede llegar a una ruta saliente. - 911 sin prefijo. En Estados Unidos, quien "installing, managing, or operating multi-line telephone systems" (instale, administre u opere sistemas telefónicos de varias líneas) debe configurar el sistema de modo que un usuario pueda "directly initiate a call to 911 from any station equipped with dialing facilities, without dialing any additional digit, code, prefix, or post-fix, including any trunk-access code such as the digit 9" (iniciar directamente una llamada al 911 desde cualquier estación con capacidad de marcación, sin marcar ningún dígito, código, prefijo o sufijo adicional, incluido cualquier código de acceso a la troncal como el dígito 9), y debe enviar una notificación a una ubicación central cuando el sistema pueda hacerlo sin hardware ni software nuevos.66 Una central Asterisk con teléfonos de escritorio es un sistema de ese tipo. La línea del plan de marcado es la parte fácil; el servicio 911 del proveedor y la ubicación registrada de cada teléfono son la parte difícil. Nuestra guía de llamadas de emergencia expone las reglas de Estados Unidos; las obligaciones del 9-1-1 en Canadá las fija la CRTC, son distintas y no se tratan aquí.
- Sin comodín
_X.. Un patrón que termina en punto coincide con mucho más de lo que usted pretende.12 Los patrones salientes deben ser tan estrechos como los números que realmente quiere que se marquen. El enrutamiento a destinos internacionales merece su propio patrón, agregado a propósito.
Una operadora automática real (saludo, menú de dígitos, horario de atención, mensaje de voz como respaldo) se construye con las mismas piezas: Background(), WaitExten(), un GotoIfTime() y algunas extensiones. De eso trata la guía del plan de marcado de la operadora automática (auto attendant) de esta sección.
CLI, AMI, AGI, ARI: qué interfaz para qué tarea
Asterisk ofrece cuatro formas de controlarlo desde fuera de los archivos de configuración. Se superponen, y elegir la equivocada es una fuente común de sistemas frágiles.
La CLI. asterisk -r conecta una consola a un Asterisk en ejecución, y asterisk -x "command" ejecuta un solo comando, imprime el resultado y termina.41 El socket de control que usa es asterisk.ctl, en el directorio de ejecución.39 core show help lo enumera todo.2 Es para personas y para scripts de shell; nada más debería analizar su salida.
AMI (Asterisk Manager Interface). "the standard management interface into your Asterisk server" (la interfaz estándar de administración de su servidor Asterisk), un "client/server model over TCP" (modelo cliente/servidor sobre TCP) en el puerto 5038 "if you enable it in manager.conf" (si lo activa en manager.conf). Los clientes envían acciones, reciben respuestas y reciben eventos sobre todo lo que cambia.42 El archivo de ejemplo trae enabled = no y una advertencia directa: "you should not enable the AMI on a public IP address" (no debería activar AMI en una dirección IP pública).43 Tenga en cuenta también que el permiso command permite a un cliente ejecutar comandos arbitrarios de la CLI.42 Use AMI para monitoreo, pantallas de supervisión, clic para llamar (originate) y ventanas emergentes de CRM.
AGI (Asterisk Gateway Interface). "AGI is analogous to CGI in Apache" (AGI es análogo a CGI en Apache): el plan de marcado entrega un canal a un programa externo.44 La aplicación AGI() lanza un script como un proceso nuevo y se comunica con él por stdin y stdout, o se conecta a un servidor FastAGI por TCP mediante un URI agi://.45 El puerto predeterminado de FastAGI es 4573.46 Es síncrono: las acciones "do not return until the action is completed" (no regresan hasta que la acción se completa).44 El resultado queda en AGISTATUS como SUCCESS, FAILURE, NOTFOUND o HANGUP.45 Úselo para agregar una consulta a una base de datos o una decisión a un plan de marcado que, por lo demás, conserva el control.
ARI (Asterisk REST Interface). Tiene tres partes: una interfaz REST "to control resources in Asterisk" (para controlar recursos en Asterisk), un WebSocket "that conveys events in JSON" (que transmite eventos en JSON) y "The Stasis dialplan application that hands over control of a channel from Asterisk to the client" (la aplicación Stasis del plan de marcado, que entrega el control de un canal de Asterisk al cliente). "Channels not in a Stasis dialplan application generally cannot be manipulated by ARI" (los canales que no están en una aplicación Stasis del plan de marcado, por lo general no pueden ser manipulados por ARI).47 La propia descripción del proyecto es la mejor guía de cuándo usarla: AMI y AGI no fueron "designed to let a developer build their own custom communications application" (diseñados para que un desarrollador construya su propia aplicación de comunicaciones personalizada); ARI "is not about telling a channel to execute the VoiceMail dialplan application. It is about letting you build your own VoiceMail application" (no se trata de decirle a un canal que ejecute la aplicación VoiceMail del plan de marcado, sino de permitirle construir su propia aplicación de buzón de voz).47 Funciona sobre el servidor HTTP de Asterisk (puerto 8088 en la guía de inicio; la contraseña de demostración que allí aparece es solo para demostraciones)48, que está desactivado de forma predeterminada y enlazado a 127.0.0.1 en el http.conf de ejemplo.49 Asterisk también puede abrir conexiones WebSocket salientes hacia su aplicación ARI, persistentes o por llamada, configuradas en ari.conf y websocket_client.conf; la página de documentación no indica en qué versión se introdujo, así que revise los archivos de ejemplo de su versión.50
| Usted quiere... | Use | Por qué |
|---|---|---|
| Observar llamadas, contar miembros de una cola, originar una llamada | AMI | Flujo de eventos de todo; acciones para controlar. Manténgalo en localhost o en una VPN.43 |
| Consultar a quien llama en una base de datos a mitad del plan de marcado | AGI o FastAGI | Llamada síncrona con retorno desde el plan de marcado, que conserva el control.44 |
| Construir la propia lógica de la llamada en Python, Go o Node | ARI | Su aplicación es dueña del canal mientras está en Stasis.47 |
| Operar el servidor a mano o desde cron | CLI (asterisk -rx) | Salida pensada para personas; adecuada para scripts propios.41 |
Deslice la tabla hacia los lados para ver todas las columnas.
Nuestra opinión: para un menú telefónico con opciones fijas, el plan de marcado simple es lo más confiable que puede construir: ningún proceso externo que pueda fallar, ningún salto de red en cada tecla. Recurra a ARI cuando la lógica realmente pertenezca al código de una aplicación (menús por cliente desde una base de datos, servicios de voz, colas complejas), y trate esa aplicación como parte de su ruta de llamadas, con el mismo monitoreo y redundancia que el propio Asterisk.
Archivos y directorios de configuración
Todos los archivos de configuración de Asterisk comparten un formato: secciones entre corchetes, líneas name = value y comentarios que empiezan con ;, porque # es un dígito DTMF.2 Los directorios predeterminados:39
| Parámetro | Valor predeterminado | Contiene |
|---|---|---|
| astetcdir | /etc/asterisk | Archivos de configuración |
| astmoddir | /usr/lib/asterisk/modules | Módulos .so cargables |
| astvarlibdir, astdatadir | /var/lib/asterisk | Datos de ejecución; sonidos en sounds/, claves en keys/ |
| astagidir | /var/lib/asterisk/agi-bin | Scripts AGI |
| astspooldir | /var/spool/asterisk | Spool, incluidos outgoing y voicemail |
| astlogdir | /var/log/asterisk | Registros |
| astrundir | /var/run/asterisk | asterisk.ctl y asterisk.pid |
Deslice la tabla hacia los lados para ver todas las columnas.
Los archivos que tocará primero: asterisk.conf (directorios y opciones globales), modules.conf, pjsip.conf, extensions.conf, manager.conf, http.conf y ari.conf, más un archivo por cada módulo de función (buzón de voz, colas, música en espera, etc.). make samples instala un ejemplo para cada módulo.59
Tres construcciones mantienen manejables las configuraciones grandes. #include filename incorpora otro archivo; #tryinclude hace lo mismo sin fallar si el archivo no existe; #exec program inserta la salida de un programa, pero solo con execincludes=yes en asterisk.conf, porque está desactivado de forma predeterminada.38 Las plantillas, que se vieron en el pjsip.conf anterior, eliminan la repetición.3637
Un parámetro de asterisk.conf merece conocerse por su nombre: live_dangerously. Algunas funciones del plan de marcado escalan privilegios; por ejemplo, "reading the SHELL() function can execute arbitrary commands" (leer la función SHELL() puede ejecutar comandos arbitrarios). Desde Asterisk 12 el valor predeterminado es no, lo que impide que protocolos externos como AMI las invoquen.40 Déjelo así.
Nuestra opinión: mantenga /etc/asterisk en git, impleméntelo con la herramienta de administración de configuración que ya use y haga de cada cambio un commit. Los archivos de Asterisk son texto plano, muestran bien las diferencias y se recargan por módulo; una central cuya configuración existe solo en el servidor está a un fallo de disco de tener que reconstruirse de memoria.
Realtime: configuración desde una base de datos
Asterisk puede leer la configuración de una base de datos en lugar de archivos, en dos modos. El realtime estático carga el contenido de un archivo de configuración desde una tabla, y se lee igual que un archivo. El realtime propiamente dicho "is used to dynamically load and update objects" (se usa para cargar y actualizar objetos de forma dinámica) conforme se necesitan.51 Las asignaciones van en extconfig.conf como <family> => <realtime driver>,<res_<driver>.conf class name>[,<table>].51
Los controladores del árbol actual son res_config_odbc, res_config_pgsql, res_config_curl, res_config_ldap y res_config_sqlite353; el controlador nativo de MySQL, res_config_mysql, está en addons/.54 La propia página de realtime nombra ODBC, MySQL y PostgreSQL, así que va por detrás del código fuente.51
PJSIP no usa directamente las familias de extconfig.conf. Usa sorcery, la abstracción de almacenamiento de objetos de Asterisk (res_sorcery_config, res_sorcery_realtime, res_sorcery_astdb y res_sorcery_memory_cache en el árbol53), asignada en sorcery.conf. La configuración documentada:52
; /etc/asterisk/sorcery.conf -- PJSIP objects from the database
[res_pjsip]
endpoint=realtime,ps_endpoints
auth=realtime,ps_auths
aor=realtime,ps_aors
domain_alias=realtime,ps_domain_aliases
contact=realtime,ps_contacts
[res_pjsip_endpoint_identifier_ip]
identify=realtime,ps_endpoint_id_ips
; /etc/asterisk/extconfig.conf
[settings]
ps_endpoints => odbc,asterisk
ps_auths => odbc,asterisk
ps_aors => odbc,asterisk
ps_contacts => odbc,asterisk
El esquema de la base de datos no se escribe a mano: el código fuente incluye migraciones de Alembic en contrib/ast-db-manage/, y la ruta documentada usa ODBC (res_odbc y res_config_odbc).52 Realtime tiene limitaciones documentadas; por ejemplo, "realtime extensions do not support realtime hints" (las extensiones realtime no admiten hints realtime).51
Nuestra opinión: realtime justifica su complejidad cuando otro sistema es dueño de los datos: un portal de aprovisionamiento que crea cientos de endpoints, o muchos inquilinos en servidores compartidos. Para una sola empresa, los archivos bajo control de versiones son más simples, más rápidos y más fáciles de depurar. Si adopta realtime, use el esquema de Alembic de su versión exacta y ponga res_sorcery_memory_cache delante, para que una base de datos lenta no se convierta en un establecimiento de llamadas lento.
Versiones: qué ejecutar en octubre de 2026
La política de lanzamientos, según la página de versiones del proyecto: una nueva versión mayor "roughly once a year, alternating between standard and LTS releases" (aproximadamente una vez al año, alternando entre versiones estándar y LTS). Una versión LTS "will be fully supported for 4 years, with one additional year of maintenance for security fixes" (tendrá soporte completo durante 4 años, con un año adicional de mantenimiento para correcciones de seguridad); una versión estándar recibe "at least one year of full support" (al menos un año de soporte completo) más un año de correcciones de seguridad. Las versiones de corrección de errores de las series con soporte completo llegan aproximadamente cada cuatro a seis semanas, y las versiones de octubre de todas las series con soporte se publican el tercer jueves de octubre, después de un ciclo de candidatas a versión que empieza en septiembre.55
Las series con soporte, con las fechas del propio proyecto y el estado de cada una el día en que se revisó esta página:
| Serie | Tipo | Lanzada | Solo correcciones de seguridad desde | Fin de vida | Al 26 de oct. de 2026 |
|---|---|---|---|---|---|
| 20.x | LTS | 19 de oct. de 2022 | 19 de oct. de 2026 | 19 de oct. de 2027 | Solo correcciones de seguridad. Última serie con chan_sip. Última versión 20.21.0 (27 de ago.); 20.22.0-rc3 publicada el 22 de oct.5556 |
| 21.x | Estándar | 18 de oct. de 2023 | 18 de oct. de 2025 | 18 de oct. de 2026 | Fin de vida. Última versión 21.12.3 (25 de jun. de 2026). Tuvo dos años de correcciones de errores por lo que la página de versiones llama un error de calendario.5556 |
| 22.x | LTS | 16 de oct. de 2024 | 16 de oct. de 2028 | 16 de oct. de 2029 | Soporte completo. Última versión 22.11.0 (27 de ago.); 22.12.0-rc3 publicada el 22 de oct.5556 |
| 23.x | Estándar | 15 de oct. de 2025 | 15 de oct. de 2026 | 15 de oct. de 2027 | Solo correcciones de seguridad. Última versión 23.5.0 (27 de ago.); 23.6.0-rc3 publicada el 22 de oct.5556 |
| 24.x | LTS | 15 de oct. de 2026 (programada) | 15 de oct. de 2030 | 15 de oct. de 2031 | Aún no lanzada. La página de versiones la muestra como preliminar; la etiqueta más reciente es 24.0.0-rc3, publicada el 22 de oct. de 2026.5556 |
Deslice la tabla hacia los lados para ver todas las columnas.
Asterisk 18 llegó al fin de su vida el 20 de octubre de 2025.55 Aparte, Sangoma mantiene ramas de Certified Asterisk para su nivel de soporte más alto4; las actuales son la 22.8 y la 20.7, con certified-22.8-cert5 y certified-20.7-cert12 etiquetadas el 19 de octubre de 2026.56
El consejo del propio proyecto: "It is highly recommended that you install one of the currently supported versions" (se recomienda mucho instalar una de las versiones con soporte vigente), y "If you want a rock solid communications framework, choose the latest Long Term Support (LTS) release" (si quiere un marco de comunicaciones sólido como una roca, elija la última versión de soporte a largo plazo, LTS).58
Nuestra opinión, para una instalación nueva hoy: instale la 22 LTS. Le quedan tres años de soporte completo y tiene todos los módulos actuales. Planee pasar a la 24 cuando se lance y haya tenido una o dos versiones de mantenimiento, no el primer día. Si está en la 20, le queda un año de correcciones de seguridad: empiece ya el paso a la 22, y si chan_sip es la razón por la que sigue en la 20, la migración es el proyecto, no la actualización. Las versiones estándar (21, 23) son para probar funciones nuevas, no para un sistema telefónico del que depende una empresa.
Instalación: código fuente, paquetes de la distribución o ninguno de los dos
La documentación enumera tres rutas: FreePBX ("the easiest way to get started if you're new to Linux and/or Asterisk", la forma más fácil de empezar si es nuevo en Linux o en Asterisk), los paquetes de su sistema operativo, o compilar desde el código fuente para "the utmost in control of your installation" (el máximo control sobre su instalación).57
Desde el código fuente. Las versiones están en downloads.asterisk.org/pub/telephony/asterisk/, con un enlace -current por cada serie con soporte.58 La secuencia es la del README y la guía de compilación:259
# Build from a release tarball (Asterisk 22 LTS shown)
cd /usr/src
curl -LO https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
tar xzf asterisk-22-current.tar.gz && cd asterisk-22.*/
./contrib/scripts/install_prereq install # every dependency for every module
./configure # bundled pjproject is the default
make menuselect # choose modules; deprecated ones are off by default
make -j"$(nproc)"
make install
make config # init scripts
# make samples would install sample configs AND overwrite any existing ones
asterisk -vvvc # foreground, verbose, with a console
Puntos del README y de la guía de compilación que es fácil pasar por alto: make samples "Overwrites existing config files" (sobrescribe los archivos de configuración existentes); en máquinas virtuales, la optimización nativa de CPU predeterminada puede producir un binario que no se ejecuta en otro equipo, y menuselect/menuselect --disable BUILD_NATIVE menuselect.makeopts la desactiva; y --prefix es la forma admitida de aislar una instalación.59 El README agrega dos advertencias operativas: Asterisk "is sensitive to large jumps in time" (es sensible a saltos grandes de hora), así que ejecute exactamente un demonio de sincronización de hora; y con el límite habitual de 1024 descriptores de archivo, "Asterisk can handle approximately 150 SIP calls simultaneously" (Asterisk puede manejar aproximadamente 150 llamadas SIP simultáneas), así que aumente nofile para el usuario asterisk.2
Paquetes de la distribución. Verifique qué obtendría realmente antes de elegir esta ruta:
- Debian: la búsqueda de paquetes no muestra ningún paquete
asterisken bookworm (12) ni en trixie (13). Bullseye (11) trae la 16.28.0, una serie cuyo fin de vida upstream fue el 9 de octubre de 2023; testing (forky) y unstable traen la 22.10.1.6155 - Ubuntu: la 24.04 (Noble) incluye la 20.6.0 y la 26.04 (Resolute) incluye la 22.5.2, ambas en el componente universe.62 El proyecto original está en la 20.21.0 y la 22.11.0.56 Una distribución puede aplicar correcciones de seguridad retroactivamente sin cambiar el número de versión original, así que lea el registro de cambios del paquete en lugar de juzgar solo por la versión.
Nuestra opinión: para producción, compile desde el código fuente una LTS con soporte (o use un repositorio del proveedor que siga las versiones de mantenimiento originales) y empaquete usted mismo el resultado si ejecuta más de un servidor. Los paquetes de la distribución sirven para un laboratorio. En cualquier caso, fije la versión: una actualización desatendida a una nueva versión mayor de Asterisk no es algo que quiera descubrir por una llamada de soporte.
Dónde encajan FreePBX y otras distribuciones
FreePBX es una interfaz web y un sistema de módulos que configura Asterisk por usted. Su módulo framework tiene licencia GPL-3.065, y es la ruta que la propia documentación de Asterisk recomienda a los principiantes.57 La línea de versiones actual, FreePBX 17, tiene soporte oficial "Officially Supported Only on Debian 12 “Bookworm”" (solo en Debian 12 “Bookworm”) y se instala con un script de código abierto.63 Ese script usa ASTVERSION=22 de forma predeterminada, se niega a ejecutarse en cualquier cosa que no sea Debian 12, bloquea activamente los paquetes de Debian 13 e instala Asterisk como paquetes asterisk22 desde el repositorio deb.freepbx.org de Sangoma, y no desde Debian.64 La documentación de FreePBX también señala que "Asterisk 21 and later versions do not support chan_sip at all" (Asterisk 21 y las versiones posteriores no admiten chan_sip en absoluto) y que FreePBX 17 usa PHP 8.2, "with security support guaranteed through until December 2026" (con soporte de seguridad garantizado hasta diciembre de 2026).63
Cuándo FreePBX es la opción correcta: una central de oficina con extensiones, grupos de timbre, IVR, buzón de voz y condiciones de horario, administrada por alguien que prefiere hacer clic en lugar de editar texto, y donde el modelo de sistema telefónico de la interfaz gráfica coincide con el suyo. Cuándo lo es Asterisk puro: su flujo de llamadas es poco común, quiere la configuración en control de versiones, está construyendo una aplicación sobre ARI o está implementando muchos servidores idénticos con automatización.
Nuestra opinión: elija un único responsable de la configuración. Una interfaz gráfica que genera los archivos de Asterisk y un ingeniero que además los edita a mano terminarán sobrescribiéndose, y por lo general gana la interfaz. Si elige FreePBX, haga el trabajo dentro de FreePBX; si lo supera, migre de forma deliberada y no archivo por archivo.
Existen otras distribuciones basadas en Asterisk y productos de central telefónica comerciales. No los hemos revisado para esta página, así que no afirmamos nada sobre ellos aquí.
Cuándo no operar Asterisk por su cuenta
Asterisk es excelente, gratuito y maduro, y quienes lo operan bien lo tratan como un servidor propio durante toda su vida útil: con parches dentro del período de soporte, monitoreado, con copias de seguridad, protegido con firewall y con un plan para el día en que el proveedor de la troncal cambie algo. Ese es el costo real, y es sobre todo tiempo más que dinero.
Si lo que necesita es un número de teléfono que conteste con un menú corto y reenvíe cada opción a un celular o al buzón de voz, un servicio alojado es el compromiso más pequeño. Eso es lo que hace el servicio de este sitio. Si quiere el control, las guías de la sección de Asterisk están escritas para usted, y la sección de VoIP de código abierto trata los proxies SIP que se colocan delante de Asterisk cuando un solo servidor ya no alcanza.
Lecturas recomendadas
Artículos de investigación más largos sobre este tema (en inglés), cada uno con sus fuentes y un PDF descargable.
Artículos sobre este tema
Fuentes
Cada afirmación sobre normas o precios en esta página enlaza a su fuente primaria, a menudo en inglés. Las normas y los precios cambian: verifique antes de confiar en una cifra.
- IETF RFC 3261, SIP: Session Initiation Protocol, sección 6 (definición de un agente de usuario back-to-back). Consultado el 26 de octubre de 2026
https://www.rfc-editor.org/rfc/rfc3261#section-6 - Repositorio de código fuente de Asterisk, README.md (qué es Asterisk, pasos de compilación, notas sobre descriptores de archivo y sincronización de hora). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/README.md - Repositorio de código fuente de Asterisk, LICENSE (GPL versión 2, licencias alternativas de Sangoma, la declaración sobre AMI/AGI/ARI, marcas). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/LICENSE - asterisk.org, Asterisk Support (Sangoma como "the primary sponsor and developer of Asterisk"; el nivel de soporte 5 exige Certified Asterisk). Consultado el 26 de octubre de 2026
https://www.asterisk.org/?p=8753 - Documentación de Asterisk, Asterisk Architecture, The Big Picture (núcleo, módulos, canales, plan de marcado). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Architecture/Asterisk-Architecture-The-Big-Picture/ - Documentación de Asterisk, Types of Asterisk Modules. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Architecture/Types-of-Asterisk-Modules/ - Documentación de Asterisk, Key Concepts: Channels (canales entrantes y salientes de una llamada). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Key-Concepts/Channels/ - Documentación de Asterisk, Key Concepts: Bridges (puentes de núcleo, nativos, de mezcla y de espera). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Key-Concepts/Bridges/ - Documentación de Asterisk, Key Concepts: The Stasis Message Bus. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Key-Concepts/The-Stasis-Message-Bus/ - Documentación de Asterisk, Dialplan (extensions.conf, recarga del plan de marcado). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Dialplan/ - Documentación de Asterisk, Contexts, Extensions, and Priorities. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Dialplan/Contexts-Extensions-and-Priorities/ - Documentación de Asterisk, Pattern Matching (X, Z, N, el punto y el signo de exclamación). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Dialplan/Pattern-Matching/ - Repositorio de código fuente de Asterisk, directorio channels/ en la rama master (controladores de canal actuales en el árbol). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/master/channels - Repositorio de código fuente de Asterisk, directorio channels/ en la rama 20 (chan_sip.c, chan_skinny.c y chan_mgcp.c todavía presentes). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/20/channels - Repositorio de código fuente de Asterisk, directorio channels/ en la rama 21 (sin chan_sip.c). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/21/channels - Repositorio de código fuente de Asterisk, directorio bridges/ en la rama master (módulos de tecnología de puentes). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/master/bridges - Repositorio de código fuente de Asterisk, configs/samples/modules.conf.sample (autoload, preload, require, noload). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/configs/samples/modules.conf.sample - Documentación de Asterisk, Asterisk Module Support States (core, extended, deprecated). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Asterisk-Community/Asterisk-Module-Support-States/ - Documentación de Asterisk, Asterisk Module Deprecations (versiones de obsolescencia y de eliminación). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Development/Asterisk-Module-Deprecations/ - Documentación de Asterisk, What’s New in Asterisk 21 (módulos eliminados, incluido chan_sip). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Asterisk_21_Documentation/WhatsNew/ - Documentación de Asterisk, Configuring chan_sip (nota sobre su eliminación en Asterisk 21). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-chan_sip/ - Documentación de Asterisk, Configuring res_pjsip (chan_pjsip depende de res_pjsip; pjsip.conf). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/ - Documentación de Asterisk, PJSIP Configuration Sections and Relationships. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Sections-and-Relationships/ - Documentación de Asterisk, res_pjsip Configuration Examples (transporte, teléfono, troncal de proveedor ITSP). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/res_pjsip-Configuration-Examples/ - Documentación de Asterisk, Configuring Outbound Registrations. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Configuring-Outbound-Registrations/ - Documentación de Asterisk, Configuring res_pjsip to work through NAT. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Configuring-res_pjsip-to-work-through-NAT/ - Documentación de Asterisk, Module Configuration: res_pjsip (valores predeterminados de las opciones de endpoint). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Latest_API/API_Documentation/Module_Configuration/res_pjsip/ - Documentación de Asterisk, Module Configuration: res_pjsip_endpoint_identifier_ip (identify: match, srv_lookups, match_header). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Latest_API/API_Documentation/Module_Configuration/res_pjsip_endpoint_identifier_ip/ - Repositorio de código fuente de Asterisk, res/res_pjsip/pjsip_config.xml (identify_by, max_contacts, remove_existing, protocolos de transporte, auth_type; el mismo texto de auth_type se verificó en las ramas 20 y 22). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/res/res_pjsip/pjsip_config.xml - Repositorio de código fuente de Asterisk, res/res_pjsip/config_global.c (DEFAULT_ENDPOINT_IDENTIFIER_ORDER "ip,username,anonymous"). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/res/res_pjsip/config_global.c - Repositorio de código fuente de Asterisk, configs/samples/pjsip.conf.sample (llamadas anónimas rechazadas de forma predeterminada). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/configs/samples/pjsip.conf.sample - Documentación de Asterisk, Asterisk PJSIP Troubleshooting Guide (pjsip show endpoint, pjsip show aor, pjsip set logger on). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Asterisk-PJSIP-Troubleshooting-Guide/ - Documentación de Asterisk, PJSIP Configuration Wizard (res_pjsip_config_wizard, pjsip_wizard.conf). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/PJSIP-Configuration-Wizard/ - Documentación de Asterisk, Dialing PJSIP Channels. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Dialing-PJSIP-Channels/ - Documentación de Asterisk, Migrating from chan_sip to res_pjsip (sip_to_pjsip.py). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Migrating-from-chan_sip-to-res_pjsip/ - Documentación de Asterisk, Template Syntax. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Configuration/Asterisk-Configuration-Files/Templates/Template-Syntax/ - Documentación de Asterisk, Using Templates. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Configuration/Asterisk-Configuration-Files/Templates/Using-Templates/ - Documentación de Asterisk, Using the include, tryinclude and exec Constructs. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Configuration/Asterisk-Configuration-Files/Using-The-include-tryinclude-and-exec-Constructs/ - Documentación de Asterisk, Directory and File Structure. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Directory-and-File-Structure/ - Documentación de Asterisk, Privilege Escalations with Dialplan Functions (live_dangerously). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Dialplan/Privilege-Escalations-with-Dialplan-Functions/ - Repositorio de código fuente de Asterisk, página de manual doc/asterisk.8 (opciones -r, -x, -c). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/doc/asterisk.8 - Documentación de Asterisk, The Asterisk Manager TCP/IP API. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-Manager-Interface-AMI/The-Asterisk-Manager-TCP-IP-API/ - Repositorio de código fuente de Asterisk, configs/samples/manager.conf.sample (nota de seguridad, enabled = no, puerto 5038). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/configs/samples/manager.conf.sample - Documentación de Asterisk, Asterisk Gateway Interface (AGI). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-Gateway-Interface-AGI/ - Documentación de Asterisk, Dialplan Applications: AGI (stdin/stdout, URI de FastAGI, AGISTATUS). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Latest_API/API_Documentation/Dialplan_Applications/AGI/ - Repositorio de código fuente de Asterisk, res/res_agi.c (AGI_PORT 4573, "FastAGI defaults to port 4573"). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/res/res_agi.c - Documentación de Asterisk, Asterisk REST Interface (ARI). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ - Documentación de Asterisk, Getting Started with ARI (http.conf, ari.conf, Stasis(), puerto 8088). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Getting-Started-with-ARI/ - Repositorio de código fuente de Asterisk, configs/samples/http.conf.sample (desactivado de forma predeterminada, bindaddr=127.0.0.1). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/configs/samples/http.conf.sample - Documentación de Asterisk, ARI Outbound Websockets. Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/ARI-Outbound-Websockets/ - Documentación de Asterisk, Realtime Database Configuration (extconfig.conf, modos estático y realtime, salvedades). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Fundamentals/Asterisk-Configuration/Database-Support-Configuration/Realtime-Database-Configuration/ - Documentación de Asterisk, Setting up PJSIP Realtime (sorcery.conf, extconfig.conf, scripts de Alembic). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Configuration/Channel-Drivers/SIP/Configuring-res_pjsip/Setting-up-PJSIP-Realtime/ - Repositorio de código fuente de Asterisk, directorio res/ en master (res_config_curl, _ldap, _odbc, _pgsql, _sqlite3; res_sorcery_*). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/master/res - Repositorio de código fuente de Asterisk, directorio addons/ en master (res_config_mysql, chan_ooh323, chan_mobile, format_mp3). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/tree/master/addons - Documentación de Asterisk, Asterisk Versions (tabla de versiones, períodos de soporte LTS y estándar, calendario de lanzamientos). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/About-the-Project/Asterisk-Versions/ - Repositorio de código fuente de Asterisk, versiones en GitHub (24.0.0-rc3, 23.6.0-rc3, 22.12.0-rc3 y 20.22.0-rc3 el 22 de oct. de 2026; 23.5.0, 22.11.0 y 20.21.0 el 27 de ago. de 2026; certified-22.8-cert5 y certified-20.7-cert12 el 19 de oct. de 2026; 21.12.3 el 25 de jun. de 2026). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/releases - Documentación de Asterisk, Installing Asterisk (FreePBX, paquetes de la distribución, código fuente). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Getting-Started/Installing-Asterisk/ - Documentación de Asterisk, What to Download (downloads.asterisk.org, elegir una versión con soporte, LTS para estabilidad). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/What-to-Download/ - Documentación de Asterisk, Building and Installing Asterisk (destinos de make, --prefix, BUILD_NATIVE). Consultado el 26 de octubre de 2026
https://docs.asterisk.org/Getting-Started/Installing-Asterisk/Installing-Asterisk-From-Source/Building-and-Installing-Asterisk/ - Repositorio de código fuente de Asterisk, configure.ac ("Use bundled pjproject libraries (default)"). Consultado el 26 de octubre de 2026
https://github.com/asterisk/asterisk/blob/master/configure.ac - Debian, búsqueda de paquetes "asterisk" en todas las suites (sin paquete en bookworm ni trixie; 16.28.0 en bullseye; 22.10.1 en forky y sid). Consultado el 26 de octubre de 2026
https://packages.debian.org/search?keywords=asterisk&searchon=names&exact=1&suite=all§ion=all - Launchpad, paquete fuente asterisk en Ubuntu (versiones por serie, componente universe). Consultado el 26 de octubre de 2026
https://launchpad.net/ubuntu/+source/asterisk - Documentación de Sangoma, FreePBX 17 (solo Debian 12, script de instalación, chan_sip, PHP 8.2). Consultado el 26 de octubre de 2026
https://sangomakb.atlassian.net/wiki/spaces/FP/pages/222101505/FreePBX+17 - FreePBX, sng_freepbx_debian_install.sh (ASTVERSION predeterminada 22, solo bookworm, paquetes de deb.freepbx.org). Consultado el 26 de octubre de 2026
https://github.com/FreePBX/sng_freepbx_debian_install/blob/master/sng_freepbx_debian_install.sh - FreePBX, repositorio del módulo framework (licencia GPL-3.0). Consultado el 26 de octubre de 2026
https://github.com/FreePBX/framework - 47 CFR § 9.16, Multi-line telephone systems (marcación directa al 911, notificación MLTS). Cornell Legal Information Institute. Consultado el 26 de octubre de 2026
https://www.law.cornell.edu/cfr/text/47/9.16
