sábado, 15 de octubre de 2011

Tormentas de Broadcast

Cuantas veces se han encontado con la situacion de que el #internet esta lento.. eso puede ser -claro- por una gran cantidad de conexiones hacia internet por parte de aplicaciones, navegador web, aplicaciones de mensajeria instantanea, voip, muchos usuarios concurrentes, una conexion lenta, etc...

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

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

Imagen-1 Salida del tcpdump, observamos multiples request de ARP y como nota adicional se observa al final un request de una NIC hacia un BOOTP/DHCP para iniciar un booteo por PXE, muy probablemente en ese momento estaban encendiendo un PC en la red.

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.
Ya va tomando forma, pero aun falta refinar el resultado para darle un toque mas elegante, para esto filtraremos unicamente las IP que hacen tell y ademas las contaremos.

$sudo tcpdump -i eth0 -n net 192.168.0.0/23 | head -100| grep "who-has"| awk '{ print $7 }'| sort | uniq -c


Imagen-3
El resultado nos muestra que hay 14 request de la ip 192.168.0.254 y otras tantas por parte de otras direcciones, en mi caso utilize {print $7} pq en mi version de tcpdump la ip que hace el tell no aparece en el ultimo campo, de ser asi usaria { print $NF}
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.
Este resultado es mas preciso pero para que sea aun mas revelador necesitaremos ampliar la muestra de paquetes subiendo el numero de head a por lo menos 1000




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
Si tienen alguna duda o sugerencia, sus comentarios son bienvenidos.

Bytes ;)