IPSec-verschlüsseltes WLAN - ICMP ja, aber kein http/smb/etc.

Baseballbatboy

Cpt. Baseballbatboy
Nabend zusammen,

nachdem mein Tablet zuverlässig unter OpenBSD läuft wollte ich jetzt endlich mal mein WLAN richtig absichern, also nicht per WEP, sondern mit IPSec. Es gab dazu mal eine Beschreibung mit OpenVPN, aber ich wollte die Bordmittel verwenden, vor allem nach dem ich den berühmten Artikel "Zero to IPSec in 4 minutes" gelesen habe. An der dortigen Vorgehensweise habe ich mich auch orientiert.

Mal die Netzstruktur:

$wired
> router ---- inet​
$wlan

Das kabelgebundene Netz hat den Bereich 10.0.0.0/24, das WLAN 10.0.1.0/24

Die /etc/ipsec.conf:

Code:
# cat /etc/ipsec.conf

ike esp from 0.0.0.0/0 to 10.0.1.100
ike esp from 10.0.1.254 to 10.0.1.100

Der erste Eintrag ist der flow von überall zu meinem Tablet, der andere von meinem Router zum Tablet (ist vermutlich überflüssig).

Die ipsec.conf auf dem Tablet:

Code:
# cat /etc/ipsec.conf

ike esp from 10.0.1.100 to 0.0.0.0/0 peer 10.0.1.254
ike esp from 10.0.1.100 to 10.0.1.254

Es existiert (noch) keine isakmpd.conf oder *.policy, ist auch erstmal nicht nötig. Die flows und SADBs werden auch einwandfrei erstellt, ping auf beliebige Websites oder in mein $wired funktioniert.

Nur halt nichts "größeres". Wie zum Beispiel kein http, imap, smtp, smb. Inzwischen läuft auf dem Router ein transparenter Squid, so dass ich wenigstens Webseiten ansurfen kann. Das (also den Squid) wollte ich aber nicht (auch wenn ich inzwischen mit dem Gedanken spiele, den für das gesamte Netz zwangsweise zu verwenden - mit dem kann man doch bestimmt ne Menge filtern?), und zufriedenstellend ist der Zustand auch nicht.

An der pf.conf liegt es nicht, so wie ich das sehe. Trotzdem mal die wichtigen Passagen:

Code:
# interfaces

ext_if="tun0"
int_if="pcn0"
vpn_if = "enc0"
wlan_if = "ath0"

# hosts

tablet = "10.0.1.100"
router_wired = "10.0.0.254"
router_wlan = "10.0.1.254"

$int_nets = { "10.0.0.0/24", "10.0.1.0/24" };


# nat

nat on $ext_if from $int_nets to !$int_nets -> ($ext_if:0)

rdr on $vpn_if proto tcp from any to any port 80 -> 127.0.0.1 port 3128

# die Umleitung auf den Squid wird reingelassen

pass in quick on $vpn_if proto tcp from $wlan to 127.0.0.1/32 port 3128

# das muss laut man vpn
# und eigener Erfahrung

pass in proto esp from $tablet to any
pass out proto esp from any to $tablet

pass in on $vpn_if proto ipencap from $tablet to $router_wlan

# der restliche Verkehr
# hier könnte auch ein keep state stehen
# aber das verträgt sich nicht mit altq

pass in on $vpn_if from $puffy to any
pass out on $vpn_if from any to $puffy

# der IKE

pass in on $wlan_if proto udp from $tablet port = 500 to $router_wlan port = 500
pass out on $wlan_if proto udp from $router_wlan port = 500 to $tablet port = 500

Das sollte es gewesen sein.

Was mich darin ziemlich sicher macht, dass das Problem nicht an der pf.conf liegt:

- ein set skip enc0 bringt kein besseres Ergebnis
- ich kann Verbindungen zu Webservern und SMB-Hosts in meinen Netzen aufbauen, kann bei smb sogar die Ordnerstruktur durchsuchen, aber sobald es an etwas wichtiges geht (also an die Daten selber) oder ein SMB-Ordner auch Dateien enthält ist Hängen im Schacht.

Und jetzt fällt mir einfach nichts mehr ein. Euch vielleicht? Hab ich was überlesen? Ein grundsätzlicher Fehler?

Gruß
Baseballbatboy

P.S.: das SMB-Problem könnte auch mit der Konfiguration desselben zusammenhängen, die hab ich noch nicht angepasst.
 
Zuletzt bearbeitet:
Ich wette du hast ein Problem mit der MTU, moeglicherweise gerade durch den Einsatz von IPSEC.
 
Das war auch einer meiner Gedanken, aber die MTU von enc kann ich nicht ändern und die .....

Nein, das wars auch nicht. Ich dachte gerade, wenn ich die MTU für die physikalischen Interfaces erhöhe dann könnte es was werden. Das wars aber nicht.

Auch das Auskommentieren von "scrub in" in der pf.conf brachte nicht den Erfolg (von wegen "don't fragment" und so Scherze).

Gruß
Baseballbatboy
 
Zuletzt bearbeitet:
Schraube mal an der payload fuer ping, so kannst du genau rausfinden, bei welcher Paketgroesse es hakt ...
 
Habs gefunden, es stand auch in den HowTo on openbsd.de, allerdings nicht explizit erwähnt:

scrub in no-df

Diese Option entfernt das DF-Bit aus dem IP-Header.

Mit ein bisschen herumspielen (scrub in on $vpn_if bzw. $ext_if) habe ich herausgefunden, dass diese Option für die Pakete, die zu meinem Tablet gehen, zutreffen muss. Kann mir das einer anschaulich erklären?

@MrFixit:

ping geht bis zu einer Paketgröße von 1210 Byte, inkl. ICMP-Header (8 Byte)

Gruß
Baseballbatboy
 
Zurück
Oben