http & firewall

Lutz Donnerhacke lutz at iks-jena.de
Die Aug 13 16:34:48 CEST 2002


[This message has also been posted.]
* Thomas Schmidt wrote:
>Es könnte sein, das das ein MTU-Problem ist!

Deswegen fragte ich nach ICMP Sperren.

>Wenn du über (T-)DSL ins Internet gehst, dann tritt das bei bestimmten
>Webseiten auf. (den genauen technischen Hintergrund kenne ich
>allerdings auch nicht)

Der Hintergrund ist einfach: Path MTU Discovery.

Wenn man ein IP Paket auf die Reise schickt, dann kann es passieren, daß
unterwegs die Leitungs-MTU kleiner wird und das Paket nicht mehr druchpaßt.
Normalerweise zerlegt der Router dem das passiert, das IP Paket in Fragmente
und schickt die durch. Einfach, trival, funktioniert.

Manchmal will man das nicht, so daß man ein 'Dont Fragment' Bit im IP Header
setzen kann, wenn das Paket nicht zerlegt werden darf. In dem Fall schickt
der Router, dem das trotzdem passiert ein ICMP 'Destination unreachable:
Fragmentation needed, but DF set.' an den Absender zurück. Der weiß nun, daß
es nicht geklappt hat.

Nun ist vor einigen Jahren jemand Hyperschlaues sich gedacht, daß es prima
wäre, wenn man den Routern die Arbeit erleichtert. Er hat nun alle Pakete
mit gesetztem DF Bit gesendet. Kam von einem Router eine ICMP Fehlermeldung
zurück, dann hat er die in der Fehlermeldung mit angegebene maximale Größe
der Strecke genommen und nur für diese Verbindung kleinere Pakete gesendet.
Das Ganze nennt man PMTUD (s.o.).

Darüberhinaus gibt es Buffergrenzen, die ein IP-Stack abkann, wenn er
TCP-Segmente verarbeitet. Um der Gegenseite mitzuteilen, welche maximalen
Segmentgrößen er verträgt, setzt er beim Verbinungsaufbau (SYNC) die Option
TCPMSS (TCP Maximum Segment Size).

Der nächste Hyperschlaue beobachtete, daß die "dünneren" Leitungen, die also
kleinere MTUs haben, meist beim Endpunkt einer Verbindung stehen und dachte
sich, man könne die Buffergrenzen des TCP Stacks als Obergrenze der MTU
ebenfalls interpretieren. Der Gedanke allein ist derartig schwachsinnig, daß
es schmerzt: Hier wurde Kausalität und Korrelation verwechselt, aber das ist
offenbar in der IT-Branche Voraussetzung für Erfolg. Man setzt nämlich die
Puffergrenzen so, daß sie in der lokalen Umgebung sinnvoll sind, und das ist
zufällig die LeitungsMTU am nächsten Interface, weil ja einkommende Pakete
eh' nicht größer sein können. Das sagt natürlich gar nichts über die MTU der
Leitungen zwischen den Endgeräten aus, besonders, da die allerletzte Strecke
meist ein "dickes" Ethernetinterface ist.

Kurz gesagt hat sich der Letztgenannte also eine Modifikation des TCP/IP
Stacks dahingehend einfallen lassen, daß der den TCPMSS Parameter als
Startwert für PMTUD nimmt.

Neu in dem Szenario sind jetzt die strunzdämlichen Firewall-Admins, die ICMP
als Angriff werten und abschalten. Danach geht nichts mehr, wenn einer von
beiden PMTUD probiert, die Pakete grundsätzlich nicht druchkommen können,
weil die Fehlermeldungen weggeworfen werden. So und anstatt nun einfach
PMTUD abzuschalten, so daß es gar keine Fehlermeldungen mehr gibt, setzt man
die MTU auf dem Interface so geschickt niedrig, daß die ausgenden Pakete
grundsätzlich klein genug sind, um überall durchzukommen. Außerdem
signalisiert man mit TCPMSS der Gegenstelle, doch bitte kleine Pakete zu
senden. Das ist zwar ineffizient, aber es gibt keine Fehlermeldungen mehr,
die von dem strunzdämlichen Firewall-Admins des Serverproviders weggeworfen
werden könnten.

Anstatt den Wunsch der betreffenden Firma zu respektieren und die Webseiten
links liegen zu lassen, setzen die Leute ihre MTU auf den Interfaces herab,
produzieren so kleinere Buffer im TCP-Stack, der von anderen Systemen bequem
überschrieben werden kann, so daß man sich selbst eine Sicherheitslücke baut
und von der Kommunikation mit anderen Systemen ausschließt. Es sei denn, man
sagt die kleinere MTU /allen/ Geräten im lokalen Netz, auch dem Server.

Aber so blöd ist sicher niemand, oder?

>Abhilfe kannst du auf 2 Arten schafffen:

0. PMTUD am Client abschalten. Funktioniert in über 90% aller Fälle. Ist
   PMTUD am Ziel an und wird dort gefiltert, sollte man den Wunsch der
   betreffenden Firma zu respektieren und die Kommuniktion einstellen.

>1. MTU auf allen Clients, die den Router nutzen auf einen Wert von
>   1490 einstellen (default ist meist 1500)
>   (unter Linux z.B. mit dem Befehl: ifconfig eth0 mtu 1490)

Linux verwirft dann alle Pakete, die größer sind, z.B. die von anderen
lokalen Rechnern. Viel Spaß beim Debugging.

>2. (die meines Erachtens einfachere Lösung)
>   Auf dem Router in dein Firewallscript folgenden Befehl einbauen:
>   iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Und das ist der Hack, bei dem ich sofort Fefes fatalistische Art
nachvollziehen kann: Man sagt der Firewall, sie soll TCPMSS auf den Wert
umstellen, den die nächste Leitung hat, anstatt ihr zu sagen, daß sie ICMP
Fehlermeldungen durchlassen soll.

Durchlassen ist aber auch so ein schönes Wort. Natürlich reicht es nicht, in
der Forward Regel ein ACCEPT zu geben, wenn man gleichzeitig Adressumsetzung
macht. Die Firewall sollte dann wenigstens so schlau sein, und eingehende
ICMP Meldungen ebenfalls umzusetzen. Ansonsten taugt sie nichts und sollte
wenigstens durch einen Proxy ergänzt werden, damit überhaupt Kommuniktion
möglich wird.

-- 
tlug Mailingliste
Archiv: http://www.tlug.de/archiv/
http://schwarz.thueday.de/mailman/listinfo/tlug_allgemein