¿Qué sucede cuando el caché ARP se desborda?

14

En al menos una implementación hay un límite estricto en la capacidad de la tabla ARP. ¿Qué sucede cuando el caché ARP está lleno y se ofrece un paquete con un destino (o siguiente salto) que no está en caché? ¿Qué sucede debajo del capó y cuál es el efecto en la calidad del servicio?

Por ejemplo, los enrutadores Brocade NetIron XMR y Brocade MLX tienen un sistema máximo configurableip-arp . El valor predeterminado en ese caso es 8192; El tamaño de una subred / 19. No está claro en la documentación si esto es por interfaz o para todo el enrutador, pero para el propósito de esta pregunta, podemos suponer que es por interfaz.

Pocos networkers configurarían una subred / 19 en una interfaz a propósito, pero eso no fue lo que sucedió. Estábamos migrando un enrutador central de un modelo de Cisco a un Brocade. Una de las muchas diferencias entre Cisco y Brocade es que Cisco acepta rutas estáticas que se definen con una interfaz de salida y una dirección de siguiente salto, pero Brocade insiste en una u otra. Dejamos caer la dirección del siguiente salto y conservamos la interfaz. Más tarde, aprendimos el error de nuestras formas y cambiamos de la interfaz a la dirección del siguiente salto, pero todo parecía estar funcionando inicialmente.

+----+ iface0    +----+
| R1 |-----------| R2 |---> (10.1.0.0/16 this way)
+----+.1       .2+----+
      10.0.0.0/30

Antes de la migración, R1 era un Cisco y tenía la siguiente ruta.

ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2

Después de la migración, R1 era un Brocade y tenía la siguiente ruta.

ip route 10.1.0.0 255.255.0.0 iface0

R2 es un enrutador Cisco, y los enrutadores Cisco realizan ARP proxy de forma predeterminada. Esta es la configuración (incorrecta) en producción que preparó el escenario para lo que resultó ser un desbordamiento de caché ARP.

  1. R1 recibe un paquete destinado a la red 10.1.0.0/16.
  2. Sobre la base de la ruta de interfaz estática, R1 ARP para el destino en iface0
  3. R2 reconoce que puede llegar al destino y responde al ARP con su propio MAC.
  4. R1 almacena en caché el resultado ARP que combina una IP en una red remota con el MAC de R2.

Esto sucede para cada destino distinto en 10.1.0.0/16. En consecuencia, a pesar de que el / 16 está correctamente dividido en subredes más allá de R2, y solo hay dos nodos en el enlace contiguo a R1 y R2, R1 sufre una sobrecarga de caché ARP porque induce a R2 a comportarse como si todas las direcciones de 65k estuvieran conectadas directamente.

La razón por la que hago esta pregunta es porque espero que me ayude a entender los informes de problemas del servicio de red (días después) que nos llevaron, eventualmente, al desbordamiento de caché ARP. En el espíritu del modelo StackExchange, traté de aclarar eso a lo que creo que es una pregunta clara y específica que puede responderse objetivamente.

EDITAR 1 Para ser claros, estoy preguntando acerca de parte de la capa de pegamento entre el enlace de datos (capa 2) y la red (capa 3), no la tabla de reenvío MAC dentro de la capa de enlace de datos. Un host o enrutador construye el primero para asignar direcciones IP a direcciones MAC, mientras que un conmutador construye el último para asignar direcciones MAC a puertos.

EDITAR 2 Aunque aprecio el esfuerzo realizado por los respondedores para explicar por qué algunas implementaciones no están sujetas al desbordamiento de caché ARP, creo que es importante que esta pregunta aborde las que sí lo están. La pregunta es "qué sucede cuando", no "es el proveedor X susceptible a". Ya hice mi parte al describir un ejemplo concreto.

EDITAR 3 Otra pregunta que no es esta es "¿cómo evito que el caché ARP se desborde?"

neirbowj
fuente
¿Está buscando información sobre el desbordamiento de la tabla de direcciones MAC o ARP?
Mike Pennington
¿podría explicar cómo cree que se desbordaría la tabla arp? ¿Está esto relacionado con un problema real, o es puramente hipotético? De cualquier manera, necesitamos detalles sobre a qué escenario preciso estamos respondiendo
Mike Pennington
@ MikePennington Este es un problema real. El caché ARP podría desbordarse si, por ejemplo, una gran cantidad de IP están presentes o actúan como si estuvieran presentes en un solo enlace.
neirbowj
Cisco IOS no almacena en caché los ARP en un enrutador a menos que el ARP provenga de una subred configurada en el enrutador. Cuando digo un "problema real", me refiero a un problema que estás teniendo ... no es un problema que estás imaginando
Mike Pennington
Gracias por volver a redactar la pregunta porque cuando pienso en los interruptores (capa 2) no tienes una tabla ARP. ARP tiene que ver con TCP / IP y un conmutador de capa 2 no piensa de esa manera, pero cuando ingresa a la conmutación de capa tres puede tener una tabla ARP. Sin embargo, si recuerdo correctamente, la interfaz en el conmutador de capa 3 debe tener una dirección IP para aparecer en la tabla ARP. No entendí realmente lo que estabas diciendo al principio, los invitados de la madrugada están siendo duros conmigo. El programador en mí piensa que una vez que la tabla ARP esté llena, se bloqueará, sobrescribirá o eliminará cualquier nueva entrada ARP pro
SysEngT

Respuestas:

4

Edición 2 :

Como lo mencionaste...

ip route 10.1.0.0 255.255.0.0 iface0

Obliga a Brocade a proxy-arp para cada destino en 10.1.0.0/16 como si estuviera directamente conectado iface0.

No puedo responder sobre la implementación de caché ARP de Brocade, pero simplemente señalaría la solución fácil a su problema ... configure su ruta de manera diferente:

ip route 10.1.0.0 255.255.0.0 CiscoNextHopIP

Al hacer esto, evita que Brocade ARP-ing para todo 10.1.0.0/16 (nota, es posible que deba renumerar el enlace entre R1 y R2 para estar fuera de 10.1.0.0/16, dependiendo de la implementación de las cosas de Brocade) .


Respuesta original :

Espero que en la mayoría, o incluso en todas las implementaciones, haya un límite estricto en la capacidad de la tabla ARP.

Los enrutadores Cisco IOS CPU solo están limitados por la cantidad de DRAM en el enrutador, pero eso generalmente no será un factor limitante. Algunos conmutadores (como Catalyst 6500) tienen una limitación estricta en la tabla de adyacencia (que está correlacionada con la tabla ARP); Sup2T tiene 1 millón de adyacencias .

Entonces, ¿qué sucede cuando el caché ARP está lleno y se ofrece un paquete con un destino (o siguiente salto) que no está en caché?

Los enrutadores Cisco IOS CPU no se quedan sin espacio en la tabla ARP, porque esos ARP se almacenan en DRAM. Supongamos que estás hablando de Sup2T. Piénselo de esta manera, suponga que tiene un Cat6500 + Sup2T y configuró todos los Vlans posibles, técnicamente eso es

4094 total Vlans - Vlan1002 - Vlan1003 - Vlan1004 - Vlan1005 = 4090 Vlans

Suponga que hace que cada Vlan sea un / 24 (es decir, 252 ARP posibles), y empaca cada Vlan completo ... eso es 1 millón de entradas ARP.

4094 * 252 = 1,030,680 ARP Entries

Cada uno de esos ARP consumiría una cierta cantidad de memoria en la propia tabla ARP, más la tabla de adyacencia IOS. No sé qué es, pero digamos que la sobrecarga total de ARP es de 10 bytes ...

Eso significa que ahora ha consumido 10 MB para gastos generales ARP; todavía no es mucho espacio ... si tuvieras tan poca memoria, verías algo así %SYS-2-MALLOCFAIL.

Con tantos ARP y un tiempo de espera de ARP de cuatro horas, tendría que dar servicio a casi 70 ARP por segundo en promedio; es más probable que el mantenimiento de 1 millón de entradas ARP agote la CPU del enrutador (posiblemente mensajes de CPUHOG).

En este punto, puede comenzar a rebotar las adyacencias del protocolo de enrutamiento y tener direcciones IP que son simplemente inalcanzables porque la CPU del enrutador estaba demasiado ocupada para ARP para la IP.

Mike Pennington
fuente
2

La única experiencia real que tuve con este hecho fue en los conmutadores C3550 (límite de MAC de 2-8k, dependiendo de la plantilla sdm) y allí se eliminó la entrada más antigua de la tabla.


fuente
1
Parece que estás hablando de la tabla de reenvío MAC, no de la caché ARP. Por favor vea mi edición.
neirbowj
1
Te entiendo. Sin embargo, en este caso particular, el efecto fue el mismo ya que estos conmutadores también fueron la terminación L3 para una serie de subredes IP muy grandes. Finalmente resuelto mediante la sustitución de los interruptores. En L2, el conmutador inunda tramas para las que no puede almacenar en caché un MAC, pero en L3 tiene que eliminar las entradas ARP más antiguas y / o ARP para cada paquete que agotará rápidamente la CPU en ellas.
2

Para IOS y JunOS y otras pilas comerciales que solo tienes que probar, por suerte no es muy difícil.

Pero para linux , freebsd, netbsd, openbsd, uIP, lwIP y probablemente muchas otras implementaciones, simplemente puede verificar su código fuente para el comportamiento.

En Linux, debe marcar 'net / core / neighbour.c' (comience con la línea 'if (entradas> = tbl-> gc_thresh3' || ') y' net / ipv4 / arp.c '.
En Linux parece que tener tres niveles completos

  1. gc_thresh1: no se hace nada hasta que se golpea
  2. gc_thresh2: esto puede ser golpeado momentáneamente
  3. gc_thresh3: no se puede exceder este tamaño

Cuando gc_thresh3 intenta exceder, intenta forzar la ejecución de la recolección de basura, a menos que ya se haya ejecutado recientemente. La recolección de basura parece eliminar las entradas a las que ya no se hace referencia, por lo que no significa más antiguo o más nuevo, sin embargo, gc_staletime exceder parece ser una forma de desreferenciar la entrada, que nuevamente se traduce en la entrada más antigua.
Si no se puede ejecutar la recolección de basura, simplemente no se agrega una nueva entrada. Todos estos intervalos de recolección de basura periódica y gc_threshN se pueden ajustar.
El código es independiente de la familia de direcciones (ipv4, ipv6), por lo que las tablas IPv6 ND e IPv4 ARP se manejan exactamente con la misma ruta de código, no ruta duplicada.

ytti
fuente
1

Arpiaría para la dirección IP almacenarlo en la tabla y, dependiendo de la implementación, debería eliminar la entrada más antigua. El impacto en el rendimiento depende, si esta es una ocurrencia infrecuente, no hay mucho impacto, pero este es un vector de ataque para que alguien pueda enviar muchas arps que afecten la utilización del procesador

fredpbaker
fuente
1

El conmutador irá a ARP para que la IP de destino obtenga su dirección MAC (que también llenaría la tabla CAM con la respuesta). La solicitud ARP se transmite a todos los puertos. Esto requiere la CPU e implica el ARP Inputproceso. Si las solicitudes ARP son para la misma IP, debido a que la tabla ARP se desborda con frecuencia, el conmutador debe limitar la velocidad del ARP a una vez cada dos segundos. Si las solicitudes son IP aleatorias con suficiente frecuencia, la CPU puede aumentar cuando esa CPU está involucrada tanto en las solicitudes ARP como en las respuestas.

generalnetworkerror
fuente
¿Dónde encontraste el límite de "una vez cada dos segundos"?
Marco Marzetti
"Las solicitudes ARP para la misma dirección IP están limitadas a una solicitud cada dos segundos" - cisco.com/en/US/products/hw/routers/ps359/…
generalnetworkerror
¿No es un valor específico de C7500? Por ejemplo, C6500 puede usar el comando "mls qos protocol arp police <bps>" o CoPP.
Marco Marzetti
1

De los ataques que aprendí en los switches Cisco 3550, 3560, etc., puede convertirlos en hub gigante una vez que sobrecargue el límite de la dirección MAC. Los conmutadores tienen un límite establecido de dirección MAC (alrededor de 6000) que se puede almacenar, y una vez que se alcanza ese límite, inundará todos los datos de sus interfaces. No recuerdo si eso se aplica a los paquetes 802.1q porque no he tenido que hacerlo en mucho tiempo. Puede que tenga que encender mi laboratorio de red en casa para averiguarlo.

SISTEMA
fuente
Parece que también está hablando de la tabla de reenvío MAC, no de la caché ARP. Por favor vea mi edición.
neirbowj