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