Pero que sucede si ademas de estar lento el acceso a #internet tambien esta lenta la red.. Hoy en dia las velocidades de procesamiento de los nuevos equipos de hardware compiten con los medios fisicos de interconexion disponibles, si bien el bajo desempeño en la red puede ser por diversas causas como cableado defectuoso, mal diseño de la red (vlsm), uso de Hubs, etc; sin duda una de las que mas pueden afectar el desempeño de una red son las tormentas de broadcast .
Las tormentas de broadcast son una gran cantidad de peticiones ARP que se propagan en un dominio de colision y broadcast, se genera cuando paquetes de capa 2 se encuentran atrapados en un bucle sin fin debido a que Ethernet no tiene un campo TTL (Time To Live), los paquetes no tienen un timeout y por lo tanto, son retransmitidos una y otra vez en un bucle infinito.
Hace tiempo encontre un exelente articulo en everything sysadmin y hoy quisiera hacer mi aporte añadiendo un toque personal, les mostraré una forma sencilla para detectar dichas tormentas usando unicamente nuestro shell #bash y tcpdump
lo primero sera verificar si tenemos instalado tcpdump
$whereis tcpdump
tcpdump: /usr/sbin/tcpdump /usr/share/man/man8/tcpdump.8.gz
tcpdump: /usr/sbin/tcpdump /usr/share/man/man8/tcpdump.8.gz
si no sale un resultado como el anterior es porque no lo tienen instalado, en ese caso tendran que instalarlo de la siguiente manera:
$sudo aptitude install tcpdump
una vez que lo tienen instalado comenzamos a usar la herramienta, la pondremos a escuchar paquetes en la interfaz deseada, que en mi caso sera eth0 y mi subred es la 192.168.0.0/23
$sudo tcpdump -i eth0 -n net 192.168.0.0/23
En la imagen anterior observamos una serie se request sobre distintas direcciones ip, algunas hacen multiples request, esto es normal lo que trataremos de encontrar son las ip's que presenten comportamientos inusuales; si bien es dificil calificar un comportamiento "inusual" dado que el broadcast es necesario, intentaremos identificar algunas NIC que relicen una gran cantiad de request dentro de una muestra de X cantidad de paquetes, como p. ej. arriba de 100 req./ 100 PKT
Debemos separar unicamente los request que nos interesan del volcado que hace tcpdump y esto los podriamos filtrar por who-has continuando con el bash, tomaremos una muestra de 100 lineas de volcado del tcpdump y las filtraremos con el siempre util grep.
$sudo tcpdump -i eth0 -n net 192.168.0.0/23 | head -100 | grep "who-has"
Imagen-2 Volcado del tcpdump filtrado por "who-has" con grep. |
$sudo tcpdump -i eth0 -n net 192.168.0.0/23 | head -100| grep "who-has"| awk '{ print $7 }'| sort | uniq -c
Imagen-3 |
Volviendo al resultado hasta aqui seria suficiente para identificar un posible problema de Broadcast, pero quisiera ir mas alla descartando resultados de pocos request y mostrando solo los que tengan de 10 o mas. y para ello me apoyare con grep -v
$sudo tcpdump -i eth0 -n net 192.168.0.0/23 | head -100 | egrep "who-has" | awk '{ print $7 }' | sort | uniq -c| grep -v "^ *[1-9] "
Imagen-4 Usando el grep -v filtramos la los resultados con pocos request, y dejamos unicamente los que podrian constituir un peligro potencial de Broadcast. |
Como podemos observar los resultados son mas reveladores cuando ampliamos la cantidad de la muestra.
Haciendo un resumen explicare brevemente el string final.
$sudo
tcpdump -i eth0 -n net 192.168.0.0/23 | head -100 | egrep "who-has" |
awk '{ print $7 }' | sort | uniq -c| grep -v "^ *[1-9] "
- $sudo tcpdump -i eth0 -n net 192.168.0.0/23 Executamos tcpdump con permisos de superusuario, le indicamos que debera usar la interfaz eth0 y escuchar en la red 192.168.0.0/23
- head -300 la cantidad de la muestra de paquetes que sacara el tcpdump
- egrep "who-has" filtramos unicamente las lineas que contengan who-has
- awk '{ print $7 }' imprimimos solo la 7a columna
- sort Obvio
- uniq -c imprime solo una linea por repetidos pero ademas los contara
- grep -v "^ *[1-9] " filtra -descarta- los que comiencen con 1,2,3,etc. hasta 9
Bytes ;)