
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.