Instalación de Asterisk 16 con el canal PJSIP – CentOS 8

Asterisk PBX es el programa Open Source, distribuido bajo licencia GPLv2, más conocido y utilizado, en sus diferentes presentaciones, para implementar una PBX (central telefónica). Para una lista completa de las funcionalidades brindadas, pueden visitar la Wiki de los desarrolladores. Entre ellas:

  • Registro (CDR) de las llamadas

  • Grabación de llamadas

  • Desvío de llamadas

  • Trasferencia de llamadas

  • Conferencias audio

  • Música en espera

  • Gestión de colas (Centro de llamadas)

  • Soporte para tarjetas y Gateway FXO, FXS, digitales y celulares

  • Soporte IPv6

  • Creación de contestadoras automáticas: IVR

  • Soporte para WebRTC

Este documento abarca la instalación de Asterisk en un VPS (Servidor Virtual Privado) remoto y es valida para cualquier Servidor Linux CentOS 8.X. Con el VPS remoto la ventaja es tener una PBX siempre activa, independiente de la banda ancha disponible en la casa/oficina y evita tener una computadora dedicada y siempre encendida.

 

Utilidades, librerías, dependencias

Antes de la compilación de Asterisk, se instalarán toda una serie de librerías y dependencias que permitirán obtener una instalación de casi todos los módulos disponibles en la PBX. Antes de empezar con la instalación de los paquetes, se activan los repositorios PowerTools:

dnf config-manager --set-enabled PowerTools

Se empieza con Vorbis que es una librería para la compresión/descompresión audio:

dnf install libvorbis libvorbis-devel vorbis-tools libogg libogg-devel -y

Para los formatos audio GSM y Opus se instalan los relativos paquetes:

dnf install gsm gsm-devel opus-devel opus -y

Para la instalación del codec audio Opus, disponible desde la versión 13.12 de Asterisk, hay que instalar, desde los repositorios epel, la siguiente librería:

dnf --enablerepo=epel install xmlstarlet -y

se sigue con CURL que es un cliente que permite recibir y/o enviar archivos utilizando los protocolos HTTP, HTTPS, FTP, GOPHER, DICT, TELNET:

dnf install curl curl-devel libidn-devel -y

se instalan todas las librerías y dependencias que se necesitarán luego para la compilación de las fuentes de la PBX:

dnf install gcc ncurses-devel make gcc-c++ zlib-devel libtool bison-devel bison net-tools \

openssl-devel bzip2-devel wget newt-devel subversion flex gtk2-devel bzip2 patch libedit-devel -y

En CentOS 8, para la gestión de la base de datos, ya no está presente por defecto MySQL sino MariaDB:

dnf install mariadb mariadb-server mariadb-devel -y

UNIXODBC que es la implementación Linux de los API ODBC que permiten conectarse a muchos sistemas de gestión de base de datos (ej: MySQL/MariaDB):

dnf install unixODBC unixODBC-devel mariadb-connector-odbc libtool-ltdl-devel -y

Como la base de datos interna de Asterisk se basa en SQLite, se instala el paquete del programa y el paquete de desarrollo:

dnf install sqlite sqlite-devel -y

Libuuid y uiid para la correcta compilación de las librerías de PJSIP y el correcto funcionamiento del protocolo ICE en Asterisk:

dnf install libuuid libuuid-devel uuid uuid-devel -y

Se continua con la instalación de otros formatos audio: SPEEX y WAW:

yum install speex speex-devel wavpack wavpack-devel -y

Se continua con LAME que es utiliza para codificar/decodificar archivos audio en formato MP3 (se instalará desde las fuentes):

cd /usr/src

wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz

Se descomprime:

tar -xf lame-3.100.tar.gz

Se entra en la carpeta creada:

cd lame-3.100

Se inicia la compilación:

./configure --prefix=/usr --libdir=/usr/lib64

La mayoría de los programas que se compilan desde las fuentes se instalan por defecto en la carpeta /usr/local. Es por eso que en la linea del configure se especifica que la carpeta donde se quiere que se instalen es la /usr. Lo mismo pasa con las librerías del programa. Como el sistema es 64bit se especifica la carpeta donde se quiere que se instalen las librerías. Se continua con:

make

el comando make compila las fuentes creando todos los archivos ejecutables y librerías que luego se instalarán con el comando que sigue:

make install

Se continua con LIBMAD que es un MPEG audio decodificador de alta calidad:

cd /usr/src

wget http://prdownloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz

tar -xf libmad-0.15.1b.tar.gz

cd libmad-0.15.1b

./configure --prefix=/usr --libdir=/usr/lib64

Para que la compilación tenga éxito hay que modificar una linea del archivo Makefile:

nano +129 Makefile

CFLAGS = -Wall -g -O -fforce-mem -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2

para que quede:

CFLAGS = -Wall -g -O -fforce-addr -fthread-jumps -fcse-follow-jumps -fcse-skip-blocks -fexpensive-optimizations -fregmove -fschedule-insns2

se continua con la compilación e instalación:

make

make install

Se termina esta primera parte con SOX que es un programa que permite la manipulación de archivos audio con la posibilidad de pasarlos de un formato a otro:

cd /usr/src

wget http://downloads.sourceforge.net/project/sox/sox/14.4.2/sox-14.4.2.tar.gz

tar -xf sox-14.4.2.tar.gz

cd sox-14.4.2

./configure --prefix=/usr --libdir=/usr/lib64

Al finalizar el configure aparecerá esta tabla donde se encontrarán todos los formatos audio que se podrán manipular con SOX:

Se termina con la compilación e instalación:

make && make install

 

Res_fax, GoogleVoice, LibiCAL y SRTP

En este párrafo se verá como instalar SpanDSP, un procesador de señales digitales que en Asterisk permite la instalación del modulo res_fax para la recepción y envío de faxes, y IKSEMEL que permite implementar el protocolo XMPP en Asterisk y de esta forma conectarse a GoogleVoice o a cualquier servidor de tipo XMPP (otro ejemplo es Openfire):

Para SpanDSP se necesita instalar primero las librerías libtiff y libxml2:

dnf install libtiff libtiff-devel libxml2 libxml2-devel -y

se continua con SpanDSP desde los repositorios EPEL:

dnf --enablerepo=epel install spandsp spandsp-apidoc spandsp-devel -y

El protocolo XMPP permite conexione seguras entre cliente y servidor utilizando el protocolo TLS; para ese efecto se instala, antes de IKSEMEL, las relativas librerías:

dnf install gnutls gnutls-devel gnutls-utils -y

luego IKSEMEL desde las fuentes:

cd /usr/src

wget https://src.fedoraproject.org/lookaside/pkgs/iksemel/iksemel-1.4.tar.gz/...

tar -xf iksemel-1.4.tar.gz

cd iksemel-1.4/

./configure --prefix=/usr --libdir=/usr/lib64

make

make install

OpenLDAP es la versión open source del protocolo Lightweight Directory Access. Normalmente se utiliza para crear un directorio de usuarios que puede ser consultado y/o modificado desde remoto. Muchos programas implementan la posibilidad de conectarse a un servidor OpenLDAP y Asterisk, desde la versión 1.6.X, presenta esta posibilidad:

dnf install openldap openldap-clients openldap-devel -y

SNMP es el Protocolo Simple de Administración de Red y sirve para controlar y monitorear el desempeño del servidor Linux. En Asterisk permite monitorear, entre otras cosas, los canales y las llamadas. Se utilizará junto a NAGIOS para controlar el servidor Asterisk y enviar avisos cuando se verifique algún tipo de problema:

dnf install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils -y

En Asterisk existe la posibilidad de guardar los registros de las llamadas en un servidor RADIUS a través de un cliente RADIUS que hay que instalar. En este caso se instala desde los repositorios EPEL:

dnf --enablerepo=epel install radcli radcli-devel radcli-compat-devel -y

Se continua la preparación del servidor con la instalación del lenguaje de programación LUA que permite escribir el dialplan (o plan de marcado) utilizando este lenguaje. Al terminar la instalación de Asterisk se encontrará un archivo de ejemplo en la carpeta /etc/asterisk.

dnf install lua lua-devel -y

Para ir terminando, se instalan los paquetes que permiten utilizar las funcionalidades calendario de Asterisk. Primero LIBICAL que permite implementar el protocolo iCalendar (RFC5546) a través del modulo res_calendar:

dnf install libical libical-devel -y

Luego NEON que es una librería que permite implementar el protocolo WebDAV (desde las fuentes):

cd /usr/src

wget https://ftp.osuosl.org/pub/blfs/conglomeration/neon/neon-0.31.2.tar.gz

tar -xf neon-0.31.2.tar.gz

cd neon-0.31.2

./configure --prefix=/usr --with-ssl=openssl --libdir=/usr/lib64

Aparecerá:

Se continua con:

make

make install

La librería LIBSRTP que permite implementar el cifrado del flujo media en Asterisk a través del protocolo SRTP (RFC3711):

dnf install libsrtp libsrtp-devel -y

y la liberia Jansson para el soporte de las nuevas REST API:

dnf install jansson jansson-devel -y

Para terminar hay que instalar la librería portaudio y la librería de desarrollo del lenguaje de programación Python requerida por la configuración por defecto de la instalación de la pila SIP PJSIP:

dnf --enablerepo=epel install portaudio portaudio-devel python36-devel unbound-devel -y

 

Instalación de Asterisk

Terminada la preparación del servidor, se inicia con la instalación de Asterisk. Se descarga la ultima versión 16.X disponible:

cd /usr/src

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current...

tar -xf asterisk-16-current.tar.gz

cd asterisk-16.17.0

Para la compilación de Asterisk con el canal chan_pjsip:

./configure --libdir=/usr/lib64 --with-jansson-bundled

de esta forma se indica que las librerías y los módulos se instalarán en la carpeta /usr/lib64 y que el mismo Asterisk se encargará de descargar la ultima versión disponible de la librería Jansson. Si a lo largo del configure se presenta algún error, es posible que esté relacionado con la opciones de compilación del PJSIP. Todas las opciones predefinidas se encuentran en el archivo:

nano /usr/src/asterisk-16.17.0/third-party/pjproject/Makefile.rules

que en casos muy puntuales se pueden modificar. Con el próximo comando se accede a un interfaz de texto donde es posible seleccionar y/o de-seleccionar los módulos de Asterisk que se quieren compilar e instalar:

make menuselect

Desde la versión 1.8.X lo que antes era un paquete a parte (asterisk-addons) es ahora presente en el paquete principal de Asterisk Se entra en el menú Add-ons y se activan los paquetes que siguen:

En el menú Channel Drivers el nuevo canal chan_pjsip aparecerá activado por defecto y se desactiva el canal chan_sip:

En Codec Translators se seleccionan todos los módulos presentes después ed la etiqueta External:

En “Resource modules” se controla que los módulos relacionados con la nueva pila PJSIP y el cifrado del flujo media estén activados:

En Compiler Flags se de-selecciona el parámetro BUILD_NATIVE (SOLAMENTE PARA INSTALACIONES EN VPS):

Se seleccionan todos los módulos en el menú Utilities y AGI Samples:

En Core Sound Packages se seleccionan todos los paquetes disponibles del idioma EN:

En Music On Hold File Packages se seleccionan todos los paquetes:

En Extra Sound Packages se seleccionan los paquetes disponibles del idioma EN:

Se guarda la configuración presionando la tecla tabulador hasta posicionarse sobre Save & Exit. Se termina con la compilación e instalación:

make

Si a lo largo de la compilación aparece este aviso:

se soluciona con:

contrib/scripts/get_mp3_source.sh

y luego otra vez con el make:

make

se instala Asterisk PBX:

make install && make install-logrotate

llegados a este punto, hay dos opciones. La primera es instalar una configuración mínima que ya permite utilizar la centralita con una configuración de prueba. Esta configuración mínima incluye extensiones pjsip, buzón de voz, dos colas de espera, conferencias audio, dialplan (plan de marcado). Para instalarla el comando es:

make basic-pbx

en nuestro caso se instalarán todos los archivos de configuración predefinidos con el comando:

make samples

con el próximo comando se instala el script de arranque de Asterisk que permitirá iniciar la PBX al boot de Linux:

make config

Para la instalación de las locuciones en español (con acento argentino):

mkdir -p /tmp/es

cd /tmp/es

wget https://www.asterisksounds.org/sites/asterisksounds.org/files/sounds/es-...

wget https://www.asterisksounds.org/sites/asterisksounds.org/files/sounds/es-...

Para las locuciones con acento mexicano o español, visiten la siguiente pagina. Ahora se instala unzip y se descomprimen los dos archivos:

dnf install unzip -y

unzip asterisk-sounds-core-es-AR-1.11.3.zip

unzip asterisk-sounds-extra-es-AR-1.11.3.zip

Aparecerá:

replace LICENSE.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y

inflating: LICENSE.txt

se mueve la carpeta creada:

cd ..

mv es/ /var/lib/asterisk/sounds/

Por temas de seguridad se iniciará Asterisk con usuario y grupo asterisk en lugar del usuario root. Primero se crea el grupo:

groupadd asterisk

luego el usuario asterisk:

useradd -r -d /var/lib/asterisk -g asterisk asterisk

se modifican los permisos de las carpetas utilizadas por Asterisk:

chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,run,spool}/asterisk /usr/lib64/asterisk

Se abre el archivo que el script de arranque de Asterisk lee cuando se ejecuta:

nano /etc/sysconfig/asterisk

se modifican las siguientes dos lineas, para que queden:

#AST_USER="asterisk"

#AST_GROUP="asterisk"

para que queden:

AST_USER="asterisk"

AST_GROUP="asterisk"

Se guardan los cambios. Por ultimo se modifica el archivo que contiene la configuración predefinida de Asterisk:

nano /etc/asterisk/asterisk.conf

se modifican estas dos lineas:

;runuser = asterisk ; The user to run as.

;rungroup = asterisk ; The group to run as.

para que queden:

runuser = asterisk

rungroup = asterisk

Se guardan los cambios. Como en la versión 8 de CentOS el cliente radius ha cambiado, para que la configuración de Asterisk sea correcta, se ejecutan los siguientes comandos:

sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf

sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf

sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf

Terminada la instalación, se procede con la configuración de MariaDB para crear la base de datos y la tabla donde se guardarán los registros de las llamadas (CDR). Se inicia:

systemctl start mariadb

se configura para que arranque en automático:

systemctl enable mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service

y se crea una contraseña para el usuario root de MariaDB:

IMPORTANTE: en sistemas en producción utilizar contraseñas fuertes

mysqladmin -u root password 9rPMs5pjCBpbrsFW

Para mejorar la seguridad  del servidor MariaDB se ejecuta el programa:

mysql_secure_installation

Se contestan las preguntas somo sigue:

Enter current password for root (enter for none): 9rPMs5pjCBpbrsFW
OK, successfully used password, moving on...

Change the root password? [Y/n] n
 ... skipping.

Remove anonymous users? [Y/n] y
 ... Success!

Disallow root login remotely? [Y/n] y
 ... Success!

Remove test database and access to it? [Y/n] y
 - Dropping test database...

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Se configura la zona horaria en MariaDB:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p9rPMs5pjCBpbrsFW mysql
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.

nano /etc/my.cnf.d/mariadb-server.cnf

Bajo la etiqueta [mysqld] se añade (personalizar según su País):

default-time-zone = America/Bogota

Se guardan los cambios. Para evitar este tipo de ERROR:

se desactiva complemente el Plugin gssapi:

nano /etc/my.cnf.d/auth_gssapi.cnf

comentando esta linea:

plugin-load-add=auth_gssapi.so

para que quede:

#plugin-load-add=auth_gssapi.so

se guardan los cambios y se reinicia el servidor MariaDB:

systemctl restart mariadb

Ahora se crea la base de datos para guardar los registros de las llamadas. Se entra en el cliente de MariaDB utilizando el alias de comando creado anteriormente:

mysql -u root -p9rPMs5pjCBpbrsFW

se crea la base de datos asteriskcdr:

MariaDB [(none)]> create database asterisk;
Query OK, 1 row affected (0.01 sec)

se selecciona:

MariaDB [(none)]> use asterisk
Database changed

MariaDB [asterisk]> CREATE TABLE alembic_version (
    version_num VARCHAR(32) NOT NULL,
    CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);

se crea la tabla cdr (copiando y pegando las lineas que siguen):

MariaDB [asterisk]> CREATE TABLE cdr (
  id bigint(20) NOT NULL auto_increment,
  calldate datetime NOT NULL default '0000-00-00 00:00:00',
  clid varchar(80) NOT NULL default '',
  src varchar(80) NOT NULL default '',
  dst varchar(80) NOT NULL default '',
  dcontext varchar(80) NOT NULL default '',
  channel varchar(80) NOT NULL default '',
  dstchannel varchar(80) NOT NULL default '',
  lastapp varchar(80) NOT NULL default '',
  lastdata varchar(80) NOT NULL default '',
  duration int(11) NOT NULL default '0',
  billsec int(11) NOT NULL default '0',
  disposition varchar(45) NOT NULL default '',
  amaflags int(11) NOT NULL default '0',
  accountcode varchar(80) NOT NULL default '',
  peeraccount varchar(80) NOT NULL default '',
  uniqueid varchar(32) NOT NULL default '',
  linkedid varchar(80) NOT NULL default '',
  userfield varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY callerid (clid)
);

MariaDB [asterisk]> INSERT INTO alembic_version (version_num) VALUES ('54cde9847798');

Desde la versión 1.8 de Asterisk se han añadido dos nuevos campos a la tabla CDR:

    • linkedid
    • peeraccount

que permiten obtener informaciones más detalladas de cada llamada. Se otorgan los permisos de acceso a la base de datos creada al usuario asterisk, desde local

MariaDB [asterisk]> GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'localhost' IDENTIFIED BY '9rPMs5pjCBpbrsFW';

se actualizan los permisos:

MariaDB [asterisk]> flush privileges;

se sale del cliente:

MariaDB [asterisk]> quit

En Asterisk la conexión a la base de datos que contiene la tabla de los registros de las llamadas, se configura en el archivo cdr_mysql.conf.  Se renombra el predefinido:

mv /etc/asterisk/cdr_mysql.conf /etc/asterisk/cdr_mysql.conf.old

se crea uno nuevo:

nano /etc/asterisk/cdr_mysql.conf

se añaden las siguientes lineas:

[global]
hostname=127.0.0.1
dbname=asterisk
table=cdr
password=9rPMs5pjCBpbrsFW
user=asterisk
port=3306
sock=/var/lib/mysql/mysql.sock

Los datos:
    1. [global] – etiqueta inicial del bloque
    2. hostname - nombre de dominio o IP para la conexión al servidor MariaDB
    3. dbname - nombre de la base de datos
    4. table - nombre de la tabla
    5. password - contraseña del usuario que tiene los permisos para acceder a la base de datos creada
    6. user - nombre del usuario que tiene los permisos para acceder a la base de datos
    7. port – puerto donde MariaDB recibirá las conexiones (predefinido 3306)
    8. sock – archivo que se crea (socket) cuando se inicia MariaDB y que se necesita indicar para una correcta conexión cuando en hostname se configura como valor “localhost”

Se guardan los cambios y se cambian los permisos del archivo que se acaba de crear:

chown asterisk:asterisk /etc/asterisk/cdr_mysql.conf

se inicia Asterisk:

systemctl start asterisk

se averigua que esté corriendo:

systemctl status asterisk
● asterisk.service - LSB: Asterisk PBX
   Loaded: loaded (/etc/rc.d/init.d/asterisk; generated)
   Active: active (running) since Wed 2020-07-08 12:08:42 -05; 7s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 112738 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)
 Main PID: 112769 (asterisk)
    Tasks: 82 (limit: 2847)
   Memory: 131.1M
   CGroup: /system.slice/asterisk.service
           ├─112767 /bin/sh /usr/sbin/safe_asterisk
           └─112769 /usr/sbin/asterisk -f -vvvg -c

se entra en la consola:

asterisk -rvvvvvvvvvvvvvvvv

se controla que la conexión a la base de datos esté activa:

CLI> cdr mysql status
Connected to asterisk@127.0.0.1, port 3306 using table cdr for 1 minute, 40 seconds
  Wrote 0 records since last restart

Se sale de la consola:

CLI> quit
Asterisk cleanly ending (0).
Executing last minute cleanups

Para tener la certeza que todo arranque correctamente se reinicia el servidor:

reboot

Si quieren conocer más de Asterisk PBX y el canal PJSIP, apuntense a nuestro curso en linea dedicado

Subscribe to Comments for "Instalación de Asterisk 16 con el canal PJSIP – CentOS 8" Subscribe to VozToVoice - All comments