Centralita casera
Asterisk
es un programa de software libre (bajo licencia GPL) que proporciona funcionalidades de una central telefónica (PBX). Es posible conectarle teléfonos para hacer llamadas entre sí dentro de tu casa (o empresa) e incluso acceder a comunicaciones fuera de la misma, a la PSTN (como Movistar) o conectando a un proveedor de VoIP o bien a enlaces RDSI (básicos o primarios).
Introducción
Me gustaría poder usar la línea fija de mi contrato con Movistar desde cualquier punto de la casa. ¿Por qué no montar una pequeña centralita?, si ya tengo mi Linux haciendo de router y firewall, ¿porqué no añadirle Asterisk al mismo router Linux para Movistar?. Dicho y hecho, lo instalé y configuré como punto intermedio, para poder hacer/recibir llamadas externas y eventualmente hacer llamadas entre softphones dentro de la casa.
Asterisk fue originalmente desarrollado para GNU/Linux, también hay versiones para BSD, MacOS, Solaris y Microsoft Windows. Es una PBX con soporte de buzón de voz, conferencias, IVR, distribución automática de llamadas, etc. Si quieres usar teléfonos tradicionales, analógicos, necesitarás tarjetas electrónicas de tipo FXO (red de operador) y/o FXS (red interna).
Lo más sencillo es usar teléfonos (físicos) VoIP o, mejor todavía, Softphones (App’s en los móviles o en ordenador). Asterisk soporta multiples protocolos VoIP: SIP, H.323, IAX y MGCP, puede interoperar con terminales IP actuando como un registrador y como gateway entre ambos; permite la unificación de tecnologías VoIP, GSM y PSTN.
Routing y Movistar
Antes de empezar, este apunte es válido para mi caso, donde mi router es un Linux que se conecta a la ONT de mi operador, Movistar. Si tu configuración es distinta, que es lo más lógico y probable, tenlo en cuanta al leer el apunte.
Si tu operador es Movistar y usas el router “oficial”, todo lo que describo aquí entiendo que debería funcionar, porque dicho router debería enrutar los paquetes hacia el “Proxy Movistar” correctamente. Digo debería porque no lo he probado, pero por lo que he leído por ahí a mucha gente le está funcionando.
Si tu operador es Movistar y usas otro router distinto al oficial, averigua cómo debes configurarlo para hacer routing hacia la IP del Proxy SIP, sobre el que hablo más adelante.
En el caso de otros operadores y router “oficial”, averigua si soportan SIP y sobre todo cómo llegar a la IP de su Proxy SIP, cuando estás detrás del router que te hayan puesto. Y lo mismo si tienes otro operador y un router proio, averigua cómo debes hacer routing hacia la IP del Proxy SIP.
Dicho esto, comparto mi config. Recordar que el caso de uso de esta configuración es un router linux que accede directamente a la ONT, con acceso directo a la vlan6 para datos, vlan2 para IPTV y vlan3 para Voz.
/etc/netplan/50-mi-netplan.yaml
. Mi linux está en una Virtual Machine sobre Proxmox. Muestro parte de la config.
# Netplan by LuisPa
network:
ethernets:
eth0:
match:
macaddress: '12:34:56:78:90:AB'
name: enp1s0
name: eth0
set-name: eth0
dhcp4: no
vlans:
# Movistar IPTV
vlan2:
id: 2
link: eth0
mtu: 1454
macaddress: 'AB:90:78:56:34:13'
addresses:
- 10.XX.YY.ZZ/9
# Movistar VoIP
vlan3:
id: 3
link: eth0
macaddress: 'AB:90:78:56:34:12'
dhcp4: yes
dhcp4-overrides:
use-routes: false
routes:
- to: 10.31.255.128/27
via: 10.22.0.1
# Movistar DATOS
vlan6:
id: 6
link: eth0
macaddress: 'AB:90:78:56:34:11'
dhcp4: no
:
Configuración IP: Tras el arranque de sistema (o de netplan), así es como quedan mis rutas instaladas, recibo una IP vía DHCP e instalo la ruta estática para llegar al Proxy SIP de Movistar (su IP es la 10.31.255.134 y la ruta que instalo tiene una máscara /27
que la incluye).
[root]@cortafuegix:~/firewall# ip route
:
10.22.0.0/19 dev vlan3 proto kernel scope link src 10.22.Y.Z metric 100
10.22.0.1 dev vlan3 proto dhcp scope link src 10.22.Y.Z metric 100
10.31.255.128/27 via 10.22.0.1 dev vlan3 proto static onlink
:
Configuración NAT: Como instalo Asterisk en el mismo Linux que hace de router No necesito hacer Source NAT a los paquetes que salen por la VLAN 3
. Asterisk conecta con el Proxy SIP de Movistar directamente con la IP recibida vía DHCP por la VLAN 3
.
Configuración de RPF: Activo RPF (Reverse Path Forwarding) selectivamente durante el arranque del equipo.
if [ -f /proc/sys/net/ipv4/conf/vlan3/rp_filter ]
then
echo 1 > /proc/sys/net/ipv4/conf/vlan3/rp_filter
fi
Añadir telefonica.net
: Es muy importante añadirlo al fichero /etc/hosts
. No tiene que ver con el routing, pero es importante y explico el porqué más adelante.
:
# Necesario para Asterisk
213.4.130.95 telefonica.net
:
Instalación
Bitácora del proceso de instalación de Asterisk. Primero actualizo mi Ubuntu a la última, descargo e instalo el software y los sonidos de respuesta a las llamadas, mensajes, etc., al terminar compruebo qué paquetes se han instalado.
[root]@cortafuegix:~# apt update && apt upgrade -y && apt full-upgrade
:
[root]@cortafuegix:~# apt install asterisk
:
[root]@cortafuegix:~# asterisk -V
Asterisk 18.10.0~dfsg+~cs6.10.40431411-2
:
[root]@cortafuegix:~# apt install asterisk-core-sounds-es asterisk-core-sounds-es-g722 asterisk-core-sounds-es-gsm asterisk-core-sounds-es-wav
:
[root]@cortafuegix:~# dpkg -l | grep -i asterisk
:
[root]@cortafuegix:~# service asterisk status
● asterisk.service - Asterisk PBX
Loaded: loaded (/lib/systemd/system/asterisk.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-07-13 17:35:49 CEST; 17min ago
Docs: man:asterisk(8)
Main PID: 6767 (asterisk)
Tasks: 69 (limit: 3425)
Memory: 48.1M
CPU: 3.915s
CGroup: /system.slice/asterisk.service
├─6767 /usr/sbin/asterisk -g -f -p -U asterisk
└─6768 astcanary /var/run/asterisk/alt.asterisk.canary.tweet.tweet.tweet 6767
jul 13 17:35:49 cortafuegix systemd[1]: Starting Asterisk PBX...
jul 13 17:35:49 cortafuegix asterisk[6767]: radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory
jul 13 17:35:49 cortafuegix asterisk[6767]: radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory
jul 13 17:35:49 cortafuegix systemd[1]: Started Asterisk PBX.
Si se queja sobre que no encuentra archivos bajo /etc/radiusclient-ng
es porque el directorio de trabajo lo tenemos que cambiar a donde se instala al usar Ubuntu.
[root]@cortafuegix:~# cd /etc/asterisk
[root]@cortafuegix:/etc/asterisk# cp cel.conf cel.conf.bak
[root]@cortafuegix:/etc/asterisk# cp cdr.conf cdr.conf.bak
En el archivo /etc/asterisk/cel.conf
:
radiuscfg => /etc/radcli/radiusclient.conf
En el archivo /etc/asterisk/cdr.conf
:
[radius]
radiuscfg => /etc/radcli/radiusclient.conf
Rearranco el servicio y compruebo de nuevo su estado:
[root]@cortafuegix:/etc/asterisk# service asterisk restart
[root]@cortafuegix:/etc/asterisk# service asterisk status
:
jul 13 18:56:14 cortafuegix systemd[1]: Starting Asterisk PBX...
jul 13 18:56:14 cortafuegix systemd[1]: Started Asterisk PBX.
Consola CLI
El comando asterisk -rvvv
nos conecta con un CLI del propio Asterisk donde podemos ver todos los mensajes de debug
, así como ejecutar comandos. Es super útil.
[root]@cortafuegix:~# asterisk -rvvv
:
Connected to Asterisk 18.10.0~dfsg+~cs6.10.40431411-2 currently running on cortafuegix (pid = 8497)
cortafuegix*CLI>
cortafuegix*CLI> sip show peers
cortafuegix*CLI> sip show users
cortafuegix*CLI> sip reload
cortafuegix*CLI> dialplan reload
cortafuegix*CLI> core show channels
cortafuegix*CLI> sip show channels
cortafuegix*CLI>
Configuración
Los dos archivos de configuración más importantes son sip.conf
y extensions.conf
.
/etc/asterisk/sip.conf
: Define los canales SIP, peers, tanto para llamadas entrantes como salientes.- He configurado tres extensiones principales para tres personas (101,102,103) y el TRUNK con Movistar
- Enlace al Gist de mi fichero sip.conf
/etc/asterisk/extensions.conf
: Define el comportamiento que va a tener una llamada en nuestra centralita, qué reglas rigen su enrutamiento y qué aplicaciones va a ejecutar (dialplan
)- Enlace al Gist de mi fichero extensions.conf
IMPORTANTE #1: Si usas mis ficheros de ejemplo como guía, es importantísimo que pongas tu número de teléfono de casa, en varios sitios en ambos ficheros verás el número ficticio 911234567
. Cámbialo al tuyo en todos los sitios donde lo veas.
IMPORTANTE #2: Debes añadir una entrada al fichero /etc/hosts
del servidor. A pesar de que Asterisk se comunica exclusivamente con el Proxy de Movistar, necesita poder resolver telefonica.net
, porque usa dicho nombre en los paquetes SIP aunque NO USA LA IP resuelta. Lo importante, que pueda resolver (da igual la IP) o en caso contrario las llamadas al exterior no funcionarán.
Añadir telefonica.net
al fichero /etc/hosts
(esa ip da igual, la saqué de dig @8.8.8.8 www.telefonica.net
)
:
# Necesario para Asterisk
213.4.130.95 telefonica.net
:
Una vez que hayas modificado ambos ficheros, necesitas recargar asterisk:
[root]@cortafuegix:/etc/asterisk# asterisk -rvvv
cortafuegix*CLI> dialplan reload < Relee el fichero extensions.conf
cortafuegix*CLI> sip reload < Relee el ficheor sip.conf
cortafuegix*CLI>
Los clientes se configuran registrándolos con Asterisk. A continuación muestro un ejemplo con el cliente Zoiper para Linux
En la consola de mi servidor, desde el CLI de Asterisk podremos ver los clientes registrados (ver Consola de Asterisk más adelante)
[root]@cortafuegix:~# asterisk -rvvv
cortafuegix*CLI> sip show peers
Name/username Host Dyn Forcerport Comedia ACL Port Status Description
ext101/luispa 192.168.100.14 D Yes Yes 49860 OK (2 ms)
luison/luison 192.168.100.12 D Yes Yes 61266 OK (1 ms)
luison/jacobo 192.168.100.11 D Yes Yes 55959 OK (1 ms)
telefonica-in/914041242 10.31.255.134 Yes Yes 5060 Unmonitored
telefonica-out/914041242 213.4.130.95 Yes Yes 5060 Unmonitored
5 sip peers [Monitored: 1 online, 2 offline Unmonitored: 2 online, 0 offline]
Primera llamada
Veamos cómo hacer una llamada interna. En mi ejemplo configuro Zoiper en un iPhone (luispa, 101
) que va a llamar a Zoiper en un MacOS (luison, 102
)
Una vez que lo tengas preparado, marca la extensión y dale al botón de llamar. Voilà !
Llamadas entrantes y salientes al exterior
Aprovechando el contrato que tengo con Movistar voy a configurar mi Asterisk para que pueda usar mi teléfono de casa (en mi caso del tipo 911234567
). Puedes consultar mi sip.conf.
Hay que configurar varias cosas. La primera es decirle a Asterisk la dirección del Proxy de Movistar y los credenciales para autenticarme. Luego hay que configurar los troncales. A continuación tienes un vistazo del trozo de configuración pertinente, con los credenciales de mi número y los troncales (telefonica-in
y telefonica-out
).
Recuerda que donde pone 911234567
debes poner tu número de teléfono.
; Datos para registrarme con el Proxy SIP de telefónica Movistar
; -------------------------------------------------------------------
register => 911234567@telefonica.net:911234567@10.31.255.134:5070
; TRONCAL SIP salida hacia Telefonica (para llamar al exterior)
; -------------------------------------------------------------------
[telefonica-out]
type=peer
host=telefonica.net
port=5060
user=911234567
username=911234567
fromuser=911234567
secret=911234567
fromdomain=telefonica.net
outboundproxy=10.31.255.134:5070
nat=force_rport,comedia
insecure=port,invite
dtmfmode=auto
disallow=all
allow=ulaw,alaw
context=entrantes
qualify=no
trustrpid=yes
; TRONCAL SIP entrada desde Telefonica (para aceptar llamadas)
; -------------------------------------------------------------------
[telefonica-in]
type=peer
host=10.31.255.134
user=911234567
username=911234567
fromuser=911234567
secret=911234567
fromdomain=telefonica.net
port=5060
nat=force_rport,comedia
insecure=port,invite
dtmfmode=auto
disallow=all
allow=ulaw,alaw
context=entrantes
qualify=no
trustrpid=yes
En el fichero extensions.conf se configura cómo gestionar las llamadas entrantes desde el exterior.
En mi caso lo configuro para que todas las llamadas que entren en la casa se reenvían a la extensión 101
(LuisPa)
[entrantes]
exten => s,1,NoOp(LLAMADA ENTRANTE Telefónica de ${CALLERID(all))
same => n,Dial(${LUISPA},15) ; Pásala al usuario LuisPa
same => n,Hangup() ; Si no contesta a los 15s colgar la llamada
Expresiones Regulares
Describo aquí cómo trabajar con los patrones. Se trata de poder expresar de forma sencilla todo tipo de números telefónicos en el dialplan
, es decir, en el fichero extensions.conf
. Los patrones nos permiten crear una sola extensión para representar dinámicamente múltiples extensiones. Siempre empiezan con la barra baja (_
), la sintaxis y su orden de prioridad es el siguiente:
Veamos un ejemplo, he creado el contexto [pruebas]
con varios patrones, si usamos el comando CLI dialplan show context_name
veremos el orden de interpretación:
[root]@cortafuegix:~# cat /etc/asterisk/extensions.conf
:
[angelitos]
:
; Pruebas con expresiones regulares
exten => _X.,1,NoOP(Patrón 1)
exten => _1[24]XX,1233,1,NoOP(Patrón 2)
exten => 1233,1,NoOP(Patrón 3)
exten => _1XXX,1,NoOP(Patrón 4)
exten => _+34X.,1,NoOP(España)
exten => _+X.,1,NoOP(Extranjero)
exten => _91XXXXXXX,1,NoOP(Madrid)
:
En el CLI veríamos el orden de prioridad
cortafuegix*CLI> dialplan reload
:
cortafuegix*CLI> dialplan show angelitos
[ Context 'angelitos' created by 'pbx_config' ]
'101' => 1. Dial(SIP/luispa) [extensions.conf:19]
'102' => 1. Dial(SIP/luison) [extensions.conf:20]
'103' => 1. Dial(SIP/jacobo) [extensions.conf:21]
'1233' => 1. NoOP(Patrón 3) [extensions.conf:41]
'200' => 1. NoOp(Reproducir mi audio) [extensions.conf:24]
1. Playback(intro-angelitos) [extensions.conf:25]
2. Dial(SIP/luison) [extensions.conf:26]
3. Hangup() [extensions.conf:27]
'300' => 1. NoOp(Prueba de atajos) [extensions.conf:30]
1. Playback(intro-angelitos) [extensions.conf:31]
2. Dial(SIP/luison) [extensions.conf:32]
3. Hangup() [extensions.conf:33]
'778899' => 1. Goto(salientes,778899,1) [extensions.conf:36]
'_+34X.' => 1. NoOP(España) [extensions.conf:43]
'_+X.' => 1. NoOP(Extranjero) [extensions.conf:44]
'_1[24]XX' => 1233. 1,NoOP(Patrón 2) [extensions.conf:40]
'_1XXX' => 1. NoOP(Patrón 4) [extensions.conf:42]
'_91XXXXXXX' => 1. NoOP(Madrid) [extensions.conf:45]
'_X.' => 1. NoOP(Patrón 1) [extensions.conf:39]
-= 13 extensions (19 priorities) in 1 context. =-
Grabación propia
Hemos visto lo básico de Asterisk. En realidad se pueden hacer muchísimas más cosas, pero no era el objetivo de este apunte técnico. De todas formas, dado que estuve jugando con esto, dejo aquí documentada una prueba que hice grabando una locución.
He creado una extensión (la 200) para hacer pruebas de grabaciones del sistema. Pero antes, necesitaba grabar una locución. Creé el fichero intro-angelitos.wav
con Audacity que básicamente dice “Bienvenido a Angelitos, marque 1 para hablar con … “, etc. Lo he exportado a formato WAV
y enviado a mi servidor.
Utilizo el comando soz
para preparar los diferentes formatos:
⚡ luis@cortafuegix:~ % sox intro-angelitos.wav -r 8000 -c1 intro-angelitos.gsm
⚡ luis@cortafuegix:~ % ls -al intro-angelitos.*
-rw-r--r-- 1 luis luis 14124 jul 13 21:16 intro-angelitos.gsm
-rw-r--r-- 1 luis luis 753708 jul 13 21:09 intro-angelitos.wav
Muevo el fichero a su sitio destino
[root]@cortafuegix:~# cp /home/luis/intro-angelitos.gsm /usr/share/asterisk/sounds/es/
Cambio el fichero extensions.conf
y recargo dialplan desde el CLI
; Extensión 200 para demostrar reproducción de un audio
exten => 200,1,NoOp(Reproducir mi audio)
exten => 200,2,Playback(intro-angelitos)
exten => 200,3,Hangup()
La prueba consistía en hacer login como usuario/extensión 200
en un softphone y llamarle, ver como reproducía mi locución y luego colgar. Obviamente no tiene mucho sentido, pero era eso, una simple prueba.