Was ist das Magische an MTU und Paketverlusten?

Was ist das Magische an MTU und Paketverlusten?

Mit Standard-MTU wie unten gezeigt:

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

Ich kann von einem anderen Server aus mit einer Nutzlast von 1500 pingen

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

--- Hosta-Ping-Statistiken ---

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 auf hosta ist alles gut

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

Ich kann die MTU auf Hosta auf bis zu 1488 senken und der 1500-Payload-Ping funktioniert.

Die magische Zahl ist MTU=1487

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

Wenn ich den 1500-Byte-Ping sende (ohne mit dem Fragmentierungsflag herumzuspielen), gibt es keine Antwort

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 auf Hosta sieht folgendermaßen aus:

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

Hosta zeigt

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

Beachten Sie, dass ich die IP-Adresse durch den richtigen Hostnamen ersetzt habe, falls die Ausgabe etwas schief aussieht.

Ich bin am Ende, weil ich nicht verstehe, warum das Senken der MTU auf einen Wert unter einem bestimmten Schwellenwert dazu führt, dass Ping keine Antworten erhält. Obwohl ich das Fragmentierungsbit nicht verändert habe.

Wenn ich die Option -M von do/want/dont für das 1500-Byte-Paket verwende, erhalte ich eine Antwort, bis die Hosta-MTU über 1488 bleibt. Sobald sie jedoch auf 1487 oder darunter eingestellt ist, erhalten do/want/dont keine Antwort.

Um das noch etwas genauer zu erläutern: Mit MTU=1487 zeigt tcpdump auf diesem Host (=10.50.107.129) dieses eingehende 1 IP-Paket an

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)

Das ist die einzige Zeile. Sie besagt, dass es fragmentiert ist, zeigt aber 562 Bytes als Länge an, was der Länge entspricht, die unten in Nr. 3 angezeigt wird.

Als nächstes ändere ich MTU=1500, wo ich die fragmentierte und bestätigte Nutzlast sehe, die unten angezeigt wird.

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)

Ich habe die Daten in #1 überprüft und mit den Daten in #4 verglichen, sie sind nicht +/- 3 Bytes (Ping füllt Hex 00 bis ff als Nutzlast). Also hat entweder der Absender das erste Fragment nicht gesendet oder der Empfänger hat das erste Fragment nicht gelesen oder es ist etwas anderes im Gange.

Beide Server sind als VMs mit Ubuntu identisch aufgebaut. Eine Seite wird also eliminiert.

Wenn ich von meinem Laptop aus einen Ping über VPN/Firewall/usw. ausführe, kann ich den Host mit MTU=1487 anpingen.

Ich bin ratlos und würde mich freuen, wenn jemand Vorschläge hätte.

verwandte Informationen