Cargando...
 

Graficando el tráfico de una red con NfSen

Un gráfico siempre ayuda a visualizar el comportamiento de una red:

Screenshot 11

Para crear un gráfico así se ocupan varias cosas, entre ellas un switch o router que soporte NetFlow, un servidor que capture el stream NetFlow usando nfcapd y que pueda desplegar detalles usando nfdump. En nuestro caso tenemos 3 routers Mikrotik configurados para enviar la información Netflow al servidor. Cómo activar el stream de Netflow v9 en los routers Mikrotik se puede ver acá.

Antes de instalar nada, es preferible crear una partición del disco aparte con suficiente espacio para almacenar los datos de NetFlow que si se llega a llenar no afecte el servidor el si. Para nuestro caso tenemos una máquina virtual con dos discos uno de 20 GB para el sistema y otro de 150 GB para los datos (/flow_base_dir):

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       16G  8.6G  5.9G  60% /
tmpfs                 3.0G     0  3.0G   0% /dev/shm
/dev/xvda1            477M  116M  336M  26% /boot
/dev/xvdb1            148G  126G   16G  90% /flow_base_dir


Comenzamos instalando algunas cosas básicas:

$ sudo apt-get install build-essential
$ sudo apt-get install rrdtool mrtg librrds-perl librrdp-perl librrd-dev \
       libmailtools-perl php5 bison flex



Luego instalamos NFDUMP. Este paquete contiene varias aplicaciones relacionadas a NetFlow como nfcapd, nfdump, nfreplay, nfexpire, nftest, nfgen

$ wget http://noc.ws.nsrc.org/downloads/nfdump-1.6.10p1.tar.gz
$ tar xvzf nfdump-1.6.10p1.tar.gz
$ cd nfdump-1.6.10p1
$ ./configure --enable-nfprofile --enable-nftrack
$ make
$ sudo make install


Ahora instalamos el NfSen (Netflow Sensor) en sí:

$ wget http://noc.ws.nsrc.org/downloads/nfsen-1.3.6p1.tar.gz
$ tar xvzf nfsen-1.3.6p1.tar.gz
$ cd nfsen-1.3.6p1
$ cd etc
$ cp nfsen-dist.conf nfsen.conf


Una vez hecho esto es hora de editar el archivo de configuración nfsen.conf. En este archivo vamos a definir algunas variables como $BASEDIR, que es el directorio donde se guardan todos los archivos capturados. $HTMLDIR, el directorio donde estará la página web visible desde el exterior y claro %sources que define las fuentes de los stream de NetFlow.

Se debe configurar también el usuario que corre Apache:

$WWWUSER = 'www-data';
$WWWGROUP = 'www-data';


Para nuestro caso usamos:

#
# Required for default layout
$BASEDIR = "/flow_base_dir/nfsen";

#
# Where to install the NfSen binaries
$BINDIR="${BASEDIR}/bin";

#
# Where to install the NfSen Perl modules
$LIBEXECDIR="${BASEDIR}/libexec";

#
# Where to install the config files
$CONFDIR="${BASEDIR}/etc";

#
# NfSen html pages directory:
# All php scripts will be installed here.
# URL: Entry point for nfsen: http://<webserver>/nfsen/nfsen.php
$HTMLDIR    = "/var/www/nfsen/";

#
# Where to install the docs
$DOCDIR="${HTMLDIR}/doc";

#
# Var space for NfSen
$VARDIR="${BASEDIR}/var";

#
# The Profiles stat directory, where all profile information
# RRD DBs and png pictures of the profile are stored
$PROFILESTATDIR="${BASEDIR}/profiles-stat";

#
# The Profiles directory, where all netflow data is stored
$PROFILEDATADIR="${BASEDIR}/profiles-data";

#
# Where go all the backend plugins
$BACKEND_PLUGINDIR="${BASEDIR}/plugins";

#
# Where go all the frontend plugins
$FRONTEND_PLUGINDIR="${HTMLDIR}/plugins";

#
# nfdump tools path
$PREFIX  = '/usr/local/bin';

# BASEDIR unrelated vars:
#
# Run nfcapd as this user
# This may be a different or the same uid than your web server.
# Note: This user must be in group $WWWGROUP, otherwise nfcapd
#       is not able to write data files!
$USER    = "netflow";

# user and group of the web server process
# All netflow processing will be done with this user
$WWWUSER  = "apache";
$WWWGROUP = "apache";

# Receive buffer size for nfcapd - see man page nfcapd(1)
$BUFFLEN = 200000;

# Tenemos 3 routers que nos interesa graficar
# Syntax:
#         'ident' => { 'port' => '<portnum>', 'col' => '<colour>', 'type' => '<type>' }
# Ident strings must be 1 to 19 characters long only, containing characters [a-zA-Z0-9_].

%sources = (
        'BB_Zeus'      => { 'port' => '2055', 'col' => '#0000ff', 'type' => 'netflow' },
        'BB_CRIX'      => { 'port' => '2056', 'col' => '#0000ff', 'type' => 'netflow' },
        'BB_GND'       => { 'port' => '2057', 'col' => '#0000ff', 'type' => 'netflow' },
);


Nótese que el puerto por defecto para recibir el stream NetFlow no está definido según el RFC3954, pero el 2055 es muy común usarlo, por lo que ese será nuestra primera fuente, el 2056 y 2057 los usaremos para la segunda y tercera fuente respectivamente.

Con los cambios hechos podemos instalar usando el script que viene con el programa:

sudo perl install.pl etc/nfsen.conf


Para que el programa inicie automáticamente:

$ sudo ln -s /flow_base_dir/nfsen/bin/nfsen /etc/init.d/nfsen
$ sudo update-rc.d nfsen defaults 20


Cuando llegamos a este punto ya tenemos un NfSen funcionando, pero veamos algunas cosas que podemos hacer con él.

Primero que nada, tenemos un gráfico (profile) llamado "live":

Screenshot 12

En sí, este gráfico es parecido al de MRTG mostrando el tráfico general de las fuentes. Lo importante es que usaremos toda la información almacenada en ese perfil para crear otro perfiles tipo "shadow" que no contienen información, sólo gráficos, pero si se requiere se puede extraer del perfil "live". Es por esto que el tamaño del perfil "live" es tan grande:

Screenshot 13


Ahora es cuando podemos ser creativos y hacer todo tipo de gráficos. Por ejemplo uno que muestra el tráfico de los servidores de tiempo:

Screenshot 14

Este gráfico no consume espacio del disco duro porque es del tipo "Shadow"

Screenshot 15


Cada gráfico está compuesto por canales. Cada canal tiene definidos los parámetros que lo caracterizan, desde el color y orden con el que aparecen en el gráfico, hasta el tipo de paquete, puerto, fuente y destino:

Screenshot 16

Cuando definimos un canal usamos "Filter" para definir qué queremos graficar:

proto 17 and port 123 and (ip 200.59.16.34 or ip 2800:640:c::1)


En este caso son paquetes UDP que usen el puerto 123 del servidor que tiene IPv4 200.59.16.34 e IPv6 2800:640:c::1

Cualquier filtro consta de una o más expresiones "expr". Varias "expr" se pueden enlazar entre sí:

expr and expr, expr or expr, not expr,  ( expr ).


"expr" puede ser una de las siguientes primitivas de filtro:

versión del protocolo
inet o ipv4 para IPv4 y inet6 o ipv6 para flows sólo IPv6

protocolo
TCP, UDP, ICMP, GRE, ESP, AH, RSVP or PROTO <num> donde "num" es el número de protocolo.

dirección IP
[FuenteDestino] IP a.b.c.d o
[FuenteDestino] HOST a.b.c.d siendo a.b.c.d cualquier IP válido. FuenteDestino puede ser omitido.

FuenteDestino
define si el IP address puede ser SRC, DST o una combinación de SRC y|o DST. Omitir FuenteDestino es equivalente
a "SRC or DST".

Red
[FuenteDestino] NET a.b.c.d m.n.r.s
[FuenteDestino] NET a.b.c.d / num

a.b.c.d como la red, m.n.r.s como la máscara o num como bits de máscara respectivamente. La red puede escribirse como a.b, a.b.c, donde una clase B o C se asume.

Por ejemplo:

NET 23.15.244.0/24 OR NET 23.79.0.0/16 OR NET 2600:1414::/48

NET 23.15.244.0 255.255.255.0 OR NET 23.79.0.0 255.255.0.0 OR NET 2600:1414::/48

NET 23.15.244 OR NET 23.79 OR NET 2600:1414::/48


Nótese que usamos el operador OR para unir la redes porque queremos graficar todo lo que venga de cualquiera de ellas. Si usaramos AND solo se incluirían los paquetes van van entre ellos, por ejemplo:

NET 23.15.244.0/24 AND NET 23.79.0.0/16


Esto sólo grafica el tráfico entre las redes 23.15.244.0/24 y 23.79.0.0/16. incluso más específico:

DST NET 23.15.244.0/24 AND SRC NET 23.79.0.0/16


Todo lo que sale de la red 23.79.0.0/16 con destino 23.15.244.0/24

Puerto
[FuenteDestino] PORT [comp] num siendo "num" un número de puerto válido y "comp" un comparador. Si "comp" se omite, se asume '='.

Otros comparadores soportados :
=, ==, >, <, EQ (igual a), LT (menor que), GT (mayor que)

Por ejemplo:

net 172.16/16 and src port > 1024 and dst port 80


En muchos casos lo que queremos graficar es el tráfico de redes específicas. Pero como es el caso de grandes redes tipo Netflix, Google, Akamai, etc. los IPs que ellos anuncian cambian constantemente. Es por eso que debemos dinámicamente conseguir esas redes y actualizar los canales que estamos graficando.

Una forma de hacerlo es con un servidor Quagga y unos scripts para tal efecto