Instalación de A2Billing
Instalación de A2Billing
Instalación de A2Billing
A2billing es un clase 4 y clase 5 softswitch para Asterisk distribuido bajo una licencia Open Source
(GNU GPL) y basado en MySQL/MariaDB para las base de datos y PHP como lenguaje de
programación.
Se puede utilizar:
A2billing requiere por lo menos la versión 5.3 de PHP. En Almalinux 8 está disponible la versión 7.2
pues se instalará junto al servidor Web Apache y el modulo SSL (para conexiones seguras hacia el
servidor Web):
dnf install php php-gd php-mysqlnd php-process httpd mod_ssl php-cli php-soap php-xml -y
Como se va a utilizar el acceso cifrado al servidor Web, hay que crear el certificado para el subdominio
asociado al servidor. Primero se instala el programa:
se crea el certificado:
certbot certonly
Ahora hay que modificar el archivo de configuración de apache para modificar la parte relacionada con
el certificado creado
SSLCertificateFile /etc/letsencrypt/live/sip10.voztovoice.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sip10.voztovoice.org/privkey.pem
Se guardan los cambios. Se reinicia el cortafuegos:
Terminada esta operación, se configura la zona horaria en el archivo de configuración de PHP (php.ini)
date.timezone = America/Bogota
upload_max_filesize = 2M
upload_max_filesize = 8M
De esta forma se podrán cargar los archivos de tarifas que tengan un tamaño de hasta de 8 MegaBytes
De esta forma en el LOG de apache aparecerán solamente los errores relacionados con el lenguaje PHP.
Se guardan los cambios y se descarga la ultima versión disponible de A2Billing desde GitHub:
cd /usr/local/src
cd a2billing
A partir de la versión 2.1.1 se utiliza Composer para instalar toda las dependencias necesaria:
mysql
se otorgan los permisos de acceso a la base de datos creada al usuario a2user identificado con la
contraseña sesamo:
mysql> quit
Bye
Se crean las tablas en la base de datos a2billing utilizando el script presente en la siguiente carpeta:
cd DataBase/mysql-5.x/
chmod +x install-db2.sh
luego se ejecuta:
./install-db2.sh
Se instalan las locuciones audio distribuidas con el programa (ingles, francés, español, portugués y
ruso):
cd /usr/local/src/a2billing/addons/sounds/
./install_a2b_sounds.sh
Como las locuciones en español no son de muy buena calidad, se descarga el archivo que sigue que
contiene las locuciones mejoradas:
cd /tmp
wget https://campus.voztovoice.org/a2bsip/a2billing-locuciones-es.tar
se descomprimen:
mv *.wav /var/lib/asterisk/sounds/es/
mv: ¿sobreescribir '/var/lib/asterisk/sounds/es/vm-and.wav'? (s/n) y
cp /usr/local/src/a2billing/a2billing.conf /etc/
[database]
hostname = localhost
port =
user = a2billing_dbuser
password = a2billing_dbpassword
dbname = a2billing_dbname
dbtype = mysql
[database]
hostname = 127.0.0.1
port = 3306
user = a2user
password = sesamo
dbname = a2billing
dbtype = mysql
De esta forma el programa se conectará correctamente a la base de datos a2billing que se acaba de
crear. Se guardan los cambios.
Por defecto A2billing trabaja con Asterisk en Realtime, es decir que las extensiones SIP y IAX2 se
guardan en la base de datos a2billing y Asterisk accede a ellas a través de la configuración del modulo
de Realtime. Existe también la posibilidad de guardarlas en un archivo de texto. Para este tipo de
configuración se crean dos archivos que son los que a2billing utilizaría para guardar las extensiones
SIP y IAX2:
touch /etc/asterisk/additional_a2billing_iax.conf
touch /etc/asterisk/additional_a2billing_sip.conf
se asignan los permisos de escritura/lectura para estos dos archivos al usuario y grupo apache, es decir
al servidor Web:
A2Billing para recargar la configuración de Asterisk (en el caso que las extensiones se guarden en los
archivos que se acaban de crear) y para generar las llamadas de callback se apoya al AMI (Asterisk
Manager Interface) de la PBX. Es por eso que hay que configurar el archivo manager.conf. Se abre:
nano /etc/asterisk/manager.conf
enabled=yes
allowmultiplelogin = yes
dislplayconnects=yes
A2billing, para conectarse al AMI de Asterisk, se instala con un usuario y una contraseña predefinidos.
Por este motivo al final del archivo se añaden las siguientes lineas:
[myasterisk]
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.255
secret=mycode
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,user,config,command,reporting,originate
Se guardan los cambios y se continua con los script AGI presentes en el paquete de A2Billing. Uno se
utiliza para realizar las llamadas (a2billing.php) y el segundo para monitorear el servidor
(a2billing_monitoring.php). Se entra en la carpeta que contiene los AGI:
cd /usr/local/src/a2billing/AGI
se crean dos enlaces simbólicos de los dos AGI en la carpeta /var/lib/asterisk/agi-bin donde Asterisk
busca los AGI que se ejecuten:
ln -s /usr/local/src/a2billing/AGI/a2billing.php /var/lib/asterisk/agi-bin/a2billing.php
ln -s /usr/local/src/a2billing/AGI/a2billing_monitoring.php /var/lib/asterisk/agi-bin/a2billing_monitoring.php
Como los AGI se apoyan en una serie de librerías contenidas en la carpeta /lib, se crea un enlace
simbólico también a esta carpeta:
ln -s /usr/local/src/a2billing/AGI/lib /var/lib/asterisk/agi-bin/lib
chmod +x /var/lib/asterisk/agi-bin/a2billing.php
chmod +x /var/lib/asterisk/agi-bin/a2billing_monitoring.php
Una vez terminada esta parte se crean una series de carpetas. La primera es donde se instalará la parte
web de A2Billing:
mkdir /var/www/html/a2billing
La segunda donde se guardarán los archivos temporales y los script de A2Billing:
mkdir -p /var/lib/a2billing/script
la tercera donde se guardará el proceso del servicio de callback y de los trabajos programados (cron):
mkdir -p /var/run/a2billing
Como esa carpeta se borra cada vez que se reinicia el servidor, para que se vuelva a crear de manera
automática:
nano /etc/tmpfiles.d/a2billing.conf
se copia la linea:
se guardan los cambios: Ahora ya se puede crear un enlace simbólico a las carpetas que se necesitan
para la parte Web de A2billing que son:
ln -s /usr/local/src/a2billing/admin/ /var/www/html/a2billing/admin
ln -s /usr/local/src/a2billing/agent/ /var/www/html/a2billing/agent
ln -s /usr/local/src/a2billing/customer/ /var/www/html/a2billing/customer
ln -s /usr/local/src/a2billing/common/ /var/www/html/a2billing/common
Se cambian los permisos en estas tres carpetas donde se guardarán los archivos temporales para cada
tipo de usuario:
Se cambia el usuario y grupo que tiene acceso a todas las carpetas creadas (el servidor Web Apache):
Los registros de las actividades de A2Billing se guardan en una serie de archivos que hay que crear
antes de acceder por primera vez a la pagina de administración. Primero se crea la carpeta:
mkdir /var/log/a2billing
cd /var/log/a2billing
chown apache:apache *
A2biblling necesita que se ejecuten una serie de script para monitorear el sistema y para elaborar
algunas funciones (ejemplo: pagos, facturas, etc.). Estos script se añaden al cron del sistema:
crontab -e
# A2Billing
# Para actualizar la tasa de cambio de las monedas (OBSOLETO)
# 0 6 * * * php /usr/local/src/a2billing/Cronjobs/currencies_update_yahoo.php
# Para el pago se servicios subscritos
0 6 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_subscription_fee.php
# Para notificaciones cuando el crédito del cliente es más bajo de lo indicado
0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_notify_account.php
# Para el pago de los números geográficos asociados a los clientes
0 2 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_bill_diduse.php
# Para el pago de servicios periódicos
0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_process.php
# Para la generación de las facturas de los clientes
0 6 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_batch_billing.php
# Para la gestión de las alarmas que se pueden configurar en A2Billing
0 * * * * php /usr/local/src/a2billing/Cronjobs/a2billing_alarm.php
# Para archivar los datos de las llamadas más viejos de lo indicado en la configuración de A2Billing
0 12 * * * php /usr/local/src/a2billing/Cronjobs/a2billing_archive_data_cront.php
# Para recargar el crédito de un cliente en automático
0 6 1 * * php /usr/local/src/a2billing/Cronjobs/a2billing_autorefill.php
El demonio para el Callback es el que permite utilizar el sistema de callback (Rellamada) de A2Billing.
El programa está escrito en el lenguaje de programación Python y es por eso que primero hay que
instalar unos paquetes que se necesitan para su compilación:
easy_install sqlalchemy
Una vez satisfechas estas dependencias, se puede empezar con la compilación y instalación del
programa de callback:
cd /usr/local/src/a2billing/CallBack/callback-daemon-py/dist/
cd callback_daemon-1.0.prod-r1528
se compila:
python2setup.py bdist_egg
easy_install dist/callback_daemon-1.0.prod_r1528-py2.7.egg
Compilado el programa se instala come servicio a través de uno script presente en el paquete de
A2Billing:
cd /usr/local/src/a2billing/CallBack/callback-daemon-py/callback_daemon
Se copia el script:
cp a2b-callback-daemon.rc /etc/init.d/a2b-callback-daemon
Se vuelve ejecutable:
chmod +x /etc/init.d/a2b-callback-daemon
Por defecto el servicio guarda los registros en la carpeta /var/log y tiene que arrancar después de
MySQL y Asterisk. Para ese efecto hay que abrir el archivo:
nano /etc/init.d/a2b-callback-daemon
# chkconfig: 2345 40 60
LOG='/var/log/a2b-callback-daemon.log'
# chkconfig: 2345 95 60
LOG='/var/log/a2billing/a2b-callback-daemon.log'
Se guardan los cambios y se configura para que arranque en automático con el sistema:
Si el arranque se queda congelado, terminar con CTRL-C y luego controlar que esté funcionando
correctamente:
tail -f /var/log/a2billing/a2b-callback-daemon.log
Configuración de Asterisk
Como se ha dicho anteriormente, en este curso no se explicarán las configuraciones de Asterisk pero es
importante saber que los archivos que se modifican son solamente los que se necesitan para que
A2Billing funcione.
sip.conf
En el archivo sip.conf se configurarán las troncales para sacar las llamadas hacia el proveedor VoIP.
Antes de la configuración, para conocer las IP disponibles en el servidor:
ifconfig
Aparecerá:
mv /etc/asterisk/sip.conf /etc/asterisk/sip.conf.old
nano /etc/asterisk/sip.conf
[general]
context=default
allowguest=no
allowtransfer=no
realm=asterisk
udpbindaddr=0.0.0.0:5090
tcpenable=no
tcpbindaddr=0.0.0.0:5090
tcpauthtimeout=30
tcpauthlimit=100
transport=udp
srvlookup=yes
pedantic=yes
maxexpiry=3600
minexpiry=60
defaultexpiry=120
mwiexpiry=3600
maxforwards=70
qualifyfreq=120
qualifygap=200
keepalive=yes
disallow=all
allow=ulaw
allow=alaw
mohinterpret=default
mohsuggest=default
language=es
relaxdtmf=no
sendrpid = yes
prematuremedia=no
progressinband=no
useragent=CursoA2BillingPBX
promiscredir=no
dtmfmode = rfc2833
videosupport=yes
maxcallbitrate=384
callevents=yes
alwaysauthreject=yes
rtptimeout=60
rtpholdtimeout=300
allowsubscribe=yes
subscribecontext=subscribe
notifyringing=yes
notifyhold=yes
callcounter = yes
t38pt_udptl = yes,fec,maxdatagram=400
faxdetect=yes
directmedia=no
sdpsession=A2Billing
sdpowner=a2billing
externaddr=162.243.37.95
localnet=10.39.96.0/255.255.255.0
en la penúltima linea se pone la IP publica del servidor y en la ultima la ip privada utilizando la misma
sintaxis indicada en el parámetro de ejemplo. Hay que destacar que Asterisk se ha puesto a la escucha
en el puerto 5090 en lugar del “clásico” 5060. Esto porque el 5060 lo utilizará OpenSIPs.
Siempre en el mismo archivo se añaden los datos para configurar las troncales. En este caso se crean
dos de ejemplo con el mismo proveedor, utilizando la autenticación con usuario y contraseña; la
segunda troncal se utilizará como respaldo de la primera:
[voztovoice1]
type=peer
port=5060
host=sip.voztovoice.eu
defaultuser=24399
fromuser=24399
secret=qALEivJDjeZH4pGH
dtmfmode=rfc2833
disallow=all
context=from-trunk
canreinvite=no
allow=ulaw
allow=alaw
qualify=yes
[voztovoice2]
type=peer
port=5060
host=sip1.voztovoice.eu
defaultuser=24399
fromuser=24399
secret=qALEivJDjeZH4pGH
dtmfmode=rfc2833
disallow=all
context=from-trunk
canreinvite=no
allow=ulaw
allow=alaw
qualify=yes
Para terminar, se incluye el archivo que se ha creado en el primer párrafo y que contendrá las
extensiones creadas en A2Billing en el caso que no se utilice el Realtime:
#include additional_a2billing_sip.conf
Se guardan los cambios y se hace lo mismo con el archivo iax.conf en el caso que se quiera configurar
también extensiones IAX2 (NO ACONSEJADO):
extensions.conf
mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old
nano /etc/asterisk/extensions.conf
[globals]
; Variables globales
[a2billing]
exten => _X.,1,NoOp(A2Billing Start)
same => n,Agi(a2billing.php,1)
same => n,Hangup
exten => h,1,Hangup
Se guardan los cambios y se averigua que efectivamente el dialplan englobado esté presente. Se entra
en la consola de Asterisk:
asterisk -rvvvvvvvvvvvvvv
se recarga el dialplan:
y se escribe el comando:
debe aparecer:
CLI> quit
Asterisk Realtime
Las extensiones creadas a través del sistema de facturación se guardarán en la base de datos de
A2Billing. Para que Asterisk las pueda leer y actualizar, hay que configurar Asterisk utilizando su
funcionalidad, llamada Realtime (ARA), que le permite interactuar con base de datos para la
configuración, en este caso, de las extensiones SIP e IAX
En este curso la configuración se implementará con ODBC en lugar de utilizar directamente MySQL.
El primer paso es configurar Asterisk para que cargue los módulos ODBC antes de todos los demás.
Esto cambio se efectúa modificando el archivo /etc/asterisk/modules.conf. Se abre:
nano /etc/asterisk/modules.conf
;preload = your_special_module.so
se añade:
Como el canal sip de manera predefinida esta desactivado, se elimina esta linea para cargarlo:
noload = chan_sip.so
Como no se va a escribir el dialplan en lenguaje AEL y LUA, es mejor desactivar los dos módulos
juntos a otros módulos que tampoco se van a utilizar. Al final de archivo se pone:
nano /etc/odbcinst.ini
[MariaDB]
Description=ODBC for MariaDB
Driver=/usr/lib/libmaodbc.so
Driver64=/usr/lib64/libmaodbc.so
FileUsage=1
[a2billing]
Description = MySQL a2billing
Driver = MariaDB
Database = a2billing
Server = localhost
User = a2user
Password = sesamo
Port = 3306
Option = 3
Se guardan los cambios y se pasa a Asterisk. En la PBX la configuración Realtime con ODBC se
realiza en dos archivos:
• extconfig.conf
• res_odbc.conf
En el primero se define que las extensiones SIP e IAX deberán ser configuradas en Realtime utilizando
ODBC y la base de datos a2billing:
nano /etc/asterisk/extconfig.conf
Se guardan los cambios. cc_iax_buddies y cc_sip_buddies son las tablas de la base de datos a2billing
donde están guardadas las extensiones creadas desde el sistema de facturación. a2b es el nombre de la
etiqueta inicial del bloque que se configurará en el archivo res_odbc.conf. Para terminar se configura
el archivo res_odbc.conf:
nano /etc/asterisk/res_odbc.conf
[a2b]
enabled => yes
dsn => a2billing
username => a2user
password => sesamo
pre-connect => yes
asterisk -rvvvvvvvvvvvvvvvvv
CLI> quit
Para proteger el servidor Linux de accesos no autorizados hay que instalar un firewall (cortafuegos) y
abrir los puertos que A2Billing necesita para aceptar conexiones externas. Esta es la parte más delicada
de la configuración del servidor porque es donde se definen los puertos y los servicios que son
accesibles desde Internet. Desde la versión 7 de CentOS, el programa para gestionar y configurar el
cortafuegos es firewalld. Aunque sea un sistema muy valido, no he encontrado el equivalente de
algunas reglas que utilizaba con IPtables. Es por este motivo que he preferido continuar a utilizar
IPtables y para hacerlo, en CentOS 7.X, hay que seguir los siguientes pasos:
Instalar IPtables:
Mover la configuración que viene por defecto para crear una nueva:
mv /etc/sysconfig/iptables /etc/sysconfig/iptables.old
IPtables se encarga de gestionar todos los paquetes que entren y salgan del servidor Linux. Para eso
utiliza distintos tipos de tablas:
• la tabla filter donde pasan todos los paquetes en entrada y salida. La tabla filter acepta tres tipos
de opciones (cadenas):
• INPUT para los paquetes en entrada
• OUTPUT para los paquetes en salida
• FORWARD para redireccionar los paquetes
• la tabla NAT se utiliza para rescribir las direcciones y/o los puertos de los paquetes y utilizas las
siguiente cadenas:
◦ PREROUTING
◦ OUTPUT
◦ POSTROUTING
• la tabla MANGLE se utiliza para modificar algunos parámetros de los paquetes (un ejemplo es
marcar los paquetes para que sean procesados y enviados con una prioridad más alta). Utiliza
las siguientes cadenas:
◦ PREROUTING
◦ POSTROUTING
◦ OUTPUT
◦ INPUT
◦ FORWARD
• la tabla RAW que permite crear exenciones en el procesamiento de los paquetes por parte del
“Connection Tracking System”. Este sistema guarda la información acerca del estado de una
conexión en un espacio de memoria permitiendo luego la aplicación de reglas y filtros a la
conexión misma. Utiliza las cadenas:
◦ PREROUTING
◦ OUTPUT
• La tabla SECURITY utilizada para las reglas del Mandatory Access Control, es decir para las
políticas de seguridad aplicadas en el sistema. Utilizas las cadenas:
◦ INPUT
◦ OUTPUT
◦ FORWARD
Las reglas se definen una por linea y serán procesadas por IPTABLES siguiendo la misma secuencia.
Se rechaza (REJECT) todo el trafico entrante con destino las IP 127.0.0.0/127.255.255.255 menos los
paquetes para la interfaz -lo
Se aceptan todos los paquetes en entrada de conexiones ya establecidas, o relacionados con conexiones
establecidas. Véase protocolo TCP
Se deja pasar todo el trafico en entrada para el protocolo SSH (puerto 22 tcp)
Se deja pasar todo el trafico en entrada para el protocolo HTTP (puerto 80 tcp)
Se deja pasar todo el trafico en entrada para el protocolo HTTPs (puerto 443 tcp)
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
Se bloquea el trafico sobre el puerto 5060 procedente de los más conocidos programas de escaneo de
servidores/PBX SIP utilizados para ataques y fraudes de llamadas:
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "friendly-scanner" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipcli" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "VaxSIPUserAgent" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipvicious" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sundayddr" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "iWar" --algo bm -j DROP
iptables -A INPUT -p udp -m udp --dport 5060 -m string --string "sipsak" --algo bm -j DROP
Se deja pasar todo el trafico en entrada destinado al puerto udp 5060 (protocolo SIP) donde escuchará
OpenSIPs
Se deja pasar el trafico hacia Asterisk (puerto 5090), para que los usuarios puedan registrarse
directamente en Asterisk. Una vez instalado y configurado OpenSIPs, como las extensiones se
registrarán directamente en el Proxy SIP, esta linea se quitará:
Se deja pasar todo el trafico en entrada destinado a los puertos udp que van de 10000 a 20000
(protocolo RTP)
A este punto, ya que se han definido los puertos base que se necesitan abiertos, se bloquea todo el
trafico restante.
Se inicia el servicio:
Ahora que se ha terminado con la configuración del servidor y de A2Billing se reinicia el sistema para
averiguar que todos los servicios arranquen correctamente:
reboot
Primer acceso
Reiniciado el servidor se vuelve a entrar con el cliente SSH y se accede a la consola de Asterisk:
asterisk -rvvvvvvvvvvvvvv
aste
https://sip10.voztovoice.org/a2billing/admin
Debe aparecer:
User: root
Password: changepassword
Lo primero que hay que hacer es crear un nuevo administrador y borrar el predefinido. Se entra en el
menú ADMINS → Add :: Search: