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.