
Con MTU predeterminada como se muestra a continuación:
hosta$ ifconfig eth0 | grep mtu
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
Puedo hacer ping desde un servidor diferente usando una 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
--- estadísticas de ping de 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 en hosta está todo bien
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
Puedo reducir la MTU en hosta hasta 1488 y el ping de carga útil de 1500 funciona.
El número mágico es MTU=1487
hosta $ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1487
<snip>
Cuando envío el ping de 1500 bytes (sin alterar el indicador de fragmentación) no hay respuesta
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 en hosta se ve así:
12:01:07.421196 IP hostb > hosta: icmp
12:01:08.443698 IP hostb > hosta: icmp
hosta muestra
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
Tenga en cuenta que reemplacé la dirección IP con el nombre de host correcto si el resultado parece un poco inestable.
Estoy agotado al tratar de entender por qué reducir la MTU a cualquier número por debajo de cierto umbral da como resultado que el ping no obtenga ninguna respuesta. A pesar de que no me meto con la parte de fragmentación.
Si uso la opción -M de hacer/quiero/no hacer para el paquete de 1500 bytes, obtengo una respuesta hasta que la MTU del host se mantiene por encima de 1488, pero una vez que se establece en 1487 o menos, hacer/quiero/no recibir ninguna respuesta.
Siguiendo un poco más sobre esto... Con MTU=1487 tcpdump en ese host (=10.50.107.129) muestra este paquete IP entrante
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)
Esa es la única línea. Dice que está fragmentado pero muestra 562 bytes como longitud, que es la misma longitud que la que se muestra a continuación en el n.° 3 a continuación.
Luego cambio MTU=1500 donde veo la carga útil fragmentada y reconocida, que se muestra a continuación.
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)
Revisé los datos en el n.° 1 y los comparé con los datos en el n.° 4, no son +/- 3 bytes (ping introduce hexadecimal 00 a ff como carga útil). Entonces, o el remitente no envió el primer fragmento o el receptor no leyó el primer fragmento o está sucediendo algo más.
Ambos servidores están construidos de manera idéntica a las máquinas virtuales que ejecutan Ubuntu. Así que eliminó uno de los lados.
Si ejecuto un ping desde mi computadora portátil a través de vpn/firewall/etc/etc, puedo hacer ping al host con MTU=1487.
Perplejo y agradecería si alguien tuviera alguna sugerencia.