El protocolo ARP (Address Resolution Protocol) permite resolver la dirección física de un host (MAC) asociada a una dirección IP. Este protocolo tiene una función crítica dentro de la suite TCP/IP que sustenta a Internet. El término "resolución" se refiere al proceso de identificar la dirección de una computadora en la red. ARP es un protocolo de solicitud/respuesta y sus mensajes se encapsulan en un protocolo de la capa de enlace de red (data link layer). Este artículo demuestra cómo monitorear la actividad de la cache ARP local de un sistema, que permite mapear direcciones IP a direcciones de hardware (MAC) evitando la necesidad de enviar mensajes de broadcast, utilizando la herramienta lnstat.



La capa de enlace de datos (data link) es la capa más baja en la suite de Internet y permite la conexión física entre dos computadoras en la misma red. Los mensajes en esta capa se denominan "tramas" y se envían utilizando las direcciones físicas (MAC) de los dispositivos de red de cada host. Internet es quien permite la interconexión entre diferentes redes, es lo que hace que podamos conectarnos a cualquier servidor Web público en cualquier parte del mundo desde nuestra computadora. A tal fin es necesario que un mensaje pueda salir de una red y ser reenviado hacia otra red destino. Esto hace que se requiera una dirección de host lógica (diferente a la dirección de hardware) que permita organizar a los hosts en una topología de red. Esta dirección es la que provee el protocolo IP (Internet Protocol) y permite "rutear" mensajes, denominados paquetes o "datagramas", entre diferentes redes a lo largo del mundo.

Sin embargo, toda la comunicación desde el origen hasta el destino de un paquete ocurre entre hosts punto a punto. Desde nuestra computadora hasta nuestra puerta de enlace (gateway); luego sucesivamente entre "enrutadores" (routers) que conectan las redes del mundo; hasta la puerta de enlace de la red destino; y desde esta hasta el host destino. Es por ello que constantemente se necesita resolver una dirección IP a dirección MAC para establecer las conexiones punto a punto en la capa de enlace de datos.

Esto es una especie de descripción grosera de cómo funciona Internet. Cabe destacar que para todo SysAdmin/DevOps es mucho muy importante conocer todas las capas del modelo OSI y cómo se relacionan entre ellas.

El funcionamiento básico del protocolo ARP es el siguiente:

  1. Cierto host (X) necesita enviar un paquete a la dirección IP A.B.C.D en la misma red local (no necesita ser ruteado).
  2. A tal fin, debe conocer la dirección de hardware (MAC) del host correspondiente a dicha dirección IP (Y) para establecer la comunicación con el mismo.
  3. Si no conoce la dirección de hardware asociada a la dirección IP destino (no posee una entrada en su cache ARP), envía un mensaje de broadcast a toda la red preguntando ¿quién tiene la IP A.B.C.D? (Los mensajes de broadcast llegan a todos los hosts en la misma red).
  4. El host que posee la dirección IP (Y) responde con un mensaje indicando cuál es su dirección MAC e IP. De esta forma el host que necesitaba enviar el mensaje original (X) cuenta con la dirección MAC para conectarse con el host destino (Y).

La cache ARP es de vital importancia ya que evita tener que resolver constantemente una dirección IP a MAC una y otra vez. Especialmente cuando se está comunicando con frecuencia contra un mismo host (por ejemplo una puerta de enlace). Es por ello que puede ser necesario monitorear su actividad.

La herramienta lnstat permite obtener estadísticas de red exportadas por el kernel Linux. Imprime periódicamente una selección de contadores que se obtienen desde el pseudo-filesystem /proc, como pueden ser estadísticas de cache de ruteo, cache ARP y cualquier otro archivo dentro de /proc/net/stat/. Veamos el funcionamiento y opciones básicas de esta herramienta.

La opción -d lista los contadores y archivos disponibles:

root@hal9000:~# lnstat -d
/proc/net/stat/ndisc_cache:
	 1: entries
	 2: allocs
	 3: destroys
	 4: hash_grows
	 5: lookups
	 6: hits
	 7: res_failed
	 8: rcv_probes_mcast
	 9: rcv_probes_ucast
	10: periodic_gc_runs
	11: forced_gc_runs
	12: unresolved_discards
	13: table_fulls
/proc/net/stat/arp_cache:
	 1: entries
	 2: allocs
	 3: destroys
	 4: hash_grows
	 5: lookups
	 6: hits
	 7: res_failed
	 8: rcv_probes_mcast
	 9: rcv_probes_ucast
	10: periodic_gc_runs
	11: forced_gc_runs
	12: unresolved_discards
	13: table_fulls
/proc/net/stat/rt_cache:
	 1: entries
	 2: in_hit
	 3: in_slow_tot
	 4: in_slow_mc
	 5: in_no_route
	 6: in_brd
	 7: in_martian_dst
	 8: in_martian_src
	 9: out_hit
	10: out_slow_tot
	11: out_slow_mc
	12: gc_total
	13: gc_ignored
	14: gc_goal_miss
	15: gc_dst_overflow
	16: in_hlist_search
	17: out_hlist_search

En este ejemplo se disponen de contadores de la cache de "vecinos" (NDP, Neighbour Discovery Protocol) del protocolo IPv6 (ndisc_cache); de la cache ARP (arp_cache); y de la cache de ruteo (rt_cache).

Por defecto, lnstat vuelca todos los contadores cada 2 segundos. Sin embargo, es posible filtrar por archivo empleando la opción -f:

root@hal9000:~# lnstat -f arp_cache
arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|arp_cach|
 entries|  allocs|destroys|hash_gro| lookups|    hits|res_fail|rcv_prob|rcv_prob|periodic|forced_g|unresolv|table_fu|
        |        |        |      ws|        |        |      ed|es_mcast|es_ucast|_gc_runs|  c_runs|ed_disca|     lls|
       9|      16|      11|       1|   54491|    4644|       4|       0|       0|     457|       0|       0|       0|
       9|       0|       0|       0|       6|       1|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       7|       1|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       8|       0|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       6|       0|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       6|       0|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       8|       1|       0|       0|       0|       0|       0|       0|       0|
       9|       0|       0|       0|       6|       0|       0|       0|       0|       0|       0|       0|       0|
^C

Es importante notar que, como casi todos los valores estadísticos exportados por el kernel Linux, se trata de contadores. Por ello la primera línea muestra el total, mientras que las subsiguientes muestran las diferencias (a partir del comienzo de la ejecución de la herramienta). Esto se ha implementado de esta manera para mejorar la visualización de los datos. Es posible comprobar que el valor total inicial de un contador cambia al lanzar la herramienta nuevamente (siempre que haya habido cambios en dicho contador).

Para visualizar un único contador se debe recurrir a la opción -k, pasando como parámetro el archivo y campo separados por dos puntos. Por ejemplo, el siguiente comando permite visualizar lookups ARP y hits en cache:

root@hal9000:~# lnstat -k arp_cache:lookups,arp_cache:hits
arp_cach|arp_cach|
 lookups|    hits|
   54256|    4611|
       5|       0|
       6|       0|
       6|       0|
       8|       1|
       5|       0|
      11|       0|
       8|       1|
^C

Como se observa, esta opción soporta mostrar varios campos, separándolos con coma.

Visualizar la cache ARP

Para visualizar el contenido de la cache ARP se debe utilizar la herramienta arp, tal como lo hace el script en el artículo Obtener una dirección IP a partir de una dirección MAC:

root@hal9000:~# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.27.3             ether   00:2e:56:8d:22:00   C                     eth0
192.168.27.1             ether   d0:11:24:4e:d2:60   C                     eth0

Cómo vaciar la cache ARP

Si por alguna razón es necesario vaciar la cache ARP (por ejemplo se ha cambiado la dirección IP de un host y se necesita reflejar el cambio de inmediato), es posible recurrir a la herramienta ip. A tal fin, simplemente ejecutar:

# ip neigh flush all

Las opciones -s permiten agregar más verbosidad a la salida. Tener en cuenta que este comando borra tanto la cache ARP como la cache NDISC de IPv6. Por ejemplo:

root@hal9000:~# ip -s -s neigh flush all
192.168.30.100 dev eth0 lladdr 48:0f:a5:c3:61:11 used 13755/13736/13697 probes 4 STALE
192.168.28.165 dev eth0 lladdr 1c:c1:de:0a:a5:83 used 13749/13583/13546 probes 4 STALE
192.168.30.56 dev eth0 lladdr 30:83:99:2e:a5:9e used 13746/13715/13677 probes 4 STALE
192.168.28.45 dev eth0 lladdr a0:67:cc:a5:d5:df used 13750/12390/12354 probes 4 STALE
192.168.27.241 dev eth0 lladdr 00:67:a5:db:67:f8 used 13749/13717/13679 probes 4 STALE
192.168.27.23 dev eth0 lladdr 10:f4:74:62:a7:73 used 13751/12390/12354 probes 4 STALE
192.168.27.159 dev eth0 lladdr 3c:f4:a7:10:26:e5 used 13207/13202/13165 probes 1 STALE
192.168.30.84 dev eth0 lladdr d0:f4:9c:a7:10:b1 used 13751/13727/13689 probes 4 STALE
192.168.28.193 dev eth0 lladdr 00:c0:ee:85:f4:23 used 13753/13753/13716 probes 4 STALE
192.168.30.114 dev eth0 lladdr a0:b3:cc:48:98:f4 used 13752/13730/13693 probes 4 STALE
192.168.30.54 dev eth0 lladdr 00:f4:48:f4:bf:58 used 13762/13740/13703 probes 4 STALE
192.168.27.33 dev eth0 lladdr 00:50:48:26:10:9f used 13769/13695/13635 probes 6 STALE
192.168.30.207 dev eth0 lladdr 00:17:48:7c:2d:17 used 13765/13745/13707 probes 4 STALE
192.168.30.245 dev eth0 lladdr a0:2d:cc:47:76:94 used 13750/12391/12354 probes 4 STALE
192.168.27.227 dev eth0 lladdr 00:2d:86:b7:4b:75 used 13205/13200/13163 probes 1 STALE
192.168.27.10 dev eth0 lladdr d0:2d:86:4e:3a:60 ref 1 used 13764/4/13764 probes 4 REACHABLE
192.168.27.32 dev eth0 lladdr 00:50:56:2d:2d:8e used 30/29/8 probes 1 STALE
192.168.30.96 dev eth0 lladdr c4:a6:31:75:99:92 used 13753/13732/13693 probes 4 STALE
192.168.30.172 dev eth0 lladdr 00:17:75:33:07:44 used 13750/13722/13685 probes 4 STALE
192.168.28.246 dev eth0 lladdr 00:a6:75:a3:0d:ae used 40/35/15 probes 1 STALE
192.168.27.246 dev eth0 lladdr 00:a6:ee:b0:12:63 used 13545/13540/13503 probes 1 STALE
192.168.30.9 dev eth0 lladdr d0:75:9c:34:ff:2d used 13754/13735/13697 probes 4 STALE
192.168.30.205 dev eth0 lladdr 40:ff:ff:9f:f4:5d used 13759/13740/13701 probes 4 STALE

*** Round 1, deleting 23 entries ***
*** Flush is complete after 1 round ***

Referencias


Tal vez pueda interesarte


Compartí este artículo