
Das ist mein Setup:
+--------------------+ +----------------------+ +--------------------+ | Router B a +-----+ Router+Firewall C | | b Router D | | 10.10.10.1 ----------------------------------10.10.10.2 | | +-----+ | | +--- mehr Netze | 192.168.10.1 | |192.168.2.11 +--+192.168.2.57 | +----|---------------+ +-------------------+ +--------------------+ | | +----|---------------+ +----|---------------+ |192.168.10.11 | |192.168.2.38 | |Server A | |Client E | | | | | | | | | +--------------------+ +--------------------+
- Die Router B und C haben öffentliche IPs im Internet und einen IpSec-Tunnel (Racoon) für 192.168.10.1-192.168.2.57.
- Auf allen Maschinen läuft Ubuntu Linux.
- Es gibt einen eingebetteten GRE-Tunnel zwischen 192.168.10.1-192.168.2.57 mit den Tunnel-IPs 10.10.10.1 und 10.10.10.2.
- Der Tunnel wird benötigt, um Daten vom Netz 192.168.10.0/24 zu anderen Netzen hinter Router D (z. B. 192.168.3.0/24) routen zu können.
- Jede IP kann jede andere IP anpingen.
- Wenn Client E eine Webseite auf Server A öffnet, kommen TCP/IP-Handshake und das „GET /“ bei Server A an, aber die (große) Antwort von Server A kommt nicht bei Client E an, sondern geht „im“ GRE-Tunnel verloren.
- Ich dachte, wir verlieren große Pakete aufgrund der Fragmentierung und reduzierte die MTU an den Schnittstellen A und B, letztendlich auf 1000 Byte, aber das half nicht.
- tcpdump auf Schnittstelle a zeigt den korrekten HTTP-Verkehr
- tcpdump auf Schnittstelle b zeigt den Handshake und den HTTP-Verkehr von E->A, zeigt aber nicht die großen Antwortpakete von A->E.
- tcpdump auf Router+Firewall C zeigt, dass die GRE-Pakete aus dem IpSec-Tunnel herausfallen, es kommen aber keine großen Pakete an
- HTTP-Anfrage von B->E funktioniert einwandfrei.
- Große Pakete zwischen D<->B nicht über den GRE sondern direkt im IpSec-Tunnel (also ssh 192.168.10.1 auf der 192.168.2.57 Schnittstelle) funktionieren
- Große Pakete zwischen B und „weiteren Netzen“ funktionieren (über GRE-Tunnel!).
- Das Vertauschen der Rollen von A und E hilft nicht. (E als Server, A als Client oder große Pakete in die andere Richtung funktionieren nicht.)
Jetzt stecke ich fest. Irgendwelche Ratschläge, was ich überprüfen soll? Welche Konfiguration würde bei der Diagnose helfen? Vielen Dank!
Antwort1
Sie haben MSS vergessen
1) Sie müssen die MTU für den Gre-Tunnel auf 1400 einstellen
2) Für SYN-Pakete setzen Sie mss auf die gleiche Größe mtu 1400
unter Linux:
iptables -I VORWÄRTS -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400
Antwort2
Die Standardtabelle istFilter, wenn Sie also eine Regel angeben, wie iptables -A FORWARD ...
Sie sie einfach inFilterTisch. Es gibt auch mehrere andere Tische und TischMangelist eine davon. Laut man iptables: „Diese Tabelle wird für spezielle Paketänderungen verwendet.“
Für die Bearbeitung eines Pakets (die von durchgeführt wird) sollte man also -j TCPMSS --set-mss
einMangelTabelle, deshalb sollte die Regel wie folgt lauten:
iptables -t mangle -A FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400