Monitoreo de ancho de banda en routers/switches/etc usando MRTG
Luego de tener algunos problemas de saturación de ancho de banda, me volqué a la búsqueda de una herramienta que pueda graficar el uso de los links.
Comencé la búsqueda con herramientas que puedan graficar datos almacenados en archivos pcap, creados con tcpdump o wireshark, para lo cual encontré tcptrace. Si bien tcptrace es una herramienta interesante, me resultó bastante anticuada para lo que yo necesitaba, que era una visualización simple del uso de los links.

Continuando la búsqueda, me orienté a herramientas que obtengan resultados por SNMP, en lugar de archivos pcap. De esta manera fui a dar con Multi Router Traffic Grapher (MRTG). Descubrí que esta herramienta es muy utilizada, e incluso en la propia página de Cisco proveen información sobre cómo usar MRTG (una búsqueda en google "mrtg site:www.cisco.com" mostrará muchos resultados).

Según la descripción en la página oficial:
MRTG monitorea dispositivos de red por SNMP y dibuja lindas imágenes mostrando cuánto tráfico ha pasado a través de cada interfaz.
Si bien la idea parece ser monitorear routers, la herramienta permite ir más allá y monitorear cualquier dispositivo de red que envíe información de uso de interfaces a través de SNMP. Y no sólo eso, también permite monitorear uso de CPU, disco y memoria.
MRTG está escrito en perl y funciona tanto en GNU/Linux como en Windows (además de NetWare... por si a alguien le interesa), y es libre, licenciado mediante GPL.

Si bien llevo un par de días probándolo, MRTG me parece la solución ideal para la tarea de monitoreo de links, y es un adicional muy interesante poder monitorear CPU, memoria y disco. Lo estoy probando con un switch Cisco Catalyst de más de 200 ports y va de lujo.
Este es un ejemplo de los gráficos que muestra:


Bueno, básta de cháchara y pasemos a lo importante, cómo instalar y configurarlo.


Instalación

La instalación es muy simple, dado que el paquete se encuentra en los repositorios de las distribuciones más importantes. Hay que tener en cuenta que se necesita tener un servidor web instalado, como ser Apache.

En debian, MRTG se instala simplemente ejecutando:
  # apt-get install mrtg

Mientras que en derivados de Red Hat (CentOS, Fedora) es:
  # yum -y install mrtg

La instalación crea un archivo de configuración básico que no tiene prácticamente nada. En debian el archivo de configuración es /etc/mrtg.cfg, mientras que en derivados Red Hat es /etc/mrtg/mrtg.cfg. Además se crea un archivo cron en /etc/cron.d/mrtg.
El resto de la explicación la haré basándome en debian, que es donde lo probé, pero para los derivados de Red Hat sólo cambian los paths a los archivos.

En debian hay que crear el directorio que hospede los archivos web. Dependiendo de su configuración del servidor web, el path puede variar, pero por defecto, el directorio se crearía en /var/www:
  # mkdir /var/www/mrtg

Cambiamos el grupo owner para que Apache tenga más permisos sobre los archivos:
  # chown root:www-data /var/www/mrtg


Configuración

La configuración básica de MRTG es muy simple. La forma más rápida y fácil de tener una configuración que realice pull de un dispositivo para ver el uso de ancho de banda, es usando la herramienta cfgmaker (instalada por el paquete mrtg) de la siguiente manera:
  # cfgmaker --global 'WorkDir: /var/www/mrtg' --output /etc/mrtg.cfg public@192.168.1.10
donde:
--global 'WorkDir: /var/www/mrtg' especifica el directorio donde se pondrán los datos recaudados, es decir, el del server web,
--output /etc/mrtg.cfg especifica el archivo de configuración a crear,
public@192.168.1.10 indica que se use la comunidad SNMP "public" y que la IP del dispositivo es 192.168.1.10.
La comunidad "public" es la default en muchos dispositivos y por seguridad debe cambiarse, dado que es la "contraseña" de acceso a los datos SNMP. Obviamente el dispositivo que estemos consultando debe tener habilitadas las consultas SNMP con la comunidad utilizada.

cfgmaker generará un nuevo archivo mrtg.cfg que contiene configuraciones globales, así como definiciones para cada interfaz que el dispositivo reporte en el pull SNMP. Lo más destacable de la configuración global es la sentencia "WorkDir:" que especifica el directorio pasado por parámetro.

El siguiente paso es generar los archivos web para la configuración recién creada. Para ello, se utiliza la herramienta indexmaker, que también viene con mrtg. La generación de dichos archivos se realiza de la siguiente manera:
# indexmaker /etc/mrtg.cfg --output /var/www/mrtg/index.html
donde:
/etc/mrtg.cfg es el archivo de configuración,
--output /var/www/mrtg/index.html es la ubicación y nombre del archivo index principal.

Ejecución de MRTG

Con todo en su lugar, ahora debemos ejecutar mrtg. La instalación genera un archivo cron que ejecutará MRTG cada 5 minutos. Cada vez que se ejecuta, obtiene los valores de las interfaces para los dispositivos configurados, los almacena en su base de datos RRD, y crea los gráficos.

Para ver si todo está bien, lo mejor es ejecutar al menos una vez el programa por consola, de la siguiente manera:
# env LANG=C /usr/bin/mrtg
env LANG=C se utiliza para setear la variable de entorno LANG, dado que si utilizan otro valor como UTF-8, arrojará un error.

La primera vez que ejecuten mrtg arrojará varios errores del tipo "no encuentro tal archivo". Esto es normal, dado que los archivos que busca todavía no existen y se crean con la primer ejecución. Ejecuciones sucesivas no deberían arrojar estos errores.

Una vez que se prueba que todo está bien, ya no hace falta ejecutarlo a mano, dado que de eso se encargará cron.

Acceder a las gráficas es tan simple como apuntar con el navegador a la dirección del servidor donde se encuentra instalado MRTG. Por ejemplo:
http://192.168.1.100/mrtg

Configuración avanzada

Vimos como realizar una configuración de forma casi automática. Ahora, dependiendo lo que deseen monitorear y cómo, deberán editar el archivo de configuración creado con cfgmaker, o bien crearlo de cero.
Para esto hace falta conocer un poco más la estructura del archivo de configuración. El mismo se divide básicamente en tres secciones: opciones globales,  configuración de targets y definición de thresholds. Listaré las opciones que me parecen más importantes de cada una, para poder tunear la herramienta un poco.
Es interesante tener en cuenta que se pueden incluir otros archivos de configuración en el de la configuración global, utilizando el keyword "Include". Por ejemplo: Inlude: switches.inc.


Global

Entre las opciones globales, destaco:
  • WorkDir: establece el directorio de trabajo, donde se ubican los archivos de log y web. En el ejemplo básico, el directorio se estableció a /var/www/mrtg, pero se puede cambiar al que se desee.
    Es posible cambiar el directorio donde se ubican los html (HtmlDir), logs (LogDir) e imagenes (ImageDir). Si se utilizan estas opciones, no debe establecerse el WorkDir, dado que sobreescribe estas opciones.
  • Forks: permite definir cuántos procesos disparar para realizar consultas SNMP. Si se tienen que consultar muchos dispositivos, utilizar más de un proceso a la vez puede optimizar considerablemente la tarea.
  • Interval: tiempo, en minutos, que transcurre entre ejecuciones de mrtg (por defecto es 5 minutos). Esto se refleja en los gráficos web, y se utilizar en modo daemon.
  • Language: permite setear el lenguaje en el cual se muestran los datos web. MTRG soporta múltiples lenguajes, y tranquilamente podríamos elegir "spanish" como valor.
  • RunAsDaemon: muy interesante opción que permite independizarnos de cron y optimizar la ejeción. Si se setea en yes, no hace falta llamar el programa mrtg desde cron cada cierto intervalo de tiempo, sino que el programa se ejecuta una vez y luego queda en ejecución, realizando actualizaciones al intervalo seteado.
    En este caso es importante setear la opción "Interval" citada anteriormente, y eliminar la entrada de cron, dado que cada ejecución de mrtg iniciará un demonio nuevo.
    Esta opción debería utilizarse siempre, dado que ejecutar el programa con cron conlleva la creación del proceso y tener que releer los archivos de configuración cada vez.
Ejemplo de configuración global:
    WorkDir: /var/www/mrtg
    Forks: 3
    Language: spanish
    RunAsDaemon: yes
    Interval: 5


Targets

La definición de targets tiene una cantidad de opciones abrumadora, por lo que listaré algunas que me parecen las principales. Cada target debe tener un nombre único, y el nombre debe agregarse a cada parámetro que pertenezca al mismo target (entre corchetes). Este nombre se usa también para el nombre de los archivos web, log e imágenes.
  • Target: es la principal sentencia al definir un dispositivo a monitorear. Acepta muchos formatos (y cuando digo muchos, es MUCHOS) para definir el target. Las formas más comunes son las siguientes:
    • Basica: "puerto:comunidad@router"
      donde:
      - puerto: es el número de la interfaz en el router a monitorear. La documentación no dice mucho al respecto, pero al menos en los Cisco, los puertos se numeran de forma consecutiva desde la primer placa, y arrancan desde el valor 2. Por ejemplo, la Fa0/37 pasa a ser el puerto 38, mientras que la Gi1/1 es el puerto 50 (es la interfaz 49 - por los 48 de la primer placa-, más 1 porque arranca en 2 la numeración).
      - comunidad: es la comunidad SNMP que asignaron en el dispositivo.
      - router: es el nombre DNS o la dirección IP del router/switch/etc a monitorear.
      Ejemplo: definición para graficar la interfaz 38 de un switch 3560.
              Target[switch3560_2]: 39:public@192.168.1.10
    • OIDs explícitos: "OID_1&OID_2:comunidad@router". Los OIDs son los identificadores SNMP que determinan los valores a obtener. Los OIDs están en cierta forma estandarizados, pero cada fabricante puede definir los que quiera. MTRG necesita al menos dos OIDs para realizar sus gráficos (uno lo dibuja en verde y el otro en azul). Esto no necesariamente necesita tener dos OIDs distintos, tranquilamente se puede especificar el mismo OID dos veces.
      Ejemplo: graficar el uso de CPU.
       Target[switch3560_1]: 1.3.6.1.4.1.9.2.1.57.0&1.3.6.1.4.1.9.2.1.57.0:public@192.168.1.10
    Hay muchas otras formas de definir targets, así que si necesitan otra, busquen en el manual que están bien descriptas.
  • MaxBytes: especifica los valores máximos que cualquiera de los dos valores medidos puede tomar. En el caso de interfaces, los tamaños máximos serían la velocidad soportada. Tener en cuenta que el valor es en bytes, no bits se especifica en las interfaces: 100 MB Ethernet = 12500000.
    Ejemplo:
     MaxBytes[switch3560_2]: 12500000
  • Title: el string que se muestra en la barra del título de la página Web.
    Ejemplo:
     Title[switch3560_2]: Analisis de trafico Switch 3560
  • PageTop: texto a agregar al tope de la página HTML definida para el target. Hay que tener en cuenta que se pueden usar varias líneas, siempre que la primer columna esté vacío.
    Ejemplo:
      PageTop[switch3560]: <h1>Analisis de trafico Switch 3560</h1>
    <div id="sysdetails">
    <table>
    <tr>
    <td>System:</td>
    <td>Switch 3560 in </td>
    </tr>
    <tr>
    <td>Max Speed:</td>
    <td>125.0 MBytes/s</td>
    </tr>
    </table>
    </div>
  • Directory: si se especifica, los archivos web, para ese target, se ubicarán allí en lugar del WorkDir (o HtmlDir, LogDir, ImageDir). El directorio debe ser creado manualmente, dado que mrtg no lo creará.
    Ejemplo: colocar los archivos del switch3560 en el directorio /var/www/mrtg/switches
     Directory[switch3560]: /var/www/mrtg/switches
  • XSize e YSize: permiten especificar el tamaño del gráfico. Por defecto, los gráficos son de 400x100 pixels. Xsize debe estar comprendido entre 20 y 600, mientras que YSize debe ser mayor a 20.
    Ejemplo:
     XSize[switch3560_2]: 600
     YSize[switch3560_2]: 150
  • XZoom e YZoom: permiten hacer zoom en el gráfico.
    Ejemplo:
     XZoom[switch3560_2]: 2.0
     YSize[switch3560_2]: 2.0
  • Options: permite setear algunos valores booleanos. Por ejemplo, por defecto los gráficos son en bytes y el tiempo se grafica de derecha a izquierda. Es posible cambiar este valor a algo más intuitivo, como valores en bits y que el gráfico crezca de izquierda a derecha:
    Options[switch3560]: growright, bits
    Existen muchas otras opciones para setear por gráfico, y se pueden encontrar en la documentación.
Un dato interesante es que, dado que muchas definiciones de targets comparten la misma configuración, o configuraciones similares, mtrg permite utilizar valores default. Los datos default se configuran de la misma manera que se especifico para los targets, pero usando los caracteres _ ^ y $
En todos los casos, un valor en blanco, borra la configuración default. Cada una de las configuraciones default pueden ser sobre-escritas más abajo, con otra configuración default. Esto permite usar valores default distintos para distintos targets.
Veamos las opciones de configuración:
  • Valores default se especifican con el underscore "_". Las definiciones en targets sobreescriben este valor.
    Ejemplo: Especificar que todos los gráficos sean en bps, y crezcan hacia la derecha
          Options[_]: growright, bits
  • El signo "^" permite pre-agregar texto a valores definidos en los targets.
    Ejemplo: poner en el título de todos los targets el valor "Analisis MRTG -"
          Title[^]: Analisis MRTG -
    Ahora, si por ejemplo se define el target switch3560:
          Title[switch3560_2]: Switch 3560 Fa0/2
        El resultado será una página con el título "Analisis MRTG - Switch 3560 Fa0/2".
  • Finalmente, el signo peso "$" permite agregar texto al final de valores definidos en los targets.
    Ejemplo: agregar el texto "- Laboratorio" a todos los títulos.
          Title[$]: - Laboratorio

Ejemplo completo de configuración de Target (interfaz FastEthernet0/1 en switch 3560):
Options[_]: growright, bits
XSize[_]: 600
YSize[_]: 150
XZoom[_]: 2.0
YSize[_]: 2.0
Title[^]: Analisis MRTG -
Target[switch3560_2]: 39:public@192.168.1.10
MaxBytes[switch3560_2]: 12500000
Title[switch3560_2]: Switch 3560 Fa0/2
PageTop[switch3560]: <h1>Analisis de trafico Switch 3560</h1>
      <div id="sysdetails">
     <table>
     <tr>
     <td>System:</td>
     <td>Switch 3560 in </td>
     </tr>
     <tr>
     <td>Max Speed:</td>
     <td>125.0 MBytes/s</td>
     </tr>
     </table>
      </div>

Thresholds

La definición de thresholds permite realizar alguna acción cuando los valores sobrepasen un límite pre-establecido. Las acciones posibles son llamar un script externo o mandar un mail. Si se define llamar a un script externo, puede utilizarse la variable SetEnv para enviar parámetros extra.

Como ejemplo de uso de thresholds, veamos la configuración para mandar un mail cuando la interfaz 2 del switch 3560 supera los 90Mb/s:
# Directorio donde colocar los valores de threshold almacenados
ThreshDir: /var/www/mrtg/thresh
# Servidor de mail a utilizar
ThreshMailServer: mail.midominio.com
# Dirección a poner en el from del mail
ThreshMailSender: mtrg@midominio.com
# Definir a quienes mandar e-mail cuando se supere un límite. Se puede definir por host
ThreshMailAddress[_]: admin@midominio.com
# Definicion de limite maximo de uso de una interfaz (90Mb/s = 11.25MB/s = 11796480 Bytes/s)
ThreshMaxI[switch3560_2]: 11796480
Tener en cuenta el uso de "ThreshDir", dado que sin él, mrtg no tiene donde almacenar los datos de mediciones de límites, causando que cada detección sea independiente y mandando muchos mails. Es decir, estamos interesados que nos informe si superamos los 90Mb/s una vez, y hasta que no baje de 90Mb/s, no vuelva a mandar otro mail.


Monitoreo Cisco

Para poder monitorear dispositivos Cisco, primero hay que habilitar una comunidad SNMP para ser accedida en modo lectura. El nombre de la comunidad es el "password" para acceder a la información, por lo que debe mantenerse secreta.
Adicionalmente se puede setear una access-list que brinde acceso al servidor SNMP sólo a la IP elegida.
La configuración es la siguiente:
  (config)# snmp-server community ro 50  (config)# access-list 50 permit

Referencias

- MRTG 2.17.4 configuration reference
- MRTG (Multi Router Traffic Grapher) en Debian-Ubuntu
- Network Monitoring Using Free Linux Tools
- MRTG Configuration in Debian
- Quick HOWTO : Ch23 : Advanced MRTG for Linux
- Use MRTG to monitor bandwidth
- Cisco Task 3--Using MRTG to Monitor and Graph Traffic Loads