Packetloss sobre Internet para “Linux-Linux” mas não para “Windows-Linux” (tl; dr: é MTU)

2

Estou agora adquirindo cabelos grisalhos adicionais combatendo um fenômeno relacionado à perda de pacotes entre máquinas na Internet.

Verifique o diagrama abaixo. Note que sempre que eu uso "SSH" eu poderia usar "HTTPS"; o mesmo fenômeno ocorre para esse protocolo.

Um servidor SSH executando o Fedora 22 está no "Site A" (vinho tinto). Eu nunca tive problemas de conexão até "recentemente".

Conexões SSH com o "Site A" das máquinas Amazon EC2 que executam o Fedora 22 ou o Fedora 23 funcionam perfeitamente bem (hosts mostrados em verde dentro da caixa "Amazon EC2")

As conexões SSH ao "Site A" do "Site B", que está no mesmo AS, não funcionam em nenhum sistema Fedora que testei (caixas laranja). No entanto, eles fazem funcionam em um sistema Windows 7 usando Putty . O mesmo hardware (dual-boot) está envolvido em ambos os casos. "Site B" também tem um firewall, mas isso não parece desempenhar nenhum papel: tentei configurar a conexão diretamente do roteador FritzBox e ainda não funcionou para o Fedora, mas funcionou para o Windows.

Como o problema se manifesta:

Quando você se conecta usando SSH, há uma troca inicial de pacotes acontecendo (como mostrado pelo tcpdump). No entanto, depois de 20 pacotes ou mais, os pacotes de saída parecem não ir mais a lugar nenhum; nenhum reconhecimento volta do Site A. Você nunca chega ao prompt da senha. Um CTRL-C reinicia corretamente a conexão, após o que o Linux ainda tenta enviar os pacotes que nunca foram ACKed por um tempo.

SuspeitoqueexistaalgumproblemanomeuISP,emparticular,suspeitoqueoISPexecutamagiasuspeitaparaimplementaro"endereço IP fixo" no Site B, que é a única coisa que mudou "recentemente".

No entanto, não consigo entender o que levaria em conta o fato de uma conexão SSH funcionar no Windows, mas não no Linux, nas mesmas condições, em termos de rede. O que devo procurar?

por David Tonhofer 10.02.2016 / 23:44

2 respostas

2

Seu rastreamento de pacote mostra:

22:29:22.180852 IP (tos 0x0, ttl 64, id 52989, offset 0, flags [DF], proto TCP (6), length 1900)   
SITE_B_LAN_ADDR.54358 > SITE_A.SSH_PORT: Flags [P.], cksum 0x05c4 (incorrect -> 0xadce), seq 22:1870, ack 22, win 229, options [nop,nop,TS val 4294917498 ecr 71539420], length 1848

Observe que é um tamanho de byte de 1900 com uma opção de não fragmentar definida no pacote. MTUs típicas tendem a estar entre 1400-1500 bytes.

Provavelmente você está recebendo pacotes com mensagens ICMP muito grandes, mas perdendo todo o tráfego ICMP de entrada no site. Um firewall.

Para testar isso você teria que fazer o rastreamento de pacotes em seu firewall para icmp e tcp 22.

Certifique-se de permitir o envio de mensagens muito grandes do pacote ICMP no site A.

Alternativamente, você pode tentar configurar o MTU em suas caixas Linux no Site A para algo abaixo do tamanho da sua rede MTU. Estou arriscando um palpite de que no Fedora você tem pacotes jumbo habilitados, mas no Windows você não.

    
por 13.02.2016 / 23:57
1

Após as sugestões dos queridos comentaristas, procurei ver se um problema de MTU poderia ser a causa.

O seguinte foi encontrado ao tentar conectar-se do "Site A" ao "Site B" de um sistema Fedora. Em um sistema Windows, tudo está funcionando perfeitamente - wireshark indica que o comprimento dos pacotes de saída nunca excede 1158 bytes, então o problema não é acionado lá.

Em resumo, se eu ler corretamente:

  1. Existe uma troca bem sucedida inicial de pequenos pacotes.
  2. Um pacote com tamanho 1900 é enviado. Eu suponho que a placa de rede divida isso porque o MTU para a rede local é de 1500.
  3. Um roteador na rede ISP com endereço 10.10.80.7 nos diz "por favor fragmentar o pacote para MTU 1492 ".
  4. Wilco! Um pacote com comprimento 1492 é enviado.
  5. Um roteador na rede ISP com endereço 10.10.80.7 nos diz para "por favor, fragmentar o pacote para MTU 1492".
  6. As coisas desçam a partir daqui.

Parece que terei que abrir um ticket com o ISP (que é o POST Telecom Luxembourg, caso alguém pesquise problemas semelhantes).

Também sugere uma correção. Forçar o MTU para SITE_A a 1000:

ip route add $SITE_A_IP via $GATEWAY_IP dev $ETHDEV mtu lock 1000

De fato, isso resolve o problema.

Informação de referência

Use ping para testar o comportamento da MTU:

ping -c $COUNT -M $MTUDS -s $PPLSZ $HOST

onde

  • COUNT=1 : "Apenas um ping"
  • MTUDS=do : A estratégia de descoberta de MTU é "proibir a fragmentação, mesmo local", ou seja, definir o bit 'DF' (não fragmentar) (por que isso é 'do'? dunno). USE ESTE.
  • MTUDS=want : A estratégia de descoberta da MTU é "fazer descoberta do PMTU, fragmentar localmente quando o tamanho do pacote é grande", ou seja, definir o bit 'DF' e fragmentar localmente
  • MTUDS=dont : a estratégia de descoberta da MTU é "não defina o bit 'DF'", ou seja, fragmento conforme necessário
  • PPLSZ=1464 : tamanho do payload do pacote ping ICMP em byte.

Use tcpdump para monitorar todos os pacotes e pacotes ICMP de e para o "Site A":

tcpdump -vvv -n -nn icmp or '(' host $SITE_A_IP ')'

Isso é um pouco difícil de ler.

Veja o que o kernel pensa sobre o MTU para o "Site A".

watch ip route get to $SITE_A_IP

Observe que um MTU menor que o padrão será armazenado em cache com um TTL de 600 segundos após o primeiro ping com falha.

Cenário

Suponha que o tamanho máximo do pacote IP em byte (ou seja, o tamanho da carga Ethernet) seja 1492 (esse é o caso no Amazon EC2), então um tamanho interessante de carga útil seria 1465, porque o byte 28 usado para o IP e informações de cabeçalho ICMP dariam 1493, um byte pas no máximo.

Então ping -c 1 -M want -s 1465 $HOST_IP faz o seguinte:

No primeiro ping você recebe "Frag needed e DF set (mtu = 1492) 100% de perda de pacotes". tcpdump mostra a parte de solicitação de eco 1 (comprimento 1493) saindo e um roteador da rede de destino enviando de volta um "ICMP inacessível" com a solicitação para fragmentar a MTU 1492. Uma entrada em cache com MTU = 1492 aparece na rota do kernel cache.

Em pings subsequentes, você recebe "1 pacotes transmitidos, 1 recebido". tcpdump mostra a parte de pedido de eco 1 (comprimento 1492) e a parte de pedido de eco 2 (comprimento 21, deslocamento 1472) e a resposta de eco correspondente (comprimento 1493).

Ou você pode usar o traceroute

# traceroute --mtu SITE_A 1500

Tamanho do pacote de 1500. Traceroute nos diz que a rota 10.10.80.7 tem MTU 1492

traceroute to SITE_A (SITE_A_IP), 30 hops max, 1500 byte packets
 1  gateway (192.168.10.1)  0.550 ms  0.536 ms  0.393 ms
 2  192.168.178.1 (192.168.178.1)  1.458 ms  1.485 ms  1.344 ms
 3  10.10.80.7 (10.10.80.7)  4.889 ms F=1492  2.968 ms  4.854 ms
 4  10.10.80.7 (10.10.80.7)  4.955 ms !F-1492  3.559 ms !F-1492  5.022 ms !F-1492

Tente com 1492: mesmo problema!

traceroute to SITE_A (SITE_A_IP), 30 hops max, 1492 byte packets
 1  gateway (192.168.10.1)  0.635 ms  0.554 ms  0.483 ms
 2  192.168.178.1 (192.168.178.1)  1.510 ms  1.504 ms  1.311 ms
 3  10.10.80.7 (10.10.80.7)  48.305 ms  17.436 ms  5.496 ms
 4  10.10.80.7 (10.10.80.7)  5.963 ms !F-1492  6.865 ms !F-1492  4.887 ms !F-1492

Tente com 1491: o mesmo problema!

traceroute to SITE_A (SITE_A_IP), 30 hops max, 1491 byte packets
 1  gateway (192.168.10.1)  0.594 ms  0.650 ms  0.492 ms
 2  192.168.178.1 (192.168.178.1)  1.716 ms  1.782 ms  1.580 ms
 3  10.10.80.7 (10.10.80.7)  7.327 ms  7.385 ms  4.775 ms
 4  10.10.80.7 (10.10.80.7)  5.210 ms !F-1492  5.624 ms !F-1492  4.841 ms !F-1492

Tente com 1490: passamos. Não é obrigado a haver algum erro off-by-one lá.

traceroute to SITE_A (SITE_A_IP), 30 hops max, 1490 byte packets
 1  gateway (192.168.10.1)  0.616 ms  0.688 ms  0.484 ms
 2  192.168.178.1 (192.168.178.1)  1.712 ms  1.853 ms  1.611 ms
 3  10.10.80.7 (10.10.80.7)  6.248 ms  7.008 ms  4.995 ms
 4  SITE_A_IP.dyn.luxdsl.pt.lu (SITE_A_IP)  12.441 ms !X  9.641 ms !X  9.576 ms !X

Mais informações de interesse:

por 14.02.2016 / 00:01