Logo von Netze

Suche
Carsten Strotmann 3

Das Firewall-Tool pf in Mac OS X 10.7 Lion

Doppelt gemauert

Mac OS X 10.7 bringt neben der Application Firewall gleich zwei Kommandozeilen-Tools für die Firewallkonfiguration mit, die beide auch für IPv6 ausgelegt sind: das Firewall-Utility ip6fw und das neue Werkzeug "pf". "pf" ist keine Neuentwicklung von Apple, sondern gründet auf einer OpenBSD-Implementierung, die bereits im Jahr 2001 angestoßen worden ist. Nach und nach wurde sie in FreeBSD und NetBSD übernommen – nun auch in Mac OS X. pf ist ein sehr mächtiges Werkzeug, über dessen Konfiguration man ganze Bücher schreiben kann (beispielsweise Peter N.M. Hansteen, The Book of pf, 2nd Edition, NoStarch Press, November 2010, ISBN: 978-1-59327-274-6). Wir fassen die wesentlichen Merkmale zusammen.

Ein Wort zur Vorsicht: Bei unseren Versuchen haben wir festgestellt, das Apples Implementierung auf Mac OS X 10.7.1 die Stabilität des Betriebssystems beeinträchtigen kann. Von Kernel-Abstürzen über "hängende" Anwendungen bis zu "eingefrorenen" Systemen haben wir alles erlebt. Derzeit hat "pf" in Mac OS X den Status "produktionsreif" nicht erreicht.

Anzeige

Die Haupt-Konfigurationsdatei "/etc/pf.conf" wird beim Start des Betriebssystems ausgelesen und die dort definierten Regeln werden in die "pf"-Firewall eingetragen. Diesen Vorgang löst der LaunchDaemon com.apple.pfctl.plist aus, den man in /System/Library/LaunchDaemons/ findet. Allerdings wird damit die "pf"-Firewall nicht aktiviert. Das müssen Anwendungen oder ein eigener LaunchDaemon übernehmen.

Die Firewall lässt sich mit dem Kommandozeilen-Programm pfctl steuern. Der Befehl pfctl -E aktiviert die Firewall mit dem aktuell geladenen Regelsatz. pfctl -X <referenztoken> deaktiviert die Firewall, oder besser gesagt, verringert einen Referenzzähler um eins. Dieser Referenzzähler wird bei jedem Aufruf von pfctl -E erhöht, und mittels pfctl -X <referenztoken> verringert. Ist der Referenzzähler bei Null angekommen, wird die Firewall ausgeschaltet. Auf diese Weise können mehrere Anwendungen die Firewall kontrollieren, aber erst wenn die letze ihren Bedarf abmeldet, wird die pf-Firewall auch tatsächlich abgeschaltet. pfctl -X benötigt ein Referenztoken. Dieses Referenztoken wird beim Einschalten der Firewall mittels pfctl -E erzeugt und kann mit pfctl -s References ausgelesen werden.

# sudo pfctl -s References
No ALTQ support in kernel
ALTQ related functions disabled
TOKENS:
PID Process Name TOKEN TIMESTAMP
671 pfctl 18446743524369253512 0 days 00:00:02

# sudo pfctl -X 18446743524369253512
No ALTQ support in kernel
ALTQ related functions disabled
pf disabled

pfctl -s info gibt den aktuellen Statusbericht zur Firewall, inklusive der Angabe, ob die Firewall aktiviert ist:

#  sudo pfctl -s info
No ALTQ support in kernel
ALTQ related functions disabled
Status: Disabled for 0 days 00:02:44 Debug: Urgent
[...]

Beim Logging beschreitet "pf" einen ungewöhnlichen Weg: Die Logausgaben werden an eine virtuelle Netzwerkschnitstelle gesendet. Von dort lassen sich die Daten mit einem beliebigen Programm auslesen, welches das Logging-Paket-Format versteht. Das geht beispielsweise mit tcpdump oder Wireshark.

Um das Logging einzuschalten, definiert man am Anfang der Konfigurationsdatei den Namen der virtuellen Netzwerkschnittstelle:

set loginterface pflog0

Diese Netzwerkschnittstelle erzeugt man per ifconfig – und zwar nach jedem Neustart. Dann kann man sie mittels tcpdump abfragen:

# sudo ifconfig pflog0 create
# sudo tcpdump tcpdump -n -e -ttt -i pflog0

Die Syntax für die Firewall-Regeln erscheint ähnlich gut lesbar wie die des ip6fw-Utilities. Zum besseren Vergleich haben wir die ip6fw-Regeln, die im Artikel "Vorsorgliches Umtopfen" aufgeführt sind, in das "pf"-Format übersetzt. Das IPv6-Regelwerk wird per "include" in die Hauptdatei eingebunden:

Datei "/etc/pf.conf":

--------
#
set loginterface pflog0
scrub in all fragment reassemble
#
# com.apple anchor point
#
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
include "/etc/pf-ipv6rules.conf"
--------

Datei "/etc/pf-ipv6rules.conf":

--------
#
# Macros
#
lan_if="en0"
wifi_if="en1"
ip6linklocal="fe80::/10"
ip6linklocalmc="ff02::/16"
# no rules on loopback and interface traffic
set skip on lo0
# Duplicate Address detection (DAD)
pass in inet6 proto ipv6-icmp from any to $ip6linklocalmc 
# Neighbor discovery solicitation out
pass out on {$lan_if, $wifi_if} inet6 proto ipv6-icmp all icmp6-type {neighbradv, neighbrsol}
# Neighbor discovery advertisement in
pass in on {$lan_if, $wifi_if} inet6 proto ipv6-icmp all icmp6-type {neighbradv, neighbrsol}
# ICMPv6 Pakete aus dem Netzwerk kommend erlauben
pass in on {$lan_if, $wifi_if} inet6 proto ipv6-icmp all icmp6-type {unreach, toobig, timex, paramprob, echoreq, echorep}
# Router solicitation kommend
pass in on {$lan_if, $wifi_if} inet6 proto ipv6-icmp all icmp6-type routersol
# NTP multicast
pass in on {$lan_if, $wifi_if} inet6 proto udp from any to ff02::1010 port 123 keep state
# mDNS (Rendezvous/Bonjour)
pass in on {$lan_if, $wifi_if} inet6 proto udp from any to ff02::fb port 5353 keep state
pass out on {$lan_if, $wifi_if} inet6 proto udp from any to ff02::fb port 5353 keep state
# DHCPv6
pass out on {$lan_if, $wifi_if} inet6 proto udp from any to ff02::1:2 port 547 keep state
pass in on {$lan_if, $wifi_if} inet6 proto udp from any to any port 546 keep state
# ausgehende IPv6 Verbindungen (UDP/TCP)
pass out on {$lan_if, $wifi_if} inet6 proto tcp all keep state
pass out on {$lan_if, $wifi_if} inet6 proto udp all keep state
#
# alles was nicht erlaubt wurde blocken und in das log schreiben
#
block return log on {$lan_if, $wifi_if} inet6 all
--------

(dz)

3 Kommentare

  1. Kleines Update: IPFire in Version 2.13 Core 75 erhältlich

    Das Update bereinigt in der Opensource-Firewall Probleme mit Pakfire und OpenVPN, darunter ein Validierungsproblem mit SSL-Zertifikaten.

  2. IPv6-Leitfaden jetzt am Kiosk

    Das iX-Sonderheft zur Einführung des nachhaltigen Internet-Protokolls ist ab heute auch im Zeitschriftenhandel erhältlich.

  3. Gmail macht POP3 mit IPv6

    Seit langem nutzen wir Gmail, um E-Mails von unserem Mailserver via POP3 abzuholen. Plötzlich funktioniert das nicht mehr, obwohl wir nichts geändert haben. Wir finden auch keine Fehlermeldung bei Gmail.

  4. Mitschreibende Windows-Firewall

    Ich möchte gerne sehen, welche Anfragen und Pakete die Windows-7-Firewall annimmt oder abweist. Was muss ich dafür tun?

Anzeige