
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.