¿Que puertos de switch estan en uso?

Hace un año me enfrente a un problema probablemente familiar a cualquier administrador de red. En el patch-panel en uno de los racks se han acabado los puertos libres. Sin embargo era claramente evidente que no se utilizaba todos los puertos. A algunos se conecto un cable para alguna tarea temporal o una prueba y se olvido de desenchufarlo. Algunos ya no estaban en uso porque los usuarios se han mudado a otros despachos. En fin, sabia que algunos puertos ya no se utilizaban. Tenia que averiguar cuales son.

No podía simplemente ir desenchufando cables de los puertos inactivos. El hecho de que un puerto no está activo no significa que no estaba en uso hace 10 minutos. El usuario podía simplemente apagar su ordenador y, por ejemplo, ir a una reunión.

En aquel entonces usábamos los switches Cisco Catalyst 3560 que tenían los puertos de 100 Mb para los usuarios y el los puertos SFP para los uplinks. No podía simplemente gastar $2,500 en otro switch mas, cuando estaba convencido de que en realidad no es necesario.

Tarea

Antes de todo había que pensar en un criterio de «un puerto no en uso». Llegue a la conclusión que el puerto que no llego a activarse por lo menos una vez durante un mes podría ser considerado «un puerto sin utilizar» con total seguridad. Ahora la tarea se transformaba en monitorizar el estado de los puertos de todos los switches durante un mes recopilando datos. Al final de mes habría que procesar los datos recopilados para averiguar que puertos no se han levantado ni una vez.

Solucion

Configure todos los switches para que envíen todos sus mensajes de consola a un servidor de logging remoto. Teníamos un servidor Arch Linux con Syslog-NG y logrotate en marcha que era un candidato perfecto para la tarea.

La activación de logging remoto en los switches cisco se activa de una manera muy fácil:

logging 10.20.100.12

donde 10.20.100.12 es la dirección IP del servidor de logging (Arch Linux en mi caso).

En el servidor tenia que configurar Syslog-NG para poder recibir los mensajes remotos. He añadido lo siguiente al syslog-ng.conf:

source remote_udp {
udp();
};

destination d_switches { file("/var/log/remote/switches.log"); };

filter f_switches { netmask("10.20.120.0/255.255.255.0") or netmask("10.30.120.0/255.255.255.0"); };

log { source(remote_udp); filter(f_switches); destination(d_switches); };

Como podéis ver, los mensajes desde las redes 10.20.120.0/24 y 10.30.120.0/24 tienen como destino un archivo de log /var/log/remote/switches.log. Las direcciones IP desde estos rangos solo se daba a los switches de usuario en nuestra empresa.

Los switches cisco generan un mensaje cada vez que se levanta un puerto. Algo parecido a este:

Apr 27 16:38:44 switch1 330827: Apr 27 15:39:27.317: %LINK-3-UPDOWN: Interface FastEthernet0/4, changed state to up

Y aqui viene un ejemplo de cuando un puerto se apaga:

Apr 27 16:38:53 switch1 330830: Apr 27 15:39:37.635: %LINK-3-UPDOWN: Interface FastEthernet0/4, changed state to do

Una vez que todo estaba configurado, tenia que esperar un mes para analizar estos mensajes en el archivo de log.

Aquí está el algoritmo de análisis de archivo de log:

1. Seleccionar sólo los mensajes procedentes de un switch particular
2. Seleccionar sólo los mensajes que contengan la cadena «LINK-3-UPDOWN»
3. Seleccionar el nombre del puerto y su numero
4. Seleccionar sólo los mensajes que contengan la cadena «FastEthernet» (en mi caso, todos los puertos de usuario han sido de 100 Mbps)
5. Seleccionar sólo el numero de puerto
6. Ordenar los números de puertos y dejar solo las filas unicas

Así es como lo he hecho en bash:

#!/bin/bash

cat /var/log/remote/switches.log* | grep $1 | grep LINK-3-UPDOWN | cut -d ':' -f 8 | cut -d ' ' -f 3 | grep FastEthernet | cut -d '/' -f 2 | cut -d ',' -f 1 | sort -n | uniq


Ejemplo de uso:

# ./usedports.sh switch1
1
3
4
5
6
8
9
10
11
12
13
14
15
17
23
24
25
29
38
39
41
43


Este script nos presenta el listado de los puertos cuyo estado se cambio durante el mes. Son los puertos que seguramente están en uso. ¿Pero y que hay de aquellos puertos que no se cambian del estado? Es decir, los que siempre están activados.

Tenemos que acceder al switch por telnet y ejecutar:

show interface description | include down

Este comando no mostrara los puertos que no están activos en este momento. Si el puerto no esta activo y su estado no ha cambiado durante el ultimo mes, podemos decir con seguridad que el puerto no esta en uso.

Situación actual

Sigo usando esta solución en nuestra empresa. Aunque ahora también tengo la red mejor documentada. Desde hace poco hemos empezado a utilizar otros modelos de switches en la red: 2975 и 2960. Estos modelos tienen los puertos gigabit, y también se les puede unir en el stack para poder gestionar varios switches como una unidad. Así que tenia que modificar el script para estos modelos.

Aquí esta la versión modificada:

#!/bin/bash

cat /var/log/remote/switches.log* | grep $1 | grep LINK-3-UPDOWN | cut -d ':' -f 8 | cut -d ' ' -f 3 | grep GigabitEthernet | cut -d 't' -f 4 | cut -d ',' -f 1 | sort -t '/' -k 1,1n -k 3,3n | uniq


Espero que a alguien le servira este articulo.
Un saludo.

Comentarios (0)

RSS Collapse / Expand

Solo los usuarios registrados y autorizados pueden hacer comentarios.