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:
- 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). - 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.
- 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). - 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
- RFC 826 - An Ethernet Address Resolution Protocol
- RFC 760 - DoD standard Internet Protcol
- Link layer
- Internet Protocol
- MAC address
- Address Resolution Protocol
- Internet protocol suite
- OSI model
- Address Resolution Protocol (arp)
man lnstat
man arp
man ip