Asterisk y Homer SIP Capture Server

Seguramente en algún momento habrán buscado una solución que les permitiera tener una traza de toda la señalización SIP que esté pasando por su PBX. Afortunadamente existe una aplicación que además de ser muy completa y solida, es Open Source. Se llama Homer. Homer es un servidor de captura SIP que permite grabar todo el trafico SIP y visualizarlo cómodamente a través de una interfaz grafica.

¿Cómo funciona?

Para funcionar se apoya a un Proxy SIP (OpenSIPs, Kamailio, Openser) que recolecta toda la señalización SIP  que le envía el “Capture Agent”  . La ventaja de este tipo de solución es que vamos a tener la posibilidad de ver todo ese tipo de trafico en un sitio web (WebHomer).

La parte de la captura está bien explicada en este grafico:

homer1

Todo el trafico procedente de los distintos “dispositivos” (Proxy SIP, SBC, PBX, Capture Agent) se envía al servidor que se encarga de elaborarlo (el Proxy SIP). El Proxy guarda los datos en una base de datos que se puede consultar desde una aplicación Web (WebHomer) con gráficos y estadísticas.

¿Que necesitamos para recolectar el trafico SIP de nuestro Asterisk?

  • Un Proxy SIP (en este caso OpenSIPs)
  • Un servidor web (en este caso Apache) con el modulo rewrite activado
  • El Capture Agent
  • Mysql Server versión > 5.1.48
  • php-pdo y php-gd
  • las librerías pcap

En este caso OpenSIPs, el Capture Agent y la parte Web, se instalarán en el mismo servidor donde está presente Asterisk.

Para empezar instalamos todos los paquetes que se necesitan

yum install subversion php php-pdo php-gd httpd mysql-server mysql-devel libpcap libpcap-devel git

Seguimos bajando la ultima versión disponible de OpenSIPs:

cd /usr/src

svn co https://opensips.svn.sourceforge.net/svnroot/opensips/branches/1.8 opensips_1_8

Entramos en la carpeta:
cd opensips_1_8
y ejecutamos la utilidad para configurar y instalar Opensips:
make menuconfig
homer2

Entramos en el menú “Configure Compile Options”

homer3

Luego se entra en el menú “Configure Excluded Modules”:

homer4

Se selecciona el modulo “db_mysql”. Se regresa al menú anterior con la tecla <--

homer5

Se selecciona el menú “Configure Install Prefix”

homer6

se pone / y se presiona la tecla envío

homer7

Se presiona nuevamente la tecla envío

homer8

Se selecciona el menú “Save Changes”

homer9

nuevamente la tecla envío. Se regresa al menú anterior con la tecla <--

homer10

Se selecciona el menú “Compile And Install OpenSIPs”. Empezará la compilación e instalación de OpenSIPs. Terminada la instalación se regresa al menuconfig:

homer15

Se selecciona “Exit & Save All Changes” y se presiona la tecla envío hasta salir del menú. Se continua instalando y configurando el script de arranque:

cd packaging/fedora

nano opensips.init

Cambiamos esta línea:

oser=/usr/sbin/$prog

para que quede

oser=/sbin/$prog

Guardamos los cambios y volvemos ejecutable el archivo:

chmod 755 opensips.init

Terminamos la configuración:

cp opensips.init /etc/init.d/opensips

chkconfig --add opensips

chkconfig opensips on

Como vamos a utilizar OpenSIPs solamente como servidor de captura de los paquetes, modificamos el archivo de configuración opensips.cfg:

cd /etc/opensips

movemos el predefinido:

mv opensips.cfg opensips.cfg.old

y creamos uno nuevo:

nano opensips.cfg

copiamos las líneas que siguen:

####### Global Parameters #########

debug=3

log_stderror=no

log_facility=LOG_LOCAL0

fork=yes

children=5

disable_tcp=yes

db_default_url="mysql://opensips:opensipsrw@localhost/opensips"

listen=udp:1.2.3.4:9060

####### Modules Section ########

#set module path

mpath="/lib/opensips/modules/"

loadmodule "db_mysql.so"

loadmodule "sipcapture.so"

####### Routing Logic ########

modparam("sipcapture", "db_url", "mysql://homer:sesamo@localhost/homer_db")

modparam("sipcapture", "capture_on", 1)

modparam("sipcapture", "table_name", "sip_capture")

modparam("sipcapture", "hep_capture_on", 1)

####### Routing Logic ########

route {

                sip_capture();

        drop;

}

onreply_route {

                sip_capture();

        drop;

}

Guardamos los cambios. Las líneas importantes son:

  • listen=udp:1.2.3.4:9060 Esta es la dirección IP y el puerto donde OpenSIPs recibirá los paquetes enviados por el “Capture Agent”. Si queremos recibir solamente los paquetes de agentes que están en la misma LAN, ponemos la dirección IP local sino la dirección IP publica. El puerto 9060 es donde el Agente tendrá que enviar los paquetes.
  • modparam("sipcapture", "db_url", "mysql://homer:sesamo@localhost/homer_db") En esta línea se define el nombre de la base de datos donde se guardarán los paquetes capturados junto a usuario y contraseña con acceso a la misma
  • modparam("sipcapture", "table_name", "sip_capture") En esta línea se define el nombre de la tabla donde se guardarán los paquetes capturados.

Ya podemos crear la base de datos como indicado en la la configuración de OpenSIPs:

service mysqld start

mysql -u root -psesamo

mysql> create database homer_db;

Creamos un usuario que tenga los privilegios para la base de datos:

mysql> grant all privileges on homer_db.* to 'homer'@'localhost' identified by 'sesamo';

Salimos del cliente MySQL:

mysql> quit

creamos la tabla sip_capture

mysql -u root -psesamo homer_db < /usr/src/opensips_1_8/modules/sipcapture/sql/sipcapture.sql

Ahora podemos iniciar OpenSIPs:

/etc/init.d/opensips start

Para continuar bajamos e instalamos el Capture Agent:

cd /usr/src

git clone https://code.google.com/p/captagent/ captagent

cd captagent/captagent4

./configure

make

make install

El agente viene con un archivo de configuración que hay que modificar según la configuración de OpenSIPs:

nano /usr/local/etc/captagent/captagent.xml

se modifica este bloque con los datos del Servidor OpenSIPs:

<configuration name="core_hep.conf" description="HEP Socket">

    <settings>

      <param name="version" value="2"/>

      <param name="capture-host" value="1.2.3.4"/>

      <param name="capture-port" value="9060"/>

      <param name="capture-proto" value="udp"/>

      <param name="capture-id" value="Servidor1"/>

      <param name="capture-password" value="sesamo"/>

      </settings>

</configuration>

Se guardan los cambios.

Ya se puede hacer una primera prueba. Se inicia el Capture Agent:

captagent

Aparecerá:

Loaded core config

Loaded load_module

Loaded proto_uni

The Captagent is ready

Se efectúa una llamada desde el servidor Asterisk y se cuelga. Se sale del Capture Agent con CTRL-C y se entra en el cliente MySQL:

mysql -u root -psesamo

Se averigua que en la tabla sip_capture estén los paquetes generados por la llamada que se acaba de hacer:

mysql> use homer_db

mysql> select * from sip_capture

Si aparecen los paquetes, el sistema funciona perfectamente. Salimos del cliente MySQL:

mysql> quit

Ya se puede instalar la parte web. Se descarga WebHomer:

cd /usr/src

git clone https://code.google.com/p/homer/
Se entra en la carpeta de la parte Web:
cd homer/webhomer/
Se copian todos los archivos en el servidor Web:
cp -rf * /var/www/html
Se crea la base de datos para la parte web:
mysql -u root -psesamo
mysql> create database homer;
mysql> grant all privileges on homer.* to 'homer'@'localhost' identified by 'sesamo';
mysql> quit
Se cargan los datos predefinidos
mysql -u root -psesamo homer < sql/homer_users.sql
Para activar las estadísticas en la base de datos homer_db:
mysql -u root -psesamo homer_db < sql/statistics.sql
Se entra en la carpeta del servidor:
cd /var/www/html
se modifica el archivo de configuración:

nano configuration_example.php

Se cambia este bloque:

/* Access db of homer */

define('HOST', "localhost");

define('PORT', 3306);

define('USER', "root");

define('PW', "root");

define('DB', "homer_users");

para que quede:

/* Access db of homer */

define('HOST', "localhost");

define('PORT', 3306);

define('USER', "homer");

define('PW', "sesamo");

define('DB', "homer");

Se modifica el segundo bloque:

define('HOMER_HOST', "localhost"); /* DEFAULT. Don't forget insert this host to your DB nodes table */

define('HOMER_PORT', 3306);

define('HOMER_USER', "homer_user");

define('HOMER_PW', "homer_password");

define('HOMER_DB', "homer_db");

define('HOMER_TABLE', "sip_capture");

para que quede:

define('HOMER_HOST', "localhost"); /* DEFAULT. Don't forget insert this host to your DB nodes table */

define('HOMER_PORT', 3306);

define('HOMER_USER', "homer");

define('HOMER_PW', "sesamo");

define('HOMER_DB', "homer_db");

define('HOMER_TABLE', "sip_capture");

Se modifica el ultimo bloque:

define('PCAPDIR',"/var/www/webhomer/tmp/");

define('WEBPCAPLOC',"/webhomer/tmp/");

define('APIURL',"http://localhost");

define('APILOC',"/webhomer/api/");

para que quede:

define('PCAPDIR',"/var/www/html/tmp/");

define('WEBPCAPLOC',"/tmp/");

define('APIURL',"http://localhost");

define('APILOC',"/api/");

Se guardan los cambios y se renombra el archivo:

mv configuration_example.php configuration.php

Para activar las estadísticas se modifica el siguiente archivo:

nano preferences_example.php

Se cambia esta línea:

define('MODULES', 0);  /* Set to 1 Enable Statistic Modules */

para que quede:

define('MODULES', 1);  /* Set to 1 Enable Statistic Modules */

Se guardan los cambios y se renombra el archivo:

mv preferences_example.php preferences.php

Se cambian los permiso de todos los archivos:

chown -Rf apache:apache *

Para crear las estadísticas hay que ejecutar un script en perl cada N minutos. El script está disponible en las carpeta de webhomer:

cp /usr/src/homer/scripts/statistic.pl /usr/local/bin/

Se abre:

nano /usr/local/bin/statistic.pl

se modifica este bloque:

$version = "0.0.2";

$mysql_table = "sip_capture";

$mysql_dbname = "homer_db";

$mysql_user = "homer_user";

$mysql_password = "homer_password";

$mysql_host = "localhost";

para que quede:

$version = "0.0.2";

$mysql_table = "sip_capture";

$mysql_dbname = "homer_db";

$mysql_user = "homer";

$mysql_password = "sesamo";

$mysql_host = "localhost";

Se vuelve el archivo ejecutable:

chmod +x /usr/local/bin/statistic.pl

Se guardan los cambios y se crea un cronjob para que se recolecte las estadísticas cada 5 minutos:

crontab -e

Se añade la línea que sigue:

*/5 * * * * /usr/local/bin/statistic.pl 2>&1 > /dev/null

Se guardan los cambios y se inicia el Capture Agent en segundo plano:

captagent > /dev/null &

Se inicia el servidor web:

service httpd start

Se accede a la pagina de administración utilizando la IP privado o publica del servidor (según configuración):

homer16

En usuario se pone: test@test.com

Contraseña: test123

Primero se entra en el menú Admin y se modifican los nodos presentes (en nuestro caso uno):

homer17

Luego se modifica “Aliases” para que quede:

homer18

Cambiar 1.2.3.4 con IP publica o privada del servidor.

Se crea un nuevo usuario para acceder a la pagina de administración:

homer19

homer20

Se elimina el predefinido y se sale de la pagina volviendo a acceder con la nueva cuenta. Se entra al menú “Stats”:

homer21

homer22

Para ver las los paquetes capturados se entra al menú “Search”, se selecciona la fecha y la hora de inicio y de fin de la búsqueda, el tipo de transacción “Calls” y se presiona el botón “Search Homer”

homer23

Aparecerá la lista de todos los paquetes enviados/recibidos. Seleccionamos uno:

homer24

homer25

Podemos exportar los paquetes a Wireshark con el botón “PCAP”, seleccionar cada línea para ver el paquete SIP completo y/o guardar el dialogo en formato texto.

Seguramente una aplicación muy cómoda para el análisis y resolución de problemas en la señalización SIP.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

3 comentarios

problema pagina

hola despues de 1 dia entero de prueba y error, al parecer ya logre montar todo. mi problema actual en el cual me quede estancando es que al entrar a la pagina me tira un error , "could not find driver" la imagen alado de la pestaña aparece por lo que veo que algo funciona.
lo que logre investigar es que es algun error de php-pdo pero como dice al principio lo instale. a alguno le paso algo parecido ??

muchas graciass

Suscribirse a Comentarios de "Asterisk y Homer SIP Capture Server" Suscribirse a VozToVoice - Todos los comentarios