O que há de mágico no MTU e na queda de pacotes?

O que há de mágico no MTU e na queda de pacotes?

Com MTU padrão conforme mostrado abaixo:

hosta$ ifconfig eth0 | grep mtu
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

Posso fazer ping de um servidor diferente usando uma carga útil de 1500

hostb$ ping -s 1500 -c 2 hosta
PING hosta (hosta) 1500(1528) bytes of data.
1508 bytes from hosta: icmp_seq=1 ttl=64 time=0.273 ms
1508 bytes from hosta: icmp_seq=2 ttl=64 time=0.314 ms

--- estatísticas de ping do hosta ---

2 packets transmitted, 2 received, 0% packet loss, time 1025ms
rtt min/avg/max/mdev = 0.273/0.293/0.314/0.020 ms

tcpdump no hosta está tudo bem

12:01:40.237047 IP hostb > hosta: ICMP echo request, id 3052, seq 1, length 1480
12:01:40.237048 IP hostb  > hosta: icmp
12:01:40.237116 IP hosta > hostb: ICMP echo reply, id 3052, seq 1, length 1480

Posso diminuir o MTU no hosta para 1488 e o ping de carga útil de 1500 funciona.

O número mágico é MTU=1487

hosta $ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1487
<snip>

Quando envio o ping de 1500 bytes (sem mexer com flag de fragmentação) não há resposta

hosb $ ping -s 1500 -c 2 hosta
PING hosta (hosta) 1500(1528) bytes of data.

--- hosta ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1032ms

tcpdump no hosta fica assim:

12:01:07.421196 IP hostb > hosta: icmp
12:01:08.443698 IP hostb > hosta: icmp

programas de hospedagem

net.ipv4.ip_forward_use_pmtu = 0
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.route.min_pmtu = 552
net.ipv4.route.mtu_expires = 600
net.ipv4.tcp_mtu_probe_floor = 48
net.ipv4.tcp_mtu_probing = 0
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_errors_use_inbound_ifaddr = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_msgs_burst = 50
net.ipv4.icmp_msgs_per_sec = 1000
net.ipv4.icmp_ratelimit = 1000
net.ipv4.icmp_ratemask = 6168

Observe que substituí o endereço IP pelo nome de host correto se a saída parecer um pouco instável.

Estou cansado de tentar entender por que reduzir o MTU para qualquer número abaixo de um determinado limite faz com que o ping não obtenha nenhuma resposta. Apesar de eu não mexer com a parte da fragmentação.

Se eu usar a opção -M de fazer/quer/não para o pacote de 1.500 bytes, recebo uma resposta até que o MTU do hosta permaneça acima de 1488, mas uma vez definido como 1487 ou abaixo, todos não recebem resposta.

Continuando um pouco mais sobre isso.. Com MTU = 1487 tcpdump naquele host (= 10.50.107.129) mostra este 1 pacote IP recebido

1   2023-02-15 22:40:24.095129  10.50.107.83    10.50.107.129   IPv4    562 Fragmented IP protocol (proto=ICMP 1, off=1480, ID=1fb9)

Essa é a única linha. Diz que está fragmentado, mas mostra 562 bytes como o comprimento que é o mesmo mostrado abaixo no item 3 abaixo.

Em seguida, altero MTU=1500, onde vejo a carga fragmentada e reconhecida, mostrada abaixo.

2   2023-02-15 22:40:42.093639  10.50.107.83    10.50.107.129   IPv4    1514    Fragmented IP protocol (proto=ICMP 1, off=0, ID=2c62) [Reassembled in #3]
3   2023-02-15 22:40:42.093639  10.50.107.83    10.50.107.129   ICMP    562 Echo (ping) request  id=0x1004, seq=1/256, ttl=64 (reply in 5)
4   2023-02-15 22:40:42.093698  10.50.107.129   10.50.107.83    IPv4    1514    Fragmented IP protocol (proto=ICMP 1, off=0, ID=fe1a) [Reassembled in #5]
5   2023-02-15 22:40:42.093717  10.50.107.129   10.50.107.83    ICMP    562 Echo (ping) reply    id=0x1004, seq=1/256, ttl=64 (request in 3)

Verifiquei os dados em # 1 e comparei com os dados em # 4, eles não têm +/- 3 bytes (o ping coloca hex 00 em ff como carga útil). Portanto, ou o remetente não enviou o primeiro fragmento ou o destinatário não leu o primeiro fragmento ou algo mais está acontecendo.

Ambos os servidores são construídos de forma idêntica aos VMs rodando Ubuntu. Então eliminou um lado por.

Se eu executar um ping do meu laptop por meio de vpn/firewall/etc/etc, posso executar ping no host com MTU=1487.

Perplexo e agradeceria se alguém tivesse alguma sugestão.

informação relacionada