Uma possibilidade além do simples preenchimento de tabela MAC é uma colisão ARP gratuita.
O caso em que estou pensando exige duas coisas:
- Uma má máscara de rede, provavelmente na caixa do Jenkins.
- Um de:
- Mais de um dispositivo configurado para ARP gratuito na sub-rede da caixa Jenkins, um dos quais é stateful (talvez um firewall ou um balanceador de carga).
- O dispositivo configurado para G-ARP não é o dispositivo que você espera que seja o gateway padrão.
Como o ARP supostamente deve funcionar
No estado inicial quando a caixa Jenkins não foi interagida e todas as várias tabelas router / switch / arp estão vazias, se a sua caixa Jenkins configurada incorretamente tentar acessar um host, ela considera local devido à má máscara de rede. mas na verdade é remoto, o dispositivo configurado para o Gratuitous ARP vai mentir para ele e diz que é o endereço IP em questão e o encaminha silenciosamente para onde ele precisa ir.
Caso de vários dispositivos G-ARP
Neste caso, existem dois dispositivos enviando pacotes G-ARP. O modo de falha aqui é:
- O Jenkins envia uma solicitação ARP para um endereço fora da sub-rede.
- O primeiro dispositivo G-ARP responde que tem esse endereço.
- Jenkins envia o pacote SYN para o dispositivo remoto.
- O dispositivo remoto confirma a conexão e é recebido por Jenkins.
- Antes da emissão do SYN-ACK, o 2º dispositivo G-ARP também envia uma resposta ARP indicando que possui esse endereço. Jenkins atualiza obedientemente sua tabela ARP local.
- O pacote SYN-ACK passa pelo 2º dispositivo G-ARP. Infelizmente, uma vez que nunca viu o pacote SYN inicial, ele não está ciente da conexão, então a solta no chão.
- A conexão nunca é aberta.
Isso é visível em ambos os hosts, observando os estados do soquete em netstat
. E bem visível se você pegar pacotes na caixa do Jenkins.
Conexões PARA isso funcionar porque elas estão vindo através do 2º dispositivo G-ARP, e assim atualizando a tabela ARP do Jenkins com o dispositivo 'direito' para passar os pacotes. Enquanto essa conexão estiver ativa e passando tráfego, o tráfego de saída seguirá o caminho certo.
O dispositivo errado responde ao G-ARP
Esta é uma variação do acima. Apenas um dispositivo está configurado para o G-ARP, mas não é o correto. O G-ARP é quase definitivamente uma configuração ruim.
- O Jenkins envia uma solicitação ARP para um endereço fora da sub-rede.
- O dispositivo G-ARP responde que tem esses endereços.
- Jenkins envia o pacote SYN para esse dispositivo.
- O dispositivo não é, na verdade, um roteador ou não está configurado para transmitir pacotes como esse, então o coloca no chão.
Como no caso acima, quando você estabelece uma conexão, ela configura a tabela ARP para transmitir as coisas da maneira correta, desde que a conexão esteja ativa.
A correção mais fácil é verificar se a sua máscara de rede na caixa está correta para a sub-rede, pois ela ignora todo o problema do G-ARP.
A outra possibilidade é que há algo estranho com o gateway padrão que você configurou. Se é o que todo o resto é, você deveria estar vendo o mesmo comportamento para qualquer coisa usando aquele gateway; Se esse for o caso, verifique se o mesmo problema não acontece com outras VMs no mesmo host.