Mac OSX Firewall-Tool pf

JackCarver

Junior Member
Danke für die Info - stecke aber leider mit der Fehler meldung no altq fest und komme nicht weiter
Diese Meldung ist normal und kommt auch bei mir, um genau zu sein kommt bei mir folgendes:

No ALTQ support in kernel
ALTQ related functions disabled
Was machst du denn um die Firewall zu starten? Generell musst du die Regeln aus einer Datei laden, das ganze mit folgender Syntax:

Code:
sudo pfctl -f /pfad_zu_den_fw_regeln
Danach musst du die Firewall aktivieren mit:

Code:
sudo pfctl -e
Dann sollte es, sofern die Regeln korrekt sind auch bereits deine Ports blocken. Deaktivieren kannst du die FW mit folgendem Befehl:

Code:
sudo pfctl -d
 

Ghost

Junior Member
Anpassung für El Capitan:

Nach dem Update auf El Capitan hatte ich keinen Zugriff auf mein Netzwerk.
Ich habe die Regeln angepasst, jetzt habe ich wieder Zugriff auf mein Netzwerk.
Könnte das mal jemand @JackCarver überprüfen, ob alles richtig ist.

Neu hinzugefügt wurden:

Code:
pass out on en0 inet from any to 10.0.0.0/16 flags S/SA keep state
pass out on en0 inet from any to 127.16.0.0/12 flags S/SA keep state
pass in on en0 inet from 10.0.0.0/16 to any flags S/SA keep state
pass in on en0 inet from 127.16.0.0/12 to any flags S/SA keep state
Wäre super
Danke :)

PS: Was mir gerade noch aufgefallen ist, wenn ich fritz.box eingebe, kann ich mich nicht zum Router verbinden, wenn ich die IP 192.168.XX.XX eingebe, kann ich mich zum Router verbinden.

Code:
No ALTQ support in kernel
ALTQ related functions disabled
block drop all
pass out on en0 proto udp from any to any port = 1194 keep state
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 en0 proto udp from any to any port = 5353 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.0.0/16 flags S/SA keep state
pass out on en0 inet from any to 10.0.0.0/16 flags S/SA keep state
pass out on en0 inet from any to 127.16.0.0/12 flags S/SA keep state
pass in on en0 inet from 192.168.0.0/16 to any flags S/SA keep state
pass in on en0 inet from 10.0.0.0/16 to any flags S/SA keep state
pass in on en0 inet from 127.16.0.0/12 to any flags S/SA keep state
pass out on tun0 all flags S/SA keep state
pass in on tun0 all flags S/SA keep state
 
Last edited:

Ghost

Junior Member
@JackCarver

Zur Info:

Beim PP Manager der testversion fiel mir das auch auf das unter El Capitan die Firewall-Option nicht ziehen. Das wird natürlich den Start auch verzögern, da das abgefragt werden muss und dann an die Version von macOS die der Nutzer hat, angepasst werden muss.
Mein letzter Stand war, das ein Kollege den Code momentan glatt zieht und aufräumt. Unter 10.10 war der Manager an sich schon voll funktionsfähig. Aber es soll eben schon ordentlich sein
 

JackCarver

Junior Member
Also nach einigen Tests kann ich sagen, dass die Firewall Regeln auch unter El Capitan funktionieren. Ich hab nochmal n kleines Regelwerk getestet, mit dem ich auch Zugriff auf das Netzwerk hatte (Dateifreigabe auf dem MacMini vom MacBook aus erreicht, auf dem die Firewall aktiv war).
Hier nochmal die Regeln die ich verwendet habe:

Code:
block in all
block out all
pass in on lo0 all
pass out on lo0 all
pass out on $iface inet proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on $iface inet proto tcp to any port {1152,152} keep state
pass out on $iface inet to 10.0.0.0/8
pass in on $iface inet from 10.0.0.0/8
pass out on $iface inet to 192.168.0.0/16
pass in on $iface inet from 192.168.0.0/16
pass out on $iface inet to 172.16.0.0/12
pass in on $iface inet from 172.16.0.0/12
pass out on utun0 all keep state
pass out on tun0 all keep state
Es wird hier zunächst jeglicher Traffic (IPv4, IPv6) geblockt. Anschließend öffnet man localhost, danach für das Interface $iface (durch sein eigenes ersetzen) die PP UDP, TCP Ports, sowie der Apple Port 5353 und den DNS Port. Anschließend öffnet man den Traffic für sämtliche LANs (das muss man so nicht übernehmen und kann das auf sein spezielles LAN anpassen).
Zum Schluss wird der Traffic über das OpenVPN Interface uneingeschränkt erlaubt.
Die Erlaubnis gilt jeweils nur für IPv4, IPv6 bleibt dicht.

@Ghost :
Die Flags S/SA benötigst du nicht extra, da diese default sind (siehe OpenBSD pf Referenz: http://www.openbsd.org/faq/pf/)

Noch etwas zur keep state Option:
Diese Option erspart dir etwas Schreibarbeit, da sie den Antwort-Traffic auf ausgehende Verbindungen automatisch passieren lässt. Das nutzt dir aber nix bei deinem LAN. Dort kann es passieren, dass man von Rechner A auf Rechner B zugreifen möchte. Wenn auf Rechner B nun OSX mit aktivierter Firewall läuft, so ist das für Rechner B kein Antwort-Traffic, sondern neuer eingehender Traffic. Das muss explizit mit der Richtung "pass in" freigeschalten werden. Ein "pass out" mit Option keep state langt hier nicht. Wenn du also "pass out" und "pass in" Rules für dasselbe LAN machst, kannst du keep state weglassen, da unnötig. Dasselbe bei localhost sowie dem OpenVPN Interface.

Gruß Jack
 

Ghost

Junior Member
@JackCarver

pass out on utun0 all keep state
pass out on tun0 all keep state

Hey Jack, ich glaube dir ist ein Fehler unterlaufen. (siehe "fett" markiert)

Muss ich "$iface" durch "en0" ersetzen?

Wenn ich den Code übernehme, so wie gepostet, funktioniert es nicht.
Es wird nichts geblockt.
Ohne VPN-Verbindung ist surfen ......möglich.
 

JackCarver

Junior Member
Du musst natürlich $iface durch dein konkretes Interface ersetzen, zb en0. Dann sollte es funktionieren, mit $iface wird natürlich nix geblockt. Das soll heißen utun0 bzw tun0. OSX verwendet idR utun(x), Linux verwendet tun(x). Ich hab das zur Sicherheit mal mit aufgeführt.
 

Ghost

Junior Member
Code:
block in all
block out all
pass in on lo0 all
pass out on lo0 all
pass out on en0 inet proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on en0 inet proto tcp to any port {1152,152} keep state
pass out on en0 inet to 10.0.0.0/8
pass in on en0 inet from 10.0.0.0/8
pass out on en0 inet to 192.168.0.0/16
pass in on en0 inet from 192.168.0.0/16
pass out on en0 inet to 172.16.0.0/12
pass in on en0 inet from 172.16.0.0/12
pass out on utun0 all keep state
pass out on tun0 all keep state
habe jetzt $iface durch en0 ersetzt.
Passt so oder?
 

Ghost

Junior Member
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
/Users/admin/Documents/vpn.rules:14: syntax error
pfctl: Syntax error in config file: pf rules not loaded
No ALTQ support in kernel
ALTQ related functions disabled
pfctl: pf already enabled

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
/Users/admin/Documents/vpn.rules:14: syntax error
pfctl: Syntax error in config file: pf rules not loaded
No ALTQ support in kernel
ALTQ related functions disabled
pfctl: pf already enabled (1)

Ich werde noch wahnsinnig.
Meine Regeln werden nicht geladen.

Beim Starten wird dieses Script ausgeführt.
vpn.rules liegt im Ordner Dokumente.


Code:
do shell script "/sbin/pfctl -f /Users/admin/Documents/vpn.rules ;/sbin/pfctl -e" password "Mein Paßwort" with administrator privileges
 
Last edited:

JackCarver

Junior Member
Mach mal kein Copy/Paste, sondern schreib das in ein Textdokument. Als Format des Dokumentes wähle Reiner Text, also kein RTF etc.
 

Ghost

Junior Member
@JackCarver

Wäre super, wenn du erklären könntest, warum die neuen Regeln anders sind.
Damit ich es besser verstehen kann.

1.
block all
wurde durch block in all und block out all ersetzt.

2.
pass out on en0 proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
wurde durch
pass out on en0 inet proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
ersetzt.

3.
Neue Regeln. Ich nehme an, diese erweitern das private Netzwerk.

pass out on en0 inet to 10.0.0.0/8
pass in on en0 inet from 10.0.0.0/8
pass out on en0 inet to 172.16.0.0/12
pass in on en0 inet from 172.16.0.0/12

4.
Neue Regel.
Du hast dazu folgendes geschrieben: OSX verwendet idR utun(x), Linux verwendet tun(x).
Bei mir verwende OSX tun0

pass out on utun0 all keep state

5. Diese Regel fehlt bei den neuen Regeln.

pass in on tun0 all keep state

Alt:
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
Neu:
Code:
block in all
block out all
pass in on lo0 all
pass out on lo0 all
pass out on en0 inet proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on en0 inet proto tcp to any port {1152,152} keep state
pass out on en0 inet to 10.0.0.0/8
pass in on en0 inet from 10.0.0.0/8
pass out on en0 inet to 192.168.0.0/16
pass in on en0 inet from 192.168.0.0/16
pass out on en0 inet to 172.16.0.0/12
pass in on en0 inet from 172.16.0.0/12
pass out on utun0 all keep state
pass out on tun0 all keep state
Zum Schluß noch eine Frage:

Kann man bei dieser Firewall auch mitloggen lassen?

Danke im Voraus
 

JackCarver

Junior Member
Paar Erläuterungen:

Zu 1,
block all ist dasselbe und kannst du auch nehmen, macht keinen Unterschied.

Zu 2,
Diese Regel ist tatsächlich eine Anpassung zu der anderen. Der Unterschied bei beiden ist der, dass bei der neueren Regel der Traffic zu den UDP Ports nur für IPv4 erlaubt wird, nicht für IPv6. IPv6 bleibt also gesperrt. Bei der älteren Regel wurde das auch für IPv6 geöffnet.

Zu 3,
Korrekt, hier wurden einfach alle privaten Netzwerke mit reingenommen, so dass man diese Regeln immer verwenden kann unabhängig dessen, was jemand nun tatsächlich als privates LAN Zuhause hat.

Zu 4,
OSX verwendet beides, bei der Masse wird glaube ich eher utun0 verwendet, ist bei mir zb am MacBook so. Bei dir wird dann eben tun0 verwendet. Daher beide Regeln, einmal für tun0 und einmal für utun0.

Zu 5,
Die pass in Regel mit keep state benötigst du nicht, es langt die pass out Regel mit keep state. Mit der pass out Regel werden neue Verbindungen ausgehend zugelassen und der Antwort-Traffic dazu reingehend. Neue Verbindungen reingehend zum OpenVPN Interface sind nicht möglich, was man meistens auch nicht möchte.

Zum Schluss:
Logging ist auch möglich, benötigt aber das Zusammenspiel mit pflog. Dazu ein Beispiel:

Man erzeugt zunächst eine Logging-Regel in einer Datei, ebenso wie die Firewall Regeln. Um zb alle Pakete zu loggen, die via IPv4 ausgehend an Zielport TCP 443 gerichtet sind (und deren Antwortpakete) sieht das zb so aus:

Code:
pass out log (all) on en0 inet proto tcp to any port 443 keep state
Diese Regel lädt man wie gehabt mit pfctl. Anschließend erzeugt man das Logging Interface und kann sich die Logs in Realtime ansehen mittels tcpdump (Befehle im Terminal eingeben):

Code:
ifconfig pflog0 create
sudo tcpdump -n -e -ttt -i pflog0
Möchte man das in einer Datei haben, so kann man tcpdump anweisen das dorthin zu schreiben, das ganze am besten als Hintergrundprozess:

Code:
sudo tcpdump -i pflog0 -s 0 -B 524288 -w /Pfad_zur_Datei &
Um das wieder zu stoppen, holt man sich mittels ps die Prozess-ID von tcpdump und killt diese:

Code:
ps -ef
sudo kill PID
Um das ganze lesen zu können nutzt man wieder tcpdump:

Code:
tcpdump -n -e -ttt -r /Pfad_zur_Datei
Interessante Links dazu:

 

raivo

New Member
hallo! ich habe Viscosity auf die Version 1.6.1 updated und nun die pf regeln funktionieren nicht mehr. kommt nicht mehr duch. Internet bekomme ich duch Ethernet/ lan cable. Anbei die Config:
block all
pass in on lo0 all
pass out on lo0 all
pass out on en1 proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on en1 proto tcp to any port {1152,152} keep state
pass out on en1 to 192.168.2.0/24
pass in on en1 from 192.168.2.0/24
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

Könntest du bitte mir helfen? Danke!
 

JackCarver

Junior Member
Wenn du eine Verbindung zu PP herstellen kannst, es aber dann hakt, dann setze mal statt tun0 ein utun0. Kannst auch die letzten beiden Regeln nochmal zum Schluss anhängen und statt tun0 dort ein utun0 verwenden.
 

raivo

New Member
SUPER! das war`s! nun funktioniert! konnte einfach nicht verstehen warum auf einmal nicht mehr ging. Danke!
 

staloralo

New Member
Weiß jemand ob man das auch hinbekommt wenn man sich über einen Router VPN server von außen verbindet? Der VPN Server hat das subnet 192.168.6.0, während das normale Netzwerk 192.168.7.0 hat. Aus dem normalen Netzwerk funktioniert der zugriff, aus dem VPN subnet nicht. So sehen meine Einträge dazu aus:

Code:
pass out on en0 to 192.168.7.0/24
pass in on en0 from 192.168.7.0/24
pass out on en0 to 192.168.6.0/24
pass in on en0 from 192.168.6.0/24
Auf andere Geräte die nicht mit pf geschützt sind kann ich aus dem VPN subnet problemlos zugreifen.

Und dann bekomme ich wenn ich das startscript benutze trotz gespeichertem Passwort immer noch eine macOS Passwortabfrage, das sollte das vorherige festlegen doch eigentlich verhindern oder?

Code:
do shell script "/sbin/pfctl -f ~/Documents/vpn.rules;/sbin/pfctl -e" password "meinpasswort" with administrator privileges

Edit: Jetzt funktioniert es irgendwie gar nicht mehr. Sobald ich die Regeln aktiviere habe ich zwar noch zugriff aus dem LAN aber über's Internet läuft gar nichts mehr

Code:
block in all
block out all
pass in on lo0 all
pass out on lo0 all
pass out on en0 inet proto udp to any port {1151,150,151,149,1149,1150,53,5353} keep state
pass out on en0 inet proto tcp to any port {1152,152,32400} keep state
pass out on en0 inet to 10.0.0.0/8
pass in on en0 inet from 10.0.0.0/8
pass out on en0 inet to 192.168.7.0/16
pass in on en0 inet from 192.168.7.0/16
pass out on en0 inet to 192.168.6.0/16
pass in on en0 inet from 192.168.6.0/16
pass out on utun0 all keep state
pass out on tun0 all keep state
 
Last edited:

Ghost

Junior Member
Hey, ich hätte gerne ein Script, mit dem ich die Firewall deaktivieren kann.
Leider habe ich es selber nicht drauf und bin so wieder mal auf euch angewiesen.

Hier mein Script zum aktivieren der Firewall
Code:
do shell script "/sbin/pfctl -f /Users/admin/Documents/vpn.rules ;/sbin/pfctl -e" password "Mein Paßwort" with administrator privileges
Diesen Befehl möchte ich gerne per Doppelklick automatisch ausführen lassen.
Code:
sudo pfctl -F rules
Danke euch.
 
Top