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.
- R1 recebe um pacote destinado à rede 10.1.0.0/16.
- Com base na rota da interface estática, R1 ARPs para o destino em
iface0
- O R2 reconhece que pode chegar ao destino e responde ao ARP com seu próprio MAC.
- 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?"
Respostas:
Edição 2 :
Como você mencionou...
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:
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 :
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 .
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
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.
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.
fonte
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
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
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.
fonte
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
fonte
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 Input
processo. 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.fonte
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.
fonte