Estranha interrupção de rede temporária no Linux

7

Estou enfrentando um problema muito chato que notei daqui a uma semana e para o qual não consigo encontrar uma resposta: minha rede pára de responder, geralmente voltando exatamente 25 segundos depois. Eu estava usando o kernel 3.10.4 e agora migrei para 3.11-rc4 para ver se algo mudou, mas não, o comportamento é o mesmo. E como é difícil identificar um problema devido ao fato de que a navegação na web é comum, e a interrupção é completamente aleatória, eu não posso dizer que esse problema estava presente em um kernel anterior também (eu sempre uso custom mas kernels sem correção do kernel.org, todos compilados por mim)

Eu também não sei se o kernel é o culpado, mas posso dizer que não há pistas sobre os logs do sistema (verifiquei ambos /var/log/syslog e /var/log/messages e não há nada incomum lá) e esse hardware não parece ser uma falha, pois o problema aparece usando uma das minhas placas de rede:

lspci output:

02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5751 Gigabit Ethernet PCI Express (rev 01)
04:00.0 Ethernet controller: 3Com Corporation 3c905B 100BaseTX [Cyclone] (rev 30)

e eu já tentei trocar as portas do switch Ethernet e ainda ninguém mais onde eu trabalho tem um problema exceto eu (embora usemos máquinas similares, eu sou o único usando Linux, então eu tive que levar algumas piadas infames sobre isso também ... hehe).

Eu acelerei o wireshark na minha máquina e o deixei ping continuamente em nosso gateway e em outra máquina no mesmo segmento de rede. Então, ao primeiro sinal de mau funcionamento da rede, eu verificaria e verificaria se o gateway parou de responder pings, mas a outra máquina ainda estava lá respondendo normalmente. Algumas outras vezes é a outra máquina que pára de responder e o gateway é bom, e outras vezes ambos param de responder. Eu não sei mais o que fazer, então eu gostaria de alguma ajuda ou dicas sobre como depurar isso, já que os logs do sistema são completamente normais.

Eu tenho meu arquivo de configuração do kernel e um arquivo de captura do wireshark mostrando a situação. Eu posso postar aqui ou em algum site pastebin no caso de alguém achar útil entender o caso, apenas por favor deixe-me saber o nível de detalhes que devo usar (eu acho que o nível de pacote sem os dados brutos seria suficiente).

    
por Claudio 08.08.2013 / 00:31

2 respostas

9

Os sintomas são consistentes com um conflito de endereço IP. Um conflito de endereço IP surge quando sua máquina e alguma outra máquina na mesma rede estão tentando usar o mesmo endereço IP .

Em uma rede de link local, o endereçamento é baseado em endereços MAC . Cada placa Ethernet possui seu próprio endereço MAC (exceto configuração incorreta ou malícia). Um roteador que decide para onde enviar um pacote IP enviará um ARP solicita o endereço IP de destino em todas as suas portas. Essa mensagem é às vezes conhecida como "quem tem": o roteador está tentando descobrir qual dos seus pares é responsável por esse endereço IP. Quando o roteador recebe uma resposta contendo um endereço MAC, ele pode criar e enviar um quadro Ethernet (pacote Ethernet) contendo o pacote IP para esse endereço MAC. Como essa troca demora um pouco, o roteador mantém um cache de informações recentes do ARP. (Existem outros tipos de mensagens ARP, mas o que expliquei aqui é suficiente para entender o problema atual.)

Em suma, os roteadores precisam saber em qual dispositivo físico cada endereço IP envia os pacotes IP. Então, o que acontece quando há dois dispositivos reivindicando o mesmo endereço IP? O roteador recebe uma resposta de um dos dispositivos e, a partir de então, decide que esse endereço IP pertence a esse dispositivo, até que a entrada de cache correspondente expire. Depois que a entrada do cache expirar, o roteador enviará uma nova solicitação ARP, e talvez o outro dispositivo responda mais rápido dessa vez. Isso explica por que tais situações são instáveis: em um minuto o roteador está falando com você, no minuto seguinte ele está falando com o outro cara.

Se você pingar alguém continuamente, o roteador manterá seu endereço IP em seu cache ARP praticamente o tempo todo. Então, enquanto você está pingando, há apenas uma pequena janela durante a qual o outro cara pode substituí-lo no cache (depois que sua entrada de cache expirar, antes do próximo ping chegar). É por isso que observar o problema faz com que ele desapareça, o que pode ser frustrante até você perceber qual é o problema.

No seu caso, parece que o seu roteador local mantém as entradas em seu cache por 25 segundos. Quando você está no cache, você é bom por 25 segundos. Então, às vezes, o outro cara aparece, em momentos aleatórios, e você fica de fora por 25 segundos.

Quando você tenta entrar em contato com várias máquinas no mesmo link local, cada uma tem sua própria tabela ARP, portanto você pode observar resultados inconsistentes, com uma máquina decidindo que você possui o endereço IP e outra máquina decidindo que o outro.

Os roteadores high-end registram conflitos de endereço IP, portanto, se você acha que está encontrando um, solicite a ajuda do administrador do sistema. Certifique-se primeiro de que não é a sua máquina que está tentando usar um endereço IP que não deveria estar usando!

    
por 12.08.2013 / 20:46
1

Vou sugerir que você tenha 2 entradas de "nameserver" em /etc/resolv.conf , e a primeira entrada se refere a um servidor DNS que está inativo ou inacessível ou que faz periodicamente. O código do resolvedor na libc tentará o primeiro endereço IP do servidor de nomes, obterá um tempo limite e, em seguida, tentará o segundo endereço IP do servidor de nomes, o que é bem-sucedido.

Para testar isso, você pode substituir os endereços IP de "nameserver" em /etc/resolv.conf por apenas um, 8.8.8.8, que é o servidor DNS público do Google. Se a interrupção não ocorrer, seu servidor de nomes é o problema.

    
por 08.08.2013 / 00:56