Documentos de Académico
Documentos de Profesional
Documentos de Cultura
- Instala las dependencias necesarias de los módulos que pretendas usar, en este
caso solo habilitaré el módulo “db_mysql” por lo que necesitamos las librerías
devel de MySQL, ¡aha! uElastix ya las trae instaladas. Pero aún así necesitamos unas
cuantas(estoy instalando paquetes de más para su uso futuro) :
2.- Una vez que haya terminado la instalación vamos a crear el directorio para bajar
las fuentes de OpenSIPS:
# cd /usr/src/
# mkdir opensips
# cd opensips/
3.- Descargamos las fuentes de OpenSIPS desde el repositorio de GIT. Uso GIT
porque hubo un problema con las fuentes originales y la arquitectura ARM,
después de reportar el problema los desarrolladores de OpenSIPS amablemente lo
corrigieron y actualizaron las fuentes en GIT.
5.- Después de que haya terminado vamos a crear el directorio en /etc que
contedrá los archivos de configuración:
# mkdir /etc/opensips
6.- Ahora crearemos el archivo de configuración para crear la base de datos de
OpenSIPS:
# nano /etc/opensips/opensipsctlrc
# $Id$
#
# The OpenSIPS configuration file for the control tools.
#
# Here you can set variables used in the opensipsctl and opensipsdbctl setup
# scripts. Per default all variables here are commented out, the control tools
# will use their internal default values.
## chrooted directory
# $CHROOT_DIR="/path/to/chrooted/directory"
## database host
DBHOST=localhost
# SQL definitions
# If you change this definitions here, then you must change them
# in db/schema/entities.xml too.
# FIXME
# FOREVER="2020-05-28 21:32:15"
# DEFAULT_ALIASES_EXPIRES=$FOREVER
# DEFAULT_Q="1.0"
# DEFAULT_CALLID="Default-Call-ID"
# DEFAULT_CSEQ="13"
# DEFAULT_LOCATION_EXPIRES=$FOREVER
# awk tool
# AWK="awk"
# grep tool
# GREP="grep"
# sed tool
# SED="sed"
# Describe what additional tables to install. Valid values for the variables
# below are yes/no/ask. With ask (default) it will interactively ask the user
# for an answer, while yes/no allow for automated, unassisted installs.
#
## ACL names - if VERIFY_ACL is set, only the ACL names from below list
## are accepted
# ACL_GROUPS="local ld int voicemail free-pstn"
# cd scripts/
# opensipsdbctl create opensips
8.- Ahora hay que crear el archivo de configuración de OpenSIPS, el que cargará los
módulos y contendrá las reglas del proxy, balanceo de carga etc. Esto se puede
hacer utilizando el programa “osipsconfig” y escoger crear script para balanceo de
cargas.
Como en este ejemplo la idea es que OpenSIPS reciba las llamadas de un
proveedor SIP y las redireccione a los nodos con menor carga para su
procesamiento necesitamos de 3 módulos principalmente:
Ya que nuestro hardware es limitado tenemos que cambiar el tamaño del hash a
solo 128, esto dentro del módulo dialog, debe quedar así:
debug=6
log_stderror=no
log_facility=LOG_LOCAL0
log_name="opensip_LB_5260"
listen=udp:10.0.1.120:5260
Algo muy importante es indicar la ruta de los módulos, en este caso los modulos se
encuentran en: “/usr/lib/opensips/modules/”:
mpath="/usr/lib/opensips/modules/"
Acerca de la lógica del balanceo de carga podemos usar el ejemplo que trae por
default, en mi caso lo estoy utilizando de esta manera:
if(load_balance("1","pstn")){
xlog("sending call to $du\n");
t_relay();
exit;
}else{
send_reply("500","No Destination available");
exit;
}
resource: Una cadena o lista de cadenas separadas por punto y coma que indican
los recursos a usar, en mi caso “pstn”.
alg: Es el algoritmo a usar para definir la carga en uso, puede ser 0 o 1. 0 es para
usar un algoritmo absoluto y 1 para un algoritmo relativo.
fork=yes
children=4
/* comment the next line to enable the auto discovery of local aliases
based on revers DNS on IPs */
auto_aliases=no
listen=udp:10.0.1.120:5260 # CUSTOMIZE ME
route{
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
}
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if (is_method("BYE")) {
setflag(ACC_DO); # do accounting ...
setflag(ACC_FAILED); # ... even if the transaction fails
} else if (is_method("INVITE")) {
# even if in most of the cases is useless, do RR for
# re-INVITEs alos, as some buggy clients do change route set
# during the dialog.
record_route();
}
# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans())
t_relay();
exit;
} else if (!is_method("INVITE")) {
send_reply("405","Method Not Allowed");
exit;
}
if ($rU==NULL) {
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
t_check_trans();
# record routing
record_route();
setflag(ACC_DO); # do accounting
if(load_balance("1","pstn")){
xlog("sending call to $du\n");
t_relay();
exit;
}else{
send_reply("500","No Destination available");
exit;
}
t_on_failure("GW_FAILOVER");
route(RELAY);
}
route[RELAY] {
if (!t_relay()) {
sl_reply_error();
};
exit;
}
failure_route[GW_FAILOVER] {
if (t_was_cancelled()) {
exit;
}
if ( load_balance("1","channel") ) {
t_on_failure("GW_FAILOVER");
t_relay();
exit;
}
send_reply("500","All GW are down");
}
}
local_route {
if (is_method("BYE") && $DLG_dir=="UPSTREAM") {
acc_log_request("200 Dialog Timeout");
}
}
# nano /etc/init.d/opensips
#!/bin/bash
#
# Startup script for OpenSIPS
#
# chkconfig: - 85 15
# description: OpenSIPS is a fast SIP Server.
#
# processname: opensips
# pidfile: /var/run/opensips.pid
# config: /etc/opensips/opensips.cfg
#
### BEGIN INIT INFO
# Provides: opensips
# Required-Start: $local_fs $network $named
# Should-Start: mysqld postgresql
# Short-Description: start, stop OpenSIPS
# Description: OpenSIPS is a very fast and flexible SIP (RFC3261) server.
### END INIT INFO
# compare configs
if [ `md5sum $configfile|awk '{print $1}'` != `md5sum $configfil
e.tmp|awk '{print $1}'` ]; then
mkdir -p "$m4archivedir"
mv "$configfile" "$m4archivedir/$prog.cfg-`date +%Y%m%d_
%H%M%S`"
fi
mv "$configfile.tmp" "$configfile"
chown root:root $configfile
chmod 640 $configfile
fi
stop() {
echo -n $"Stopping $prog: "
# check whether OpenSIPs is running
if ! status -p $pidfile $prog > /dev/null 2>&1 ; then
echo -n "not running" && warning && echo
return 0
fi
exit $RETVAL
10.- Ya falta poco, ahora hay que añadir los valores a nuestra base de datos antes
de iniciar el servicio de OpenSIPS. Entramos al cli de MySQL y añadimos los nodos
que vamos a usar para balancear las llamadas(recuerda la contraseña de MySQL es:
palosanto):
# mysql -p opensips
+----+----------+---------------------+-----------+------------+----------------
-------+
| id | group_id | dst_uri | resources | probe_mode | descriptio
n |
+----+----------+---------------------+-----------+------------+----------------
-------+
| 1 | 1 | sip:10.0.1.103:5060 | pstn=1 | 1 | Asterisk1-onRPi
|
| 2 | 1 | sip:10.0.1.102:5060 | pstn=1 | 1 | Asterisk2-onSha
ka |
| 3 | 1 | sip:10.0.1.120:5060 | pstn=1 | 1 | Asterisk3-onAsi
ri |
+----+----------+---------------------+-----------+------------+----------------
-------+
Se añadieron 3 servidores al grupo “1”, cada uno con un recurso llamado “pstn” el
cuál tiene un máximo de 1 llamada, para ambientes reales sustituir con las llamadas
que se desean.
11.- Ahora vamos a añadir los valores de la cuenta sip que vamos a registrar:
Como podemos ver este comando es muy útil para saber cuántos nodos hay, cuál
es su capacidad máxima y por último cuántas llamadas/carga tiene actualmente.
14.- Para saber el estado del registro de la línea SIP usaremos el comando: