Mac OSX Firewall-Tool pf

JackCarver

Well-known Member
Hallo,

da schonmal die Frage kam, wie man Mavericks absichern kann und es evtl den ein oder anderen Mac User gibt, der daran Interesse hat zeige ich hier mal im Groben, wie man das ganze mit Bordmitteln, respektive dem Firewall-Tool pf für OpenVPN erreichen kann. pf kam mit Lion erstmalig zum Einsatz und ersetzt das bis dahin genutzte ipfw.

PF ist der OpenBSD/FreeBSD Paket Filter und man bekommt dort auch die meisten Infos dazu, ne sehr gute Seite dazu ist:


http://www.openbsd.org/faq/pf/filter.html

Warum überhaupt pf?
Die Frage wird sich sicherlich mancher stellen wo es doch bequemere FW Lösungen für den Mac gibt wie Little Snitch, geht es allerdings nicht darum bestimmte Apps zu blocken sondern auf Portebene nen Cut für alle Verbindungen zu machen und gezielt nur manche Ports raus und reinzulassen werdet ihr sehen, dass der Aufwand mit pf ziemlich gering ist.

So genug geschwafelt, ich zeig euch hier erstmal n kleines Skript, das das ganze für OpenVPN (TCP/UDP) bereits umsetzt:

Code:
block all
pass in on lo0 all
pass out on lo0 all
pass out on en0 proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on en0 proto tcp to any port {1152,152} keep state
pass out on en0 to 192.168.2.0/24
pass in on en0 from 192.168.2.0/24
pass out on tun0 all keep state
pass in on tun0 all keep state


Die Wertigkeit der Regeln geht von oben nach unten, wobei weiter oben stehende weniger wert sind als weiter unten stehende, dh erlaube ich mit Regel 1 Pakete auf nem bestimmten Port und verbiete mit Regel 2 dasselbe, bleibt der Port dicht.

Entsprechend werden mit der ersten Regel alle Verbindungen geblockt.

Regel 2+3 erlaubt Verbindungen rein und rausgehend für localhost, was immer offen sein sollte.

Regel 4 erlaubt für en0 (das ist mein WLAN Adapter, man kann das simpel über ifconfig ermitteln) rausgehende Verbindungen zu beliebigen IPs allerdings nur für das Protokoll UDP und die zugehörigen PP UDP OpenVPN Ports sowie den DNS und den Apple Bonjour Port. Das keep state stellt sicher, dass die zu diesen Verbindungen gehörenden eingehenden Verbindungen auch wieder reingelassen werden.

Regel 5 erlaubt dasselbe für TCP und die PP TCP OpenVPN Ports.

Regel 6+7 erlaubt dasselbe für alle Verbindungen in und aus meinem LAN

Regel 8 erlaubt nun jegliche Verbindung für OpenVPN ausgehend.
​Wer zusätzlich eingehende Verbindungen über tun0 benötigt kann noch Regel 9 mit aufnehmen.

Mehr ist nicht nötig um ne komplette Blockade mit Ausnahme von OpenVPN Verbindungen zu erreichen.


Aktivieren der Regeln:

MacOS hat dazu die Datei /etc/pf.conf um die Regeln dort einzutragen. Besser ist es allerdings diese Datei unberührt zu lassen und die Regeln in ne eigene Datei zu kopieren.

Öffnet dazu unter Mavericks Textedit und erzeugt ein neues lokales Dokument. Um Formatierungen zu vermeiden wählt ihr "Format -> In reinen Text umwandeln" und kopiert obige Regeln dort hinein und speichert es als zb vpn.rules.

Anschließend ladet ihr die Regeln und aktiviert die Firewall mit:

sudo pfctl -f /Pfad-zu/vpn.rules
sudo pfctl -e

Das war's schon ;)

Wollt ihr das derzeit aktive Regelwerk sehen, so genügt ein:

sudo pfctl -sr

Wollt ihr die Regeln wieder loswerden dann langt ein:


sudo pfctl -F rules

Und alle Verbindungen sind auch ohne VPN wieder frei.

Diese Regeln können problemlos erweitert werden, mit derselben Syntax langt zb ein:

pass out on en0 proto tcp to any port 22 keep state

Um zusätzlich ssh ohne VPN zu erlauben.
 
Vielen Dank für deine Mühe. Ich werde das bei Gelegenheit mal ausprobieren.
Kurze Frage: Fungiert das ganze dann als "IP-Leak"? Danach sieht Regel 4 ja aus. Sollte die VPN Verbindung zusammenbrechen müsste ja alles geblockt sein und nur mittels sudo pfctl -F rules wieder freigegeben werden können?!

MfG
 
Du kannst nicht einfach alles blocken, sonst wäre dein System vom Internet komplett abgeschottet. Punkt 4 öffnet die FW dahingehend, dass du zumindest die VPN Verbindung starten kannst, was sonst auch nicht möglich wäre. Der DNS muss frei bleiben um die Hostnamen dazu aufzulösen. Bricht VPN zusammen, dann kannst du wiederum nur die VPN Verbindung starten, da nur diese Ports frei sind, sämtliche andere Ports wie TCP 80 für Web etc sind und bleiben dicht.
 
Bekomme leider folgenden nichts sagenden Syntax Error:

vpn.rules:13: syntax error
pfctl: Syntax error in config file: pf rules not loaded

Habe lediglich en0 zu en1 geändert. Fehlt in dem von dir geposteten Code irgendwo ein ; oder dergleichen?
 
Das macht nix wenn du zu en1 änderst, ich hab grade dasselbe mit copy and Paste probiert und bekam auch ne Fehlermeldung. Dann hab ichs abgeschrieben und der Fehler war weg. Evtl ging was hier beim Formatieren kaputt ich guck mir das später nochmal an, aber fürs erste langt das abtippen des Codes.
 
So mit den Code Tags sollte das nun auch mit dem kopieren klappen, macht am Schluss nochmal n Enter im Textdokument, dass der Cursor in ne neue Zeile springt, danach hatte es bei mir geklappt.
 
Hey Jack,

Danke erstmal für die Anleitung.
Ich versuche gerade die Umsetzung.

Folgende Meldung bekomme ich: (Ist das so in Ordnung?)

xxxs-mac-mini:~ xxx$ sudo pfctl -f /Users/xxx/Documents/VPN-Rules.txt
Password:
pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

No ALTQ support in kernel
ALTQ related functions disabled
xxxs-mac-mini:~ xxx$ sudo pfctl -e
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
xxxs-mac-mini:~ xxx$


Wo finde ich die Datei: /etc/pf.conf ?
Nach einem Neustart funktioniert die Firewall nicht mehr, dann muss ich die Befehle erneut eingeben.
Ich bin momentan etwas ratlos (oder überfordert)

Was mir noch aufgefallen ist:
Nachdem ich ich die Befehle ausgeführt habe, verschwindet im Finder mein NAS.


Danke im voraus für die Unterstützung
 
Dass das NAS verschwindet liegt daran, dass nur noch VPN Verbindungen erlaubt sind. Du musst für das NAS sicherlich hier


pass out on en0 to 192.168.2.0/24 pass in on en0 from 192.168.2.0/24

ansetzen.

Du musst eben den Datenverkehr im lokalen Netzwerk erlauben.

MfG

EDIT: /etc/pf.conf benötigst du nicht. Dafür hast du VPN-Rules.txt. Diese würde ich aber in vpn.rules umbenennen und nicht als .txt Datei lassen (so hat JackCarver es auch oben notiert).
 
Dafür hast du VPN-Rules.txt. Diese würde ich aber in vpn.rules umbenennen

Danke für den Hinweis, das habe ich übersehen.

pass out on en0 to 192.168.2.0/24
pass in on en0 from 192.168.2.0/24

Regel 6+7 habe ich angepasst (weiterhin kein Zugriff auf das NAS)

pass out on en0 to 192.168.178.0/24
pass in on en0 from 192.168.178.0/24


Nach der Änderung in vpn.rules bekome ich folgende Ausgabe:

xxxs-mac-mini:~ xxx$ sudo pfctl -f /Users/xxx/Documents/vpn.rules
Password:
pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

No ALTQ support in kernel
ALTQ related functions disabled
xxxs-mac-mini:~ xxx$ sudo pfctl -e
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
xxxs-mac-mini:~ xxx$ sudo pfctl -sr
No ALTQ support in kernel
ALTQ related functions disabled
block drop all
pass out on en0 proto udp from any to any port = 1151 keep state
pass out on en0 proto udp from any to any port = 150 keep state
pass out on en0 proto udp from any to any port = 151 keep state
pass out on en0 proto udp from any to any port = 149 keep state
pass out on en0 proto udp from any to any port = 1149 keep state
pass out on en0 proto udp from any to any port = 1150 keep state
pass out on en0 proto udp from any to any port = 53 keep state
pass out on lo0 all flags S/SA keep state
pass in on lo0 all flags S/SA keep state
pass out on en0 proto tcp from any to any port = 1152 flags S/SA keep state
pass out on en0 proto tcp from any to any port = 152 flags S/SA keep state
pass out on en0 inet from any to 192.168.178.0/24 flags S/SA keep state
pass in on en0 inet from 192.168.178.0/24 to any flags S/SA keep state
pass out on tun0 all flags S/SA keep state
xxxs-mac-mini:~ xxx$
 
Ok zunächst mal zu deinem Problem Nr 1:

Die Regeln sind nicht persistent, dh sie müssen jedesmal neu eigegeben werden, zudem ist die FW bei jedem Systemstart deaktiviert und muss erneut aktiviert werden. Mit ein bisschen AppleScript Magie lässt sich das Problem aber sehr einfach lösen.
Du öffnest zunächst einmal "Programme -> Dienstprogramme -> AppleScript Editor" und erzeugst ein neues Dokument. Dort kopierst du folgende Zeile hinein:

Code:
 [COLOR=#012FBE][FONT=Verdana][SIZE=12px][B]do shell script[/B][COLOR=#000000] "/sbin/pfctl -f /pfad_zu_deinen_regeln;/sbin/pfctl -e" [/COLOR][COLOR=#5730be]password[/COLOR][COLOR=#000000] "Dein Admin Passwort" [B]with[/B] [/COLOR]administrator privileges[/SIZE][/FONT][/COLOR]

Anschließend klickst du auf "Übersetzen" um zu sehen, dass alles fehlerfrei übersetzt wird. Dann gehst du auf "Ablage -> Sichern" und sicherst das Script als Dateiformat Programm. Du kannst es zb EnableFW nennen.

Nun klickst du auf "Systemeinstellungen -> Benutzer und Gruppen" und dort auf "Anmeldeobjekte". Dort auf das kleine "+" und nun fügst du das Programm EnableFW dort hinzu.

Nun werden bei Systemstart genau diese Schritte zum laden der Regeln und aktivieren der FW automatisiert ausgeführt.


Zu Problem Nr 2:

Dort finde zunächst mal die interne LAN IP des NAS heraus, denn diese IP muss zu den Ausnahmen hinzu. Sollte die in ne IP deines LANs sein, dann sollte das wie Salat schon gesagt hat eigentlich klappen.
 
Hey Jack.

Danke für die "AppleScript Editor" Anleitung.
Das werde ich demnächst gleich mal ausprobieren.

Zum größerem Problem (kein Zugriff auf das lokale Netzwerk)

Mein Router vergibt IP's in der 192.168.178.XXX Range.
Das NAS hat die IP: 192.168.178.30

Regel 6 + 7 habe ich wie folgt angepasst:

pass out on en0 to 192.168.178.0/24
pass in on en0 from 192.168.178.0/24

Leider habe ich immer noch keinen Zugriff auf das lokale Netzwerk (NAS,Dreambox...)
Bin mal wieder ratlos.
 
Mal eine grundsätzliche Frage, wenn du die ganzen Regeln mal weglässt und normal via VPN verbindest, bleibt der Zugriff auf dein NAS dann bestehen? Denn wenn du den gesamten Traffic durch den VPN routest (also auch internen), so ist dein lokales Netzwerk (z.B. also auch ein Router) nicht mehr erreichbar.

Außerdem: schreib doch mal statt 192.168.178.0/24 konkret die 192.168.178.30 mit rein. Auch wenn /24 zwar den Raum bis 255 in der Regel mit abfischt, kannst du es doch einfach mal probieren. Vielleicht klappt es ja. Du weißt ja, Computer und so: das versteht kein Mensch;-)
 
Das Routing von OpenVPN ist eigentlich so, dass das interne Netzwerk unberührt bleibt, also alles was als Ziel dein LAN hat geht nicht via VPN. Das sollte nicht das Prob sein. Teste mal mit ifconfig, dass auch wirkouch en0 dein Adapter ist, der mit dem LAN verbunden ist. Wenn ja, dann probiere mal einzelne LAN-IPs anzupingen ob du da ne Antwort bekommst.
 
Ergebnis ifconfig:

XXXs-Mac-mini:~ xxx$ ifconfig
lo0: flags=8049 mtu 16384
options=3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=1
gif0: flags=8010 mtu 1280
stf0: flags=0 mtu 1280
en0: flags=8863 mtu 1500
options=10b
ether c8:2a:14:20:9f:66
inet6 fe80::ca2a:14ff:fe20:9f66%en0 prefixlen 64 scopeid 0x4
inet 192.168.178.33 netmask 0xffffff00 broadcast 192.168.178.255
nd6 options=1
media: autoselect (1000baseT )
status: active
en1: flags=8823 mtu 1500
ether 10:9a:dd:c3:63:89
nd6 options=1
media: autoselect ()
status: inactive
fw0: flags=8863 mtu 4078
lladdr 70:cd:60:ff:fe:6d:d4:58
nd6 options=1
media: autoselect
status: inactive
p2p0: flags=8802 mtu 2304
ether 02:9a:dd:c3:63:89
media: autoselect
status: inactive
tun0: flags=8851 mtu 1500
inet XXX.XXX.XXX.XXX --> XXX.XXX.XXX.XXX netmask 0xffffff80
open (pid 1901)
 
Hey Jack

do shell script "/sbin/pfctl -f /pfad_zu_deinen_regeln;/sbin/pfctl -e" password "Dein Admin Passwort" with administrator privileges

Funktioniert super! DANKE!

Das Problem mit dem lokalen Netzwerkzugriff konnte ich lösen.
Wenn ich mich im Finder mit "Gehe zu" -> "Mit Server verbinden" mit dem NAS verbinde, funktioniert es ohne Probleme.

@Salat
Danke für die Unterstützung

@Frank
Bitte pinnen (Sticky) (Anleitung IP-Leak MAC)

PS: Was bedeutet eigentlich diese Meldung?

No ALTQ support in kernel
ALTQ related functions disabled
 
Freut mich, dass es nun klappt. Also das ALTQ hat was mit Bandbreitenkontrolle zu tun und ist eher für Router, die unter BSD laufen interessant, weniger für Einzelplatzrechner. Du kannst da Paketen spezielle Prioritäten zuweisen und anhand dieser Prioritätenliste bestimmte Pakete hinten an stellen und wieder andere bevorzugt behandeln.

Diese Funktionen stehen wohl im FreeBSD Kernel von OSX nicht zur Verfügung, kann sein, dass es daran liegt, dass ALTQ mittlerweile abgelöst wurde durch n neues System, oder dass Apple sagt es macht einfach kein Sinn, da wohl niemand nen Apple Rechner als Router einrichten wird:

Hier was zu ALTQ:
http://en.wikipedia.org/w/index.php?title=ALTQ

Und die Meldung, dass es abgelöst wird:
http://undeadly.org/cgi?action=artic...20140419151959
 
Hey Jack, ich habe die Ursache für das Problem (kein Zugriff auf das lokale Netzwerk) gefunden.

Der UDP Port 5353 (Apple Bonjour) muß geöffnet werden.

Firewall-Anforderungen

Das Bonjour-Netzwerkprotokoll sendet und empfängt Netzwerkpakete über den UDP-Port 5353. Das Installationsprogramm von Bonjour konfiguriert die Firewall entsprechend bei der Installation auf unterstützten Systemen. Wenn hingegen eine separate "persönliche Firewall" aktiviert ist, müssen Sie dafür sorgen, dass der UDP-Port 5353 geöffnet ist, damit Bonjour ordnungsgemäß ausgeführt werden kann.

PS: Das könntest du noch ergänzen.

Hier eine Port-Übersicht:

http://support.apple.com/kb/HT6175?viewlocale=en_US
http://support.apple.com/kb/ts1629?viewlocale=de_DE
 
Back
Top