¿Qué tiene de mágico la MTU y la entrega de paquetes?

¿Qué tiene de mágico la MTU y la entrega de paquetes?

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.

información relacionada