Windows 7: MTU für Netzwerkadapter einstellen

Immer wieder stoße ich bei der Einrichtung von Site-to-Site VPN mit IPSec auf ein Problem, zu dem es zwar einige Lösungsansätze gibt, welches aber letztendlich nur durch das Herabsetzen der MTU Größe am lokalen Computer befriedigend gelöst werden kann.

Grundsätzliches Problem hierbei sind Pakete, die zwar durchwegs über Ethernet mit seiner MTU von 1500 Byte transportiert werden, dabei jedoch eine IPSec-Verbindung durchlaufen. Da zur Verwaltung der IPSec-Verbindung dem Datenpaket zusätzliche Daten vorangestellt werden müssen vergrößert sich das Datenpaket insgesamt. Überschreitet es dabei die MTU Größe muss es in Teile zerlegt – fragmentiert – werden. Und hier fangen dann die Probleme an. Oft verbieten Einstellungen an Routern und Firewall aus Sicherheitsgründen die Verarbeitung fragmentierter Pakete. Diese Pakete werden sang und klanglos fallengelassen – eine fatale Situation für die Verbindung, da der Sender nichts von dem Verlust erfährt und der Empfänger auf die Fragmente wartet um das komplette Paket zu erhalten.

Dieses Situation stellt sich für den Anwender dann so dar, dass Verbindungsabbrüche auftreten oder Verbindungen ausehen, als wen sie „hängen“ würden. Gleichzeitig zeigt die Verbindung kaum Auslastung wenn man die verwendete Bandreite betrachtet.

Zwar gibt es mit PathMTU ein Verfahren um den Partnern die Möglichkeit zu geben herauszufinden welche maximale MTU eine Verbindung verwenden darf, jedoch basiert dieses Verfahren auf ICMP Pakete und diese werden oft an Firewalls pauschal nicht durchgelassen.

Auch existiert ein spezielles ICMP-Paket vom Typ 3, Code 4 (Fragmentierung benötigt aber DF Bit gesetzt), dieses Statuspaket bezieht sich aber nur auf solche Pakete, bei denen der Absender im IP-Kopf die Kennung „Don’t fragment“, also „Dieses Paket darf nicht fragmentieren werden“ gesetzt hat. Und hierfür trifft ebenfalls das oben beschriebene Problem der an Firewalls geblockten ICMP-Pakete zu.

Was bleibt also übrig?

Der sicherste Weg geht über die Festlegung einer kleineren MTU direkt an den Partnern der Verbindung.

Unter Windows 7 kann man dies mit Hilfe des Kommandozeilenbefehls NETSH.EXE erreicht werden.

Dazu wird eine Eingabeaufforderung als Administrator gestartet. Im [Start]-Menü wird im Textfeld CMD.EXE eingeben und dann dies mit STRG+UMSCH und Eingabetaste gestartet.

Danach wird zuerst ermittelt welche Netzwerkadapater vorhanden sind und welchen Index sie besitzen.

netsh.exe interface ipv4 show interfaces

Man erhält eine Liste der im System vorhandenen Netzwerkadapter

  Idx     Met         MTU          State                Name
  ---  ----------  ----------  ------------  ---------------------------
    1          50        1400  connected     Loopback Pseudo-Interface 1
   11           5        1400  disconnected  Wireless Network Connection
   12          20        1500  connected     Local Area Connection

Dann setzt man die benötigte MTU Größe für das Netzwerkadapter auf dem die Verbindung abgewickelt wird:

netsh interface ipv4 set subinterface <Index> mtu=1400 store=persistent

Für das Beispiel oben wollen wir die MTU der „Local Area Connection“ setzen. Dazu geben wir ein:

netsh interface ipv4 set subinterface 12  mtu=1400 store=persistent

Die Option store=persistent sorgt dafür, dass die Einstellung auch noch nach einem Neustart erhalten bleibt.

Die Änderung wirkt sich sofort aus.

Warum werden hier 1400 Byte verwendet?

Natürlich wäre man in der Lage die Größe des benötigten IPSec-Kopfes genau zu bestimmen und damit auch die benötigte Reduzierung der Nutzlast bytegenau festzulegen. Da es aber möglich ist, dass durch optional angehängte IP-Optionen sich der Kopf insgesamt vergrößert und damit weniger Nutzlast zur Verfügung steht, stellt man sich lieber auf eine sichere Seite und schafft ausreichend Reserve.