Forums Neueste Beiträge
 

Paket-Fragmentierung bei GRE-Tunnel

29/08/2010 - 20:07 von Joern Bredereck | Report spam
Hallo,

ich habe hier einen kleinen Linksys-Router mit einer offenen
Linux-Firmware (2.4er-Kernel). Dieser Router hàngt an einer
25Mbit/S-KabelBW-Leitung und macht primàr NAT für mein kleines Home-LAN.
Zusàtzlich habe ich einen GRE-Tunnel eingerichtet, der auf einem Server
in den USA terminiert und einige meiner LAN-Hosts per "ip rules"-Regel
auf diesen Server routet. Dort gehen die Pakete dann geNATed auf die
US-IP ins Internet. Das ist für einige Dienste, die auf eine
US-IP-Adresse bestehen ganz nett und funktioniert grundàtzlich auch ganz
gut. Allerdings scheint es bei einigen Diensten/Hosts zu Problemen mit
IP-Fragmentierung zu kommen.

Das ist eigentlich auch kein Wunder, denn durch das GRE-Tunneling werden
die getunnelten Pakete ein bißchen grösser, bzw. der mögliche Payload in
einem Paket mit 1500er-MTU wird kleiner. So habe ich das jedenfalls
bisher verstanden. Bitte korrigiert mich, wenn ich mich hier irre.

Daher eine Frage an die Netfilter-Gurus in dieser Newsgroup: mit welchem
"Netfilter-Vodoo" kann man dieses Problem evtl. lösen? Momentan behelfe
ich mir damit, die MTU der betreffenden Hosts ein wenig nach unten zu
drehen. Bei einigen Hosts (wie z.B. dem IPad) ist das allerdings
unmöglich, daher suche ich nach einer Lösung auf dem Router, sodaß ich
die MTU meiner Hosts nicht anfassen muss.

Noch eine Anmerkung: Das Problem habe ich wirklich nur bei GRE. Bei
OpenVPN kann ich einfach ein "mssfix" in die Config schreiben und schon
klappts. Leider ist mein kleiner Linksys-Router für OpenVPN allerdings
zu "schwachbrüstig", daher bin ich auf GRE angewiesen.

Danke im Voraus für Eure Tipps!

Gruß,

Jörn
 

Lesen sie die antworten

#1 Juergen P. Meier
30/08/2010 - 06:37 | Warnen spam
Joern Bredereck :
ich habe hier einen kleinen Linksys-Router mit einer offenen
Linux-Firmware (2.4er-Kernel). Dieser Router hàngt an einer
25Mbit/S-KabelBW-Leitung und macht primàr NAT für mein kleines Home-LAN.
Zusàtzlich habe ich einen GRE-Tunnel eingerichtet, der auf einem Server
in den USA terminiert und einige meiner LAN-Hosts per "ip rules"-Regel
auf diesen Server routet. Dort gehen die Pakete dann geNATed auf die
US-IP ins Internet. Das ist für einige Dienste, die auf eine
US-IP-Adresse bestehen ganz nett und funktioniert grundàtzlich auch ganz
gut. Allerdings scheint es bei einigen Diensten/Hosts zu Problemen mit
IP-Fragmentierung zu kommen.



Bei Linux ist das Tunneling derart kaputt, dass PMTUD nicht ordentlich
funktioniert. Genauer: Lokal auf dem Tunnelnden Linux-Rechner laufende
Programme koennen kein PMTUD. Broken-By-Design.

Das ist eigentlich auch kein Wunder, denn durch das GRE-Tunneling werden
die getunnelten Pakete ein bißchen grösser, bzw. der mögliche Payload in
einem Paket mit 1500er-MTU wird kleiner. So habe ich das jedenfalls
bisher verstanden. Bitte korrigiert mich, wenn ich mich hier irre.



Bei ordentlichen Tunnel-Setups sorgt PMTUD dafuer, dass die korrekte
MTU rausgefunden werden kann. Auch bei Linux als Tunnelende
funktioniert das solange dieses nur als Router dazwischen ist.
(dann versendet der Linux-Kern die ICMP Unreachable Pakete mit den
korrekten Inhalten, wenn du lokal vor dem GRE-einpacken nattest
erzeugt Linux ein ICMP Unreachable-paket fuer den genatteten sender,
kann das allerdings an dieser Stelle (nicht in der richtigen Stelle
im Code-Pfad von Netfilter weil Lokal) nicht mehr der urspruenglichen
Connection zuordnen und verstagt somit beim Erzeugen eines korrekten
ICMP Paketes, womit der Sender nie lernt wie klein die MTU des
GRE-Tunnels ist).

In der Kombination mit NAT und Tunneling auf dem Linux-PC funktioniert
PMTUD nicht mehr. D.h. du musst Hand anlegen und deine MTU manuell
auf einen kleinen Wert forcieren. Das musst du am Ende (deinem Client)
machen.

Daher eine Frage an die Netfilter-Gurus in dieser Newsgroup: mit welchem
"Netfilter-Vodoo" kann man dieses Problem evtl. lösen? Momentan behelfe



Linux/Netfilter durch etwas ersetzen, dass nicht aufgrund duemmlicher
Designentscheidungen PMTUD kaputt macht und ordentlich tunneln und
natten kann.
Oder die MTU an allen clients pauschal kuenstlich verringern.
Fuer TCP reicht aber auch MSS-verstellen.

ich mir damit, die MTU der betreffenden Hosts ein wenig nach unten zu
drehen. Bei einigen Hosts (wie z.B. dem IPad) ist das allerdings
unmöglich, daher suche ich nach einer Lösung auf dem Router, sodaß ich
die MTU meiner Hosts nicht anfassen muss.



Du muesstest "nur" dafuer sorgen, dass dein iPad die passenden
"ICMP unreachable/fragmentation needed" Pakete bekommt.

Noch eine Anmerkung: Das Problem habe ich wirklich nur bei GRE. Bei
OpenVPN kann ich einfach ein "mssfix" in die Config schreiben und schon



OpenVPN trickst hier und pfuscht in den TCP Optionen herum (MSS-clamping)
so dass zumindest TCP ohne PMTUD funktioniert. UDP ist bei OpenVPN
hingegen genauso vom PMTUD-Problem betroffen wie bei GRE.

Mit Netfilter alleine kannst du zumindest fuer TCP auch an der
MSS-Schraube drehen, das iptables-Feature dazu heist "TCPMSS" Target.
Damit kannst du fuer alles TCP was durch den GRE-tunnel muss zusaetzlich
noch die MSS manipulieren, so das TCP zumindest ohne PMTUD auskommt.
U.U. reicht das ja schon.

klappts. Leider ist mein kleiner Linksys-Router für OpenVPN allerdings
zu "schwachbrüstig", daher bin ich auf GRE angewiesen.
Danke im Voraus für Eure Tipps!



Wenn du mit OpenVPN und dem dort eingebauten MSS-Clamping keine
Probleme hast, dann muesste es reichen vor dem "in den tunnel stecken"
noch ein iptables -t mangle -p tcp -j TCPMSS --set-mss 1400

(Die MSS sollte kleiner MTU-40 sein, 20 Byte fuer einen Optionslosen
IP header, 20 Byte fuer einen Optionslosen TCP Header. Wenn es auch
mit Optionen in den Headern funktoineren soll, solltest du
sicherheitshalber mehr abziehen.)

Juergen
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen