Analizando nuestra red (III)

¿Sabemos qué tráfico circula por nuestra red? Al hilo de los distintos posts (Analizando nuestra red, Analizando nuestra red II) de análisis de red que se han ido publicando en este blog hoy vamos a continuar en este tema centrándonos en el análisis del tráfico desde un punto de vista de rendimiento y clasificación del mismo.

Cuando monitorizamos una red, nos solemos centrar en dos puntos, la cantidad de tráfico que atraviesa la red, habitualmente mediante la activación del servicio SNMP y la consulta mediante polling del tráfico de las interfaces de red, mediante alguna herramienta que gráficamente muestre los resultados, como puede ser mrtg o Cacti, y la tipología de dicho tráfico.

Para poder monitorizar que tipo de tráfico circula por nuestra red existen distintas soluciones, aunque nos centraremos en el uso del protocolo netflow; A grandes rasgos, netflow es un protocolo de red desarrollado por Cisco para la monitorización y análisis de tráfico de red, el cual está presente en distintos fabricantes de dispositivos en la actualidad.

La arquitectura netflow esta constituida por tres elementos:

  • Netflow Exporter: el dispositivo de red, habitualmente un router o un switch de gama alta (hay que confirmar previamente que el servicio netflow está soportado), que captura los flujos de datos que circulan por él, enviando información sobre direcciones IP, puertos o protocolos usados.
  • Netflow collector: el elemento que recoge la información enviada por el dispositivo de red y la almacena.
  • Consola de análisis: el sistema a través del cual el gestor de red analiza la información almacenada por el colector.

Para este post hemos usado un Router Cisco 1800 como Netflow Exporter y un sistema GNU/Linux para la implementación del Netflow collector y la consola de análisis.

Una vez tenemos los equipos configurados a nivel de red y por lo tanto, existe conectividad entre ellos, configuramos el colector; para ello, instalamos las herramientas flow-tools en nuestro sistema y configuramos el servicio indicando en el fichero de configuración /etc/flow-tools/flow-capture.conf la información del dispositivo de red que nos enviará la información; por cada dispositivo añadiremos al fichero de configuración una entrada como la siguiente:

-w /var/netflow/flows/completed/router 0/172.18.0.200/9995 -S1

Indicando el directorio donde almacenaremos la información enviada ordenada por fecha (/var/netflow/flows/completed/router), los datos de red del dispositivo de la forma Dirección Local/Dirección Remota/Puerto, por lo que con el parámetro 0/172.18.0.200/9995, indicamos que recibimos información del dispositivo con dirección IP 172.18.0.200 a través del puerto 9995 de cualquiera de las direcciones IP del servidor y en intervalos de un minuto. Una vez arrancado el servicio, ya podemos recibir la información de dispositivo de red.

A continuación procedemos a configurar el servicio Netflow en el router (algunos de éstos comandos son opcionales):

# Indicamos el tiempo durante el cual flujo activo antes de expirar de la caché
Router(config)#ip flow-cache timeout active 1 

# Indicamos el número de entradas en la caché
Router(config)#ip flow-cache entries 20
# Interfaz que usaremos para conectar con el colector
Router(config)#ip flow-export source FastEthernet0/0
# Versión del protocolo
Router(config)#ip flow-export version 5
# Dirección IP y puerto de colector
Router(config)#ip flow-export destination 172.17.2.23 9995 

# Captura de flujos del aplicaciones más usadas
Router(config)#ip flow-top-talkers
# Maximo número de aplicaciones
Router(config-flow-top-talkers)# top 20
# Criterio de ordenación
Router(config-flow-top-talkers)# sort-by bytes
# Filtro de flujos
Router(config-flow-top-talkers)# match destination port min 0 max 65535 

# Interfaz que captura flujos
Router(config)#interface FastEthernet0/0
# Activamos netflow para el tráfico inbound
Router(config-if)# ip flow ingress
# Activamos netflow para el tráfico outbound
Router(config-if)# ip flow egress
# Activamos la cache netflow para el enrutamiento
Router(config-if)# ip route-cache flow

Llegados a este punto, el dispositivo está en disposición de capturar los flujos de tráfico:

Router#show ip flow export
Flow export v5 is enabled for main cache
Exporting flows to 172.17.2.23 (9995)
Exporting using source interface FastEthernet0/0
Version 5 flow records
168 flows exported in 74 udp datagrams
0 flows failed due to lack of export packet
0 export packets were sent up to process level
0 export packets were dropped due to no fib
0 export packets were dropped due to adjacency issues
0 export packets were dropped due to fragmentation failures
0 export packets were dropped due to encapsulation fixup failures
Router#show ip flow top-talkers
SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Bytes
Fa0/0 172.17.2.23 Local 172.18.0.200 06 0016 A4B2 60K
Fa0/0 172.17.2.23 Local 172.18.0.200 06 A332 0017 2567
2 of 20 top talkers shown. 2 of 2 flows matched.

Router#show ip cache flow
IP packet size distribution (19470 total packets):
1-32 64 96 128 160 192 224 256 288 320 352 384 416 448 480
.000 .056 .606 .007 .005 .005 .004 .004 .004 .004 .298 .000 .000 .000 .000

512 544 576 1024 1536 2048 2560 3072 3584 4096 4608
.000 .000 .000 .000 .000 .000 .000 .000 .000 .000 .000

IP Flow Switching Cache, 278544 bytes
2 active, 4094 inactive, 170 added
4303 ager polls, 0 flow alloc failures
Active flows timeout in 1 minutes
Inactive flows timeout in 15 seconds
IP Sub Flow Cache, 21640 bytes
2 active, 1022 inactive, 170 added, 170 added to flow
0 alloc failures, 0 force free
1 chunk, 1 chunk added
last clearing of statistics never
Protocol Total Flows Packets Bytes Packets Active(Sec) Idle(Sec)
-------- Flows /Sec /Flow /Pkt /Sec /Flow /Flow
TCP-Telnet 7 0.0 99 41 0.2 29.0 6.0
TCP-other 44 0.0 155 314 2.0 40.5 5.9
UDP-other 76 0.0 154 74 3.4 0.5 15.5
ICMP 41 0.0 1 139 0.0 0.7 15.4
Total: 168 0.0 114 158 5.6 12.2 12.6

SrcIf SrcIPaddress DstIf DstIPaddress Pr SrcP DstP Pkts
Fa0/0 172.17.2.23 Local 172.18.0.200 06 0016 A4B2 172
Fa0/0 172.17.2.23 Local 172.18.0.200 06 A332 0017 35

A continuación, como gestores de red y a través de la consola de análisis que proporciona flow-tools, ya somos capaces de mostrar la información enviada de una fecha concreta y almacenada en el colector.

Linux:/# flow-cat /var/netflow/flows/completed/test/2013/2013-05/2013-05-15/*
    | flow-print

srcIP          dstIP        prot   srcPort dstPort octets   packets
172.18.0.150   172.18.0.200  1     0       0       518880   360
172.17.0.87    172.18.0.200  6     22      15042   83196    282
172.18.0.150   172.18.0.200  6     55215   23      9560     239
172.17.2.23    172.18.0.200  17    44186   161     71       1
172.17.2.23    172.18.0.200  17    50078   161     71       1
172.17.2.23    172.18.0.200  17    40590   161     73       1
172.17.2.23    172.18.0.200  17    44599   161     73       1
172.17.2.23    172.18.0.200  17    59577   161     73       1

Lógicamente, con estos datos almacenados, es posible configurar una interfaz gráfica, como por ejemplo el plugin Flowview de Cacti, para recoger esta información almacenada y presentarla de forma más amigable para el gestor, pudiendo filtrar los flujos recibidos y crear gráficas por puertos o direcciones IP (pinchar en la imagen para ampliarla).

Para acabar, flow-tools nos permite crear filtros de captura para analizar los flujos recibidos en base a patrones. Si por ejemplo queremos obtener los flujos de tráfico SSH, podríamos crear en un fichero (/tmp/filter) un filtro como el siguiente:

filter-primitive SSH
type ip-port
permit 22

filter-definition FlujoSSH
match ip-destination-port SSH

Y aplicar el filtro a la información almacenada un día concreto:

Linux:/# flow-cat /var/netflow/flows/completed/test/2013/2013-05/2013-05-15/*
    | flow-nfilter -F FlujoSSH -f /tmp/filter | flow-print

srcIP         dstIP         prot    srcPort dstPort octets packets
172.18.0.150  172.18.0.200  6       34498   22      44     1
172.18.0.150  172.18.0.200  6       33169   22      44     1
172.18.0.150  172.18.0.200  6       63712   22      44     1
172.18.0.150  172.18.0.200  6       61025   22      44     1
172.18.0.150  172.18.0.200  6       43271   22      44     1
172.18.0.150  172.18.0.200  6       44450   22      44     1
172.18.0.150  172.18.0.200  6       33121   22      44     1
172.18.0.150  172.18.0.200  6       63119   22      44     1
172.18.0.150  172.18.0.200  6       37077   22      44     1
172.18.0.150  172.18.0.200  6       35145   22      44     1
172.18.0.150  172.18.0.200  6       59776   22      44     1
172.18.0.150  172.18.0.200  6       52694   22      44     1
172.18.0.150  172.18.0.200  6       44754   22      44     1

Con ésta funcionalidad y aunque hay aplicaciones dedicadas a ello, no sería complejo crear un agente que analizara periódicamente los flujos recibidos por el colector en busca de patrones sospechosos o cambios en el uso de la red, como por ejemplo un aumento del uso del protocolo telnet en la red con respecto a información anterior, generando una alerta en nuestro sistema de monitorización.

Comments

  1. Muy interesante tu artículo. Hace tiempo escribí en mi blog cómo hacer un uso completo de netflow. Desde cómo configurar un router a montar un servidor que almacene los datos, y lógicamente extraer información útil.

    Por si a alguien le puede ser de interés:
    http://puppetlinux.blogspot.com.es/search/label/netflow

  2. Muchas gracias por la información, Javier.

  3. Muy buen artículo manuel.

    Gracias por el aporte javier, buena explicación.