Connectivity Endgegner MTU

Wenn eine Verbindung nicht funktioniert, ist es meistens relativ leicht herauszufinden, woran das liegt. Aber wenn sie nur halb funktioniert, wird es schwierig. Und wenn das passiert, kann man darauf wetten, dass es ein MTU-Problem ist. Und wenn jetzt auch noch der Pfad durch das Netz von anderen bereitgestellt wird, dann kann ich nicht wissen, sondern nur ausprobieren, was die unterstützte MTU ist.

Man kann das mit ping erreichen: Man verbietet Fragmentierung (-M do) und dann probiert man verschiedene Packetgrößen (-s 9100) durch. Das geht so:

$ ping 192.168.200.1 -s 9100 -M do
PING 192.168.200.1 (192.168.200.1) from 192.168.201.1: 9600(9628) bytes of data.
ping: local error: message too long, mtu=1500

Der Fehler mit der genauen MTU wird nur dann angezeigt, wenn die MTU beim nächsten Hop zu klein ist, aber wenn es irgendwo auf dem Pfad ein MTU-Nadelöhr gibt, verschwinden die Pakete einfach spurlos. Und ist sie irgendwo im Pfad noch kleiner, dann bekommt man das auch nicht mit.

Ich musste viele Pfade testen und wollte das automatisieren mit bash. So wie ich es sonst immer mache. Aber dann dachte ich: Das muss doch schon mal jemand gelöst haben. Und was ich gefunden habe, ist eine Python Library. Also dachte ich mir: Warum nicht mal Python? Und habe ein Script geschrieben, das eine IP als Argument nimmt.

Als erstes braucht man die library und die installiert sich am einfachsten mit pip:
pip install ofunctions.network
Der folgende Code wird gespeichert in einer Datei: pathmtu.py

import argparse
from ofunctions.network import probe_mtu

def main():
    parser = argparse.ArgumentParser(description='MTU Discovery Tool')
    parser.add_argument('-i', '--ip', required=True, help='Destination IP address')

    args = parser.parse_args()
    destination_ip = args.ip

    try:
        mtu = probe_mtu(destination_ip, max=9300)
        print(f"Discovered MTU: {mtu}")
    except ValueError as e:
        print(f"IP unreachable: {destination_ip}")

if __name__ == "__main__":
    main()

Der Wert max=9300 setzt die höchste MTU, die getestet werden soll. Wenn man das nicht setzt, wird 9000 angenommen. Wenn man weiss, dass man bspw. niemals mehr als 1500 erreichen kann, dann ist es sinnvoll, diesen Wert zu senken. Das Script läuft dann merklich schneller, zeigt aber nie mehr als diesen Wert an.
Wenn man diesen Code jetzt mit python ausführt, bekommt man die MTU ausgegeben:

$ python3 pathmtu.py -i 1.1.1.1
Discovered MTU: 1500

Connectivity Endgegner MTU

Hinterlasse einen Kommentar