Linux – Inundando la red con ARP gratuitos

por | 14 noviembre, 2016

En el mecanismo normal de ARP, un host lanza a la red un broadcast de tipo ARP «who-has». Esta broadcast llega al destino si existe y éste responde con un paquete unicast de ipo ARP «is-at». Cuando una dirección IP cambia de un equipo a otro, el binomio IP-MAC que le corresponde cambia y se da el caso de que los demás host pueden tener el valor antiguo en sus tablas ARP durante el tiempo de refresco de la misma. Durante ese tiempo (60 seg. en Linux) no sería accesible dicha dirección IP por estar apuntando en los host a una dirección MAC inválida.

Existe un mecanismo para que un host anuncie a la red su binomio IP-MAC mediante un paquete ARP reply de tipo broadcast que no responde a ningún ARP request. A este paquete se le llama ARP «Gratuito» y sirve para que los demás hosts en el segmento de red actualicen sus tablas ARP con dicha entrada.

Esto se puede hacer con arping. Por ejemplo:

[root@localhost ~]# arping -A -I eth1 192.168.127.223
ARPING 192.168.127.223 from 192.168.127.223 eth1

el cual lanza un paquete ARP Reply cada segundo anunciando la IP local  192.168.127.223 por el interfaz eth0. Paramos con el Ctrl+C:

Sent 93 probes (93 broadcast(s))
Received 0 response(s)
[root@localhost ~]#

La opción -A (al contrario de -U) indica que se envíen ARP Reply en lugar de Request.

Podemos también hacer que se lancen un número concreto de paquetes con la opción -C:

[root@localhost ~]# arping -c 10 -A -I eth1 192.168.127.223
ARPING 192.168.127.223 from 192.168.127.223 eth1
Sent 10 probes (10 broadcast(s))
Received 0 response(s)
[root@localhost ~]#

Por supuesto también podemos lanzar paquetes ARP Request preguntando por una IP concreta para actualizar nuestra tabla ARP (opción -U):

[root@localhost ~]# arping  -U -I eth1 -s 192.168.127.223 192.168.96.1
ARPING 192.168.96.1 from 192.168.127.223 eth1
Unicast reply from 192.168.96.1 [00:00:5E:00:01:01]  1.570ms
Unicast reply from 192.168.96.1 [00:00:5E:00:01:01]  1.435ms
Unicast reply from 192.168.96.1 [00:00:5E:00:01:01]  2.271ms
Unicast reply from 192.168.96.1 [00:00:5E:00:01:01]  1.309ms
Sent 4 probes (1 broadcast(s))
Received 4 response(s)
[root@localhost ~]#

lo cual lanza paquetes ARP Request buscado la IP 192.168.96.1 desde nuestro interfaz eth1 con IP local 192.168.127.223. Se lanza un paquete cada segundo hasta que pulsamos Ctrl-C. También podemos usar la opción -c para indicar el número de paquetes a enviar.

Si nos fijamos en el resultado anterior, vemos que sólo se ha lanzado un primer broadcast, y al haber respuesta positiva del host los siguientes paquetes ARP Request son unicast. Podemos forzar a que siempre sean broadcast con la opción -b. Por ejemplo, hacemos la misma consulta que antes pero sólo con cinco ARP Request y todos broadcast:

[root@localhost ~]# arping -c 5 -b -U -I eth1 -s 192.168.127.223 192.168.120.1
ARPING 192.168.120.1 from 192.168.127.223 eth1
Unicast reply from 192.168.120.1 [00:10:CD:52:3C:E0]  0.954ms
Unicast reply from 192.168.120.1 [00:10:CD:52:3C:E0]  0.880ms
Unicast reply from 192.168.120.1 [00:10:CD:52:3C:E0]  0.916ms
Unicast reply from 192.168.120.1 [00:10:CD:52:3C:E0]  0.952ms
Sent 5 probes (5 broadcast(s))
Received 4 response(s)
[root@localhost ~]#

Todo esto lo podemos utilizar para hacer una prueba de inundación de paquetes ARP en la red y verificar el rendimiento de switches y equipos. El siguiente script lanza broadcasts ARP preguntando por una IP (1.1.1.1) ininterrumpidamente:

#!/bin/bash
COUNTER=0
while [  $COUNTER -lt 1000000 ]; do
   echo Sendind ARP broadcast `expr $COUNTER + 1`;
   arping -c 1 -b -U -I eth0 -s 192.168.127.222 1.1.1.1
   let COUNTER=COUNTER+1 
 done

Dependiendo de la potencia y velocidad de interfaz de nuestro ordenador, conseguiremos un flujo determinado de broadcast para el hilo generado por este script. Podemos generar un mayor flujo de broadcast en la red ejecutando el script en varios terminales. O también haciendo que se ejecuten varios hilos simultáneos:

#!/bin/bash
 COUNTER=0
 while [  1 ]; do
 echo Sendind ARP broadcast `expr $COUNTER + 1`;
 arping -c 1 -b -U -I eth0 -s 192.168.127.222 192.168.96.111 &
 arping -c 1 -b -U -I eth0 -s 192.168.127.222 192.168.96.111 &
 arping -c 1 -b -U -I eth0 -s 192.168.127.222 192.168.96.111 &
 arping -c 1 -b -U -I eth0 -s 192.168.127.222 192.168.96.111 &
 let COUNTER=COUNTER+1
 done

 

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *