O que acontece quando o cache do ARP transborda?

14

Em pelo menos uma implementação, há um limite rígido na capacidade da tabela ARP. O que acontece quando o cache do ARP está cheio e um pacote é oferecido com um destino (ou salto seguinte) que não é armazenado em cache? O que acontece sob o capô e qual é o efeito na qualidade do serviço?

Por exemplo, os roteadores Brocade NetIron XMR e Brocade MLX possuem um sistema máximo configurávelip-arp . O valor padrão nesse caso é 8192; o tamanho de uma sub-rede / 19. Não está claro na documentação se isso é por interface ou para todo o roteador, mas, para o propósito desta pergunta, podemos assumir que é por interface.

Poucos membros da rede configurariam uma sub-rede / 19 em uma interface de propósito, mas não foi o que aconteceu. Estávamos migrando um roteador principal de um modelo da Cisco para um Brocade. Uma das muitas diferenças entre Cisco e Brocade é que a Cisco aceita rotas estáticas definidas com uma interface de saída e um endereço de próximo salto, mas Brocade insiste em uma ou na outra. Largamos o endereço do próximo salto e mantivemos a interface. Mais tarde, aprendemos o erro de nossos caminhos e mudamos da interface para o endereço do próximo salto, mas tudo parecia estar funcionando inicialmente.

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

Antes da migração, o R1 era um Cisco e tinha a seguinte rota.

ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2

Após a migração, o R1 era um Brocade e tinha a seguinte rota.

ip route 10.1.0.0 255.255.0.0 iface0

R2 é um roteador Cisco e roteadores Cisco executam proxy ARP por padrão. Essa é a (mis) configuração da produção que define o cenário para o que acabou sendo um estouro de cache do ARP.

  1. R1 recebe um pacote destinado à rede 10.1.0.0/16.
  2. Com base na rota da interface estática, R1 ARPs para o destino em iface0
  3. O R2 reconhece que pode chegar ao destino e responde ao ARP com seu próprio MAC.
  4. R1 armazena em cache o resultado do ARP que combina um IP em uma rede remota com o MAC do R2.

Isso acontece para todos os destinos distintos em 10.1.0.0/16. Conseqüentemente, mesmo que o / 16 esteja adequadamente sub-líquido além do R2 e haja apenas dois nós no link adjacente R1 e R2, o R1 sofre sobrecarga de cache do ARP porque induz o R2 a se comportar como se todos os endereços de 65k estivessem diretamente conectados.

O motivo pelo qual estou fazendo essa pergunta é porque espero que isso me ajude a entender os relatórios de problemas do serviço de rede (dias depois) que nos levaram, eventualmente, ao cache ARP que estava transbordando. No espírito do modelo StackExchange, tentei destilar isso para o que acredito ser uma pergunta específica e nítida que pode ser respondida objetivamente.

EDIT 1 Para ficar claro, estou perguntando sobre parte da camada de cola entre o link de dados (camada 2) e a rede (camada 3), não a tabela de encaminhamento de MAC dentro da camada de link de dados. Um host ou roteador cria o primeiro para mapear endereços IP para endereços MAC, enquanto um switch cria o último para mapear endereços MAC para portas.

EDIÇÃO 2 Embora eu aprecie o esforço que os respondentes fizeram para explicar por que algumas implementações não estão sujeitas ao estouro de cache do ARP, sinto que é importante para esta pergunta abordar as que são. A questão é "o que acontece quando", e não "o fornecedor X é suscetível a". Eu fiz minha parte agora descrevendo um exemplo concreto.

Edição 3 Outra pergunta que não é é "como impedir que o cache ARP transborda?"

neirbowj
fonte
você está procurando informações sobre a tabela de endereços mac ou a tabela ARP transbordando?
Mike Pennington
você poderia explicar como você acha que a tabela arp estouraria? isso está relacionado a um problema real ou puramente hipotético? de qualquer maneira, precisamos de detalhes sobre qual cenário preciso estamos respondendo #
Mike Pennington
@ MikePennington Este é um problema real. O cache do ARP poderá estourar se, por exemplo, um grande número de IPs estiver presente ou agir como se estivesse presente em um único link.
Neirbowj
O Cisco IOS não armazena em cache os ARPs em um roteador, a menos que o ARP seja originado de uma sub-rede configurada no roteador. Quando eu digo "um problema real", quer dizer, um problema que você está tendo ... não é um problema que você está imaging poderia acontecer
Mike Pennington
Obrigado por reformular a pergunta, porque quando penso em switches (camada 2), você não tem tabela ARP. O ARP tem a ver com TCP / IP e um comutador da camada 2 não pensa assim, mas quando você entra na comutação da camada três, pode ter uma tabela ARP. No entanto, se bem me lembro, a interface no switch da camada 3 precisa ter um endereço IP para aparecer na tabela ARP. Realmente não entendi o que você estava dizendo a princípio, o convidado da manhã está sendo duro comigo. O programador em mim pensa que uma vez que a tabela ARP está cheio ele quer bater, substituição ou soltar qualquer novo ARP entradas pro
SysEngT

Respostas:

4

Edição 2 :

Como você mencionou...

ip route 10.1.0.0 255.255.0.0 iface0

Força o Brocade a proxy-arp para todos os destinos em 10.1.0.0/16 como se estivesse diretamente conectado iface0.

Não posso responder sobre a implementação do cache ARP da Brocade, mas simplesmente apontaria a solução fácil para o seu problema ... configure sua rota de maneira diferente:

ip route 10.1.0.0 255.255.0.0 CiscoNextHopIP

Ao fazer isso, você impede o Brocade de ARP-ing para todos os 10.1.0.0/16 (observe, pode ser necessário renumerar o link entre R1 e R2 para ficar fora de 10.1.0.0/16, dependendo da implementação do Brocade) .


Resposta original :

Espero que na maioria das implementações, ou mesmo em todas, haja um limite rígido na capacidade da tabela ARP.

Os roteadores de CPU do Cisco IOS são limitados apenas pela quantidade de DRAM no roteador, mas isso normalmente não será um fator limitante. Alguns comutadores (como o Catalyst 6500) têm uma limitação rígida na tabela de adjacência (que está correlacionada à tabela ARP); Sup2T tem 1 milhão de adjacências .

Então, o que acontece quando o cache do ARP está cheio e um pacote é oferecido com um destino (ou salto seguinte) que não é armazenado em cache?

Os roteadores de CPU do Cisco IOS não ficam sem espaço na tabela ARP, porque esses ARPs são armazenados na DRAM. Vamos supor que você esteja falando do Sup2T. Pense assim: suponha que você tenha um Cat6500 + Sup2T e tenha configurado todos os Vlans possíveis, tecnicamente

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

Suponha que você torne cada Vlan a / 24 (ou seja, 252 ARPs possíveis) e empacote todas as Vlan cheias ... ou seja, 1 milhão de entradas ARP.

4094 * 252 = 1,030,680 ARP Entries

Cada um desses ARPs consumiria uma certa quantidade de memória na própria tabela ARP, mais a tabela de adjacência do IOS. Não sei o que é, mas digamos que a sobrecarga total do ARP seja 10 bytes ...

Isso significa que você já consumiu 10 MB para sobrecarga do ARP; ainda não é muito espaço ... se você estivesse com pouca memória, veria algo assim %SYS-2-MALLOCFAIL.

Com tantos ARPs e um tempo limite de quatro horas, você teria que atender quase 70 ARPs por segundo, em média; é mais provável que a manutenção em 1 milhão de entradas ARP drene a CPU do roteador (potencialmente mensagens CPUHOG).

Nesse ponto, você pode começar a rejeitar adjacências do protocolo de roteamento e ter IPs inacessíveis porque a CPU do roteador estava muito ocupada para o ARP para o IP.

Mike Pennington
fonte
2

A única experiência real que tive com esse acontecimento foi em switches C3550 (limite de MAC de 2-8k, dependendo do modelo sdm) e, nesse caso, retirou a entrada mais antiga da tabela.


fonte
1
Parece que você está falando sobre a tabela de encaminhamento MAC, não sobre o cache ARP. Por favor, veja minha edição.
Neirbowj 15/07/2013
1
Eu entendo o seu ponto. No entanto, nesse caso específico, o efeito foi o mesmo que esses comutadores também foram a terminação L3 para várias sub-redes IP muito grandes. Eventualmente resolvido substituindo os comutadores. No L2, o switch inunda quadros para os quais não é possível armazenar em cache um MAC, mas no L3 ele precisa eliminar entradas ARP mais antigas e / ou ARP para cada pacote que esgotará rapidamente a CPU naquelas.
2

Para IOS, JunOS e outras pilhas comerciais, você só precisa testar, não é muito difícil por sorte.

Mas para linux , freebsd, netbsd, openbsd, uIP, lwIP e provavelmente muitas outras implementações, você pode apenas verificar o código-fonte quanto ao comportamento.

No Linux, você precisa verificar 'net / core / neighbour.c' (comece com a linha 'if (entradas> = tbl-> gc_thresh3' || ') e' net / ipv4 / arp.c '.
No Linux, você parece tem três níveis completos

  1. gc_thresh1 - nada é feito até que isso seja atingido
  2. gc_thresh2 - isso pode ser atingido momentaneamente
  3. gc_thresh3 - esse tamanho não pode ser excedido

Quando o gc_thresh3 tenta exceder, ele tenta forçar a execução da coleta de lixo, a menos que já tenha sido executada recentemente. A coleta de lixo parece excluir as entradas que não são mais referidas, portanto, não significa mais antiga ou mais nova, no entanto, gc_staletime exceder parece ser uma maneira de remover a referência da entrada, que novamente se traduz na entrada mais antiga.
Se a coleta de lixo não puder ser executada, uma nova entrada simplesmente não será adicionada. Todos esses intervalos periódicos de coleta de lixo e gc_threshN podem ser ajustados.
O código é independente da família de endereços (ipv4, ipv6), portanto, as tabelas IPv6 ND e IPv4 ARP são tratadas exatamente pelo mesmo caminho de código, e não pelo caminho duplicado.

ytti
fonte
1

Arp para o endereço IP armazená-lo na tabela e, dependendo da implementação, deve excluir a entrada mais antiga. O impacto no desempenho depende: se essa ocorrência é incomum, não há muito impacto, mas esse é um vetor de ataque, para que alguém possa enviar muitos arcos afetando a utilização do processador

fredpbaker
fonte
1

O switch vai para o ARP para esse IP de destino para obter seu endereço MAC (que também preencheria a tabela CAM com a resposta). A solicitação ARP é transmitida para todas as portas. Isso requer a CPU e envolve o ARP Inputprocesso. Se as solicitações de ARP tiverem o mesmo IP, devido à sobrecarga frequente da tabela ARP, o comutador deverá limitar a taxa do ARP a uma vez a cada dois segundos. Se as solicitações tiverem IPs aleatórios com frequência suficiente, a CPU poderá aumentar conforme a CPU estiver envolvida nas solicitações e respostas do ARP.

generalnetworkerror
fonte
Onde você encontrou o limite "uma vez a cada dois segundos"?
Marco Marzetti 19/07/2013
"Requisições ARP para o mesmo endereço IP estão a um pedido a cada dois segundos limita-rate" - cisco.com/en/US/products/hw/routers/ps359/...
generalnetworkerror
Não é um valor específico do C7500? Por exemplo, o C6500 pode usar o comando "mls qos protocol arp police <bps>" ou CoPP.
Marco Marzetti 22/07/2013
1

Com os ataques que aprendi nos switches Cisco 3550, 3560 etc., você pode transformá-los em um hub gigante depois de sobrecarregar o limite de endereços MAC. Os comutadores têm um limite definido de endereço MAC (cerca de 6000) que pode ser armazenado e, uma vez atingido esse limite, todos os dados serão inundados por suas interfaces. Não me lembro se isso vale para pacotes 802.1q porque eu não precisava fazer isso há muito tempo. Pode ter que iniciar meu laboratório de rede em casa para descobrir.

SysEngT
fonte
Parece que você também está falando sobre a tabela de encaminhamento de MAC, não sobre o cache ARP. Por favor, veja minha edição.
Neirbowj