ein paar Probleme mit PF

dark_angel

Well-Known Member
Hallo allezusammen,

habe mir durch den Kauf eines Laptops ein WLAN angeschafft.
Dieses WLAN soll auch für kommende Freunde schnell zugänglich sein (also keinen Schlüsselaustausch für die Verschlüsselung usw.). Dazu habe ich den Accesspoint an meinen Homeserver angeschlossen und auf dem Accesspoint die Verschlüsselung abgeschaltet. Nur die SSID ist noch versteckt.
Mein Vorhaben läuft nun so:
1.) Laptop geht in mein WLAN rein und bekommt vom Accesspoint per DHCP eine IP zugewiesen.
2.) Laptop verbindet sich zu einem PPP Dienst auf meinem Server und bekommt zugang zu meinem LAN. Diese Verbindung ist wiederum verschlüsselt.

Das Verfahren läuft auch soweit sehr gut, jedoch stellt mein Server auch noch ein VPN zur Verfügung und auf dessem virtuellen NIC soll der Laptop nicht zugreifen können (da laufen ein paar Dienste drüber, die nur übers VPN zugänglich sein sollen).
Ich habe mir schon PF zu gemüte geführt, nur ich bin nicht fähig PF zu sagen, dass ich Verbindungen zum und vom VPN Device (tap0) nur vom VPN Netz (10.8.0.0/24) zulassen will.
Sowas wie
Code:
pass in  on $vpn_if from 10.8.0.0/24 to 10.8.0.0/24
pass out on $vpn_if from 10.8.0.0/24 to 10.8.0.0/24
will nicht laufen. Mit der Regel kann ich trotzdem tap0 anpingen, wenn ich mich über PPP eingewählt habe.

Hier nochmal meine pf.conf, so wie sie aktuell ausschaut:
Code:
$ cat /etc/pf.conf
#devices
ext_if="ed0" <-- NIC, dass an dem AP angeschlossen ist
int_if="fxp0" <-- NIC, dass am LAN angeschlossen ist
vpn_if="tap0" <-- VPN NIC (virtuell)
lo_if="lo0" <-- das kennt jeder ^^
ppp0_if="ng0" <-- virtuelles PPP NIC
ppp1_if="ng1" <-- virtuelles PPP NIC

#block everything on ext_if
block in  on $ext_if all
block out on $ext_if all

#pass internal devices
pass quick on $lo_if  all
pass quick on $int_if all
pass quick on $vpn_if all

#allow PPP connections
pass in  on $ext_if proto { tcp, udp } from any to $ext_if port 1723 keep state
pass out on $ext_if proto gre all keep state

und zur Vollständigkeit meine rc.conf
Code:
$ cat /etc/rc.conf
#Network settings
defaultrouter="192.168.0.1"
hostname="server"
ifconfig_fxp0="inet 192.168.0.3 netmask 255.255.255.0"
sshd_enable="YES"

#PPP settings
ifconfig_ed0="inet 192.168.2.2 netmask 255.255.255.0"
gateway_enable="YES"
pf_enable="YES"
pf_rules="/etc/pf.conf"
mpd_enable="YES"
named_enable="YES"

[...]
 
... PF zu sagen, dass ich Verbindungen zum und vom VPN Device (tap0) nur vom VPN Netz (10.8.0.0/24) zulassen will.

Versuch mal Folgendes:
Code:
vpn_net = "10.8.0.0/24"
..................
block return quick on $vpn_if from !$vpn_net
 
Verstehe ich das richtig du hast ein offenes WLAN über das man ins Internet kann? Das ist ziemlich fahrlässig und das Verstecken der SSID hält garantiert keinen Wardriver auf.
 
Ich hab ein offenes WLAN ohne dass man ins Internet kann.
Man muss sich erst per PPP anmelden, erst dann kommt man ins Internet. Für einen Wardriver also eher uninteressant.

@morromett:
Ne geht leider auch nicht.

So langsam glaub ich, dass man PF sagen muss, dass der Traffic von den virtuellen PPP NICs zum LAN NIC gehen soll.
 
Hi,

habe mich mal wieder mit meinem PF Problem etwas auseinander gesetzt und die pf.conf umgeschrieben.
Bin nun jetzt so weit, dass der PPP Client nicht mehr aufs tap device zugreifen kann. Nur hab ich jetzt das Problem, dass ich vom Client keine andere Website als google.de erreichen kann (ist die Startseite). Ich kann über google.de auch im Netz suchen, also der Browser kann sich auch Daten ausm Netz holen und nimmt die Seite nicht ausm Cache. Finde das Verhalten mehr als nur komisch. :eek:

Habe mal eine Skizze hochgeladen, die mein Vorhaben veranschaulichen soll. Der Kasten ist der Server, drin sind die Netzwerkkarten eingezeichnet und außen dann die Sachen, die an der jeweiligen Karte angeschlossen sind und die Linien stellen die Verbindungen dar, die möglich sein sollen. Hoffe die Skizze ist verständlich.


Nun zur neuen pf.conf:
Bin jetzt den Weg gegangen alles zu verbieten und nur Sachen zu erlauben, die ich auch haben will.
So wird auf dem tap device nur VPN Verkehr zugelassen,
auf dem LAN NIC nur der lokale Netzwerkverkehr und
auf dem WLAN NIC nur die Verbindung zum PPP Dienst.
Dann werden noch ein paar Ports geöffnet, die den Zugriff auf ein paar Dienste aus dem Internet her erlauben.
Dann soll für ng0 und ng1 nur DNS (named laucht auf der LAN IP des Servers) und HTTP zugelassen werden. DNS klappt auch prima (ein nslookup bsdforen.de liefert die IP), nur HTTP klappt leider nicht so ganz (siehe oben).

Hoffe hier findet jemand meinen Denkfehler. Hocke schon seit halb 11 dran und finde keine funktionierende Lösung. :(

Falls jemand ne andere Idee hat: ich bin für alles offen.

Code:
cat /etc/pf.conf
#devices
WLAN="ed0"
LAN ="fxp0"
VPN ="tap0"
LO  ="lo0"
PPP0="ng0"
PPP1="ng1"

#networks
PPP_NW ="192.168.1.0/24"
WLAN_NW="192.168.2.0/24"
LAN_NW ="192.168.0.0/24"
VPN_NW ="10.8.0.0/24"

#block everything
block in  all
block out all

#pass local, VPN and LAN
pass quick on $LO  from localhost to localhost
pass quick on $LAN from $LAN_NW   to $LAN_NW
pass quick on $VPN from $VPN_NW   to $VPN_NW

#allow FTP and HTTP on local machine
pass out on $LAN proto tcp from $LAN to any port { ftp, http } keep state

#allow web services:
#HTTP
pass in on $LAN proto tcp from any to $LAN port http keep state
#TOR
pass in on $LAN proto tcp from any to any  port 9100 keep state
#IRC
pass in on $LAN proto tcp from any to $LAN port 6667 keep state
#VPN
pass in on $LAN proto udp from any to $LAN port 1344 keep state

#allow PPP connections
pass in  on $WLAN proto { tcp, udp } from $WLAN_NW to $WLAN    port 1723 keep state
pass out on $WLAN proto gre          from $WLAN    to $WLAN_NW           keep state

#_alow PPP clients:
#DNS
pass in on $PPP0 proto udp from $PPP_NW to $LAN port domain keep state
pass in on $PPP1 proto udp from $PPP_NW to $LAN port domain keep state
#FTP & HTTP
pass in  on $PPP0 proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state
pass out on $LAN  proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state

pass in  on $PPP1 proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state
pass out on $LAN  proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state
 

Anhänge

  • IMG_2025.JPG
    IMG_2025.JPG
    383,1 KB · Aufrufe: 283
öhm, hab mir deine Konfig. ned genau angesehen, aber wenn du nur google aufrufen kannst.. tippe ich mal auf den DNSCache (; oder anders gesagt.. kommen den DNS Anfragen aus deinem VPN ins internet oder zumindestens an einen lokalen DNS ? bzw. is der Client richtig konfiguriert was DNS angeht ?
 
Bin jetzt den Weg gegangen alles zu verbieten und nur Sachen zu erlauben, die ich auch haben will.
So wird auf dem tap device nur VPN Verkehr zugelassen,
auf dem LAN NIC nur der lokale Netzwerkverkehr und
auf dem WLAN NIC nur die Verbindung zum PPP Dienst.
Dann werden noch ein paar Ports geöffnet, die den Zugriff auf ein paar Dienste aus dem Internet her erlauben.
Dann soll für ng0 und ng1 nur DNS (named laucht auf der LAN IP des Servers) und HTTP zugelassen werden. DNS klappt auch prima (ein nslookup bsdforen.de liefert die IP), nur HTTP klappt leider nicht so ganz (siehe oben).
@dark_angel:
fxp0 ist dein externes Interface. Wenn du Internetzugang haben willst, musst du dort den Zugang nach aussen erlauben. Z. B. "pass out on fxp0 from any to any", am Ende der pf.conf. Wer dort nicht raus soll/darf, den kannst ja vorher schon, mit einer "block quick"-Regel einsperren und nicht raus lassen.
Warum hast du die Regel "pass out on $LAN proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state" 2x in deinem #FTP&HTTP-Abschnitt? Hast du pftop installiert? Wenn ja, schau dir mal die Regeln und wo Paketverkehr statt findet, mit "pftop -s 5 -v rules" an.
 
Zuletzt bearbeitet:
öhm, hab mir deine Konfig. ned genau angesehen, aber wenn du nur google aufrufen kannst.. tippe ich mal auf den DNSCache (; oder anders gesagt.. kommen den DNS Anfragen aus deinem VPN ins internet oder zumindestens an einen lokalen DNS ? bzw. is der Client richtig konfiguriert was DNS angeht ?
Ne also das Problem liegt nicht am DNS, weil der löst jede Adresse korrekt auf.

@dark_angel:
fxp0 ist dein externes Interface. Wenn du Internetzugang haben willst, musst du dort den Zugang nach aussen erlauben. Z. B. "pass out on fxp0 from any to any", am Ende der pf.conf. Wer dort nicht raus soll/darf, den kannst ja vorher schon, mit einer "block quick"-Regel einsperren und nicht raus lassen.
Warum hast du die Regel "pass out on $LAN proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state" 2x in deinem #FTP&HTTP-Abschnitt? Hast du pftop installiert? Wenn ja, schau dir mal die Regeln und wo Paketverkehr statt findet, mit "pftop -s 5 -v rules" an.
Ah ok!
Dachte es reicht ein
pass out on $LAN proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state
wenn ich den Verkehr vom PPP Client zum LAN durchlassen will.

Ups die Regel ist 2x drin, weil ich mpd4 für 2 PPP Clients eingerichtet habe. War wohl gestern doch etwas spät und ich hab da net aufgepasst. ^^

Jo pftop ist installiert; werd ich mir mal anschaun.
 
Zuletzt bearbeitet:
Ok also die sache hier wird irgendwie immer komischer.
Der InternetExplorer und Firefox können nicht auf Websites zugreifen, die anders lauten als google.de, jedoch - und das ist das Merkwürdige - kann ich mittels telnet auf bsdforen.de, heise.de und meiner Homepage "surfen" (andere Seiten hab ich noch net getestet).
Wenn ich meinen PPP Client bei mir direkt ans LAN anklemme und ihm ne LAN IP gebe, dann kann man mit den Browsern auch auf anderen Seiten als google.de surfen, nur beim umstöpseln gehts wiederum net. Da muss doch wo der Wurm drin sein. :S

pftop gibt mir aus, dass die Verbindung mit folgender Regel erlaubt wurde:
pass in on $PPP0 proto tcp from $PPP_NW to !$VPN_NW port { ftp, http } keep state

Mein Router müsste ja mit der Rroute
Destination IP: 192.168.1.0
Netmask: 255.255.255.0
Gateway: 192.168.0.3
Metric: 1
Interface: LAN
ausreichend konfiguriert sein.

Meint ihr ich sollte ne NAT einrichten, so dass ich keine Routes aufm Router setzen muss?
So etwas in der Art:
nat on $LAN from $PPP_NW to any -> ($LAN)
Weil das Ergebnis dürfte doch das selbe sein.

EDIT:
Was ich noch sagen wollte:
Am Router selbst wird die Verbindung vom PPP Client zur Website auch angezeigt, also er lässt diese auch durch.
 
Wenn du nach Außen nur eine IP hast brauchst du auf jeden Fall NAT. Wenn nicht, habe ich dich vollständig falsch verstanden.
 
Nach außen (Internet) habe ich auch nur eine IP.
Es geht darum, dass die Verbindung
PPP Client <---> HomeServer(mit PF) <---> Router(der macht NAT) <---> Internet
nicht so richtig will.
Beziehungsweise am Windows Rechner (der PPP Client) der IE und FF nicht alle Websites anzeigen wollen, aber es via telnet doch geht.
 
ne dumme idee ins blaue .. stimmt die MTU ?

andere idee, hast du vielleicht irgendwo ne "Portalseite" festgelegt beim mpd oder wlan ap?! oder läuft vll irgendwo zwischen ein transparenter proxy der sich da querstellt ?

was genau für ne meldung kommt den beim browser eigentlich ? timeout?
hast du mal über kabel versucht ne VPN Verbindung aufzubauen, passiert da das gleiche?!
 
MTU hab ich nirgendwo festgelegt. Die müsste aber bei 1500 sein. Werde es aber mal in der mpd.conf festlegen.

Eine Portalseite habe ich nicht.
Wenn man im WLAN ist wählt man sich einfach mittels PPP Client (in diesem Fall den von WindowsXP) auf den Server und hat dann eine Verbindung ins LAN (diese funktioniert auch einwandfrei, wenn ich in PF pings erlaube kann ich jeden Rechner im LAN anpingen).
Werde es die Tage mal mit ner FreeBSD Kiste probieren. Da kann man zumindest mittels tcpdump genauer nachschaun, wo es hängt. WinDump hab ich net zum Laufen bekommen. :(

Beim Browser kommt ne Timeout Meldung. Mit
telnet bsdforen.de 80
gehts jedoch ohne verzögerungen.
Über Kabel passiert genau das gleiche.
Ne Vermutung von mir ist, dass Windows evtl. nicht ganz mit der PPP Verbindung klar kommt.


Damit wir mal so die configs vervollständigen:
Hier noch meine mpd.conf. Vlt. ist ja hier der Fehler zu suchen.
Code:
$ cat /usr/local/etc/mpd4/mpd.conf
startup:
        set web ip 192.168.0.3
        set web port 5006
        set web user chris computer
        set web open

default:
        load client0
        load client1

client_def:
        set iface route default
        set iface no on-demand
        set iface yes proxy-arp
        set iface yes tcpmssfix
        set bundle yes multilink
        set bundle yes encryption
        set bundle yes compression
        set link yes acfcomp protocomp
        set link no pap
        set link yes chap-md5
        set link no chap-msv1
        set link yes chap-msv2
        set link keep-alive 10 60
        set ipcp yes vjcomp
        set ipcp dns 192.168.0.3
        set ccp yes mppc
        set ccp no mpp-e40
        set ccp no mpp-e56
        set ccp yes mpp-e128
        #set ccp yes mpp-stateless
        set ccp mppe-policy
        #set bundle yes crypt-reqd

client0:
        new -i ng0 pptp0 pptp0
        set ipcp ranges 192.168.1.1/24 192.168.1.5/24
        load client_def

client1:
        new -i ng1 pptp1 pptp1
        set ipcp ranges 192.168.1.1/24 192.168.1.6/24
        load client_def
 
@dark_angel
Was mir noch aufgefallen ist, Du hast 2 NICs (ng0 und ng1) im selben Netz (192.168.1.0/24). Die Diskussion hier im Forum kennst Du, hast ja teilgenommen.
 
Oh sh** hab das total vergessen anzumerken:
Das ist im Moment nur so, weil ich einen PPP Client habe und somit auch nur ein Interface gleichzeitig im selben Netz ist. Wollte wenn demnächt mal n Freund zu mir kommt testen, ob für PPP Verbindungen das selbe gilt wie für das 'normale' Netzwerk.
Die config ist also rein aus interesse so. Da eh nur eine PPP Verbindung gleichzeitig genutzt wird ist immer nur ein Interface gleichzeitig in einem Netz. Sollte also keine Probleme bereiten.
 
Ok also mit FreeBSD klappt es ohne Probleme.
Nächste Woche kommt ein Freund mit nem anderen Windows Laptop vorbei. Wenns bei ihm klappt, dann ists für mich ein Zeichen, dass es geht. ^^
Werde dann auch mal meine configs posten, wenn jemand mal ähnliche Probleme haben soll oder meint ihr, dass wäre sogar ein wiki Artikel wert?

Thx an euch!
 
Zurück
Oben