pf (Paketfilter)

pf – eine Abkürzung von packet filter (deutsch: Paketfilter) – ist eine Firewall-Software, die ursprünglich für das Betriebssystem OpenBSD geschrieben wurde.

pf dient neben seiner Funktion als Paketfilter auch als NAT-Software, d. h. zum Übersetzen von Internetadressen eines privaten Netzwerks in das Internet, und kann außerdem die Datenübertragungsraten des gefilterten bzw. übersetzten Netzverkehrs regulieren (siehe QoS). Des Weiteren bietet pf eine Filterung anhand des Betriebssystems, erweiterte Paketbehandlung (Zusammenbau fragmentierter Pakete) und einen Authentifizierungsmodus namens pf-auth.

Geschichte

pf entstand, als das OpenBSD-Projekt aufgrund von Lizenzproblemen den bis dahin enthaltenen Paketfilter IPFilter entfernte und einen Ersatz benötigte. Er wurde im Juni 2001 von Daniel Hartmeier ins Leben gerufen und ist seit OpenBSD 3.0 (veröffentlicht am 1. Dezember 2001) Bestandteil von OpenBSD. Inzwischen wurde pf auch auf FreeBSD, NetBSD, DragonFly BSD und Mac OS X portiert.

Beispiel

PF lässt sich mit (im Vergleich zu iptables) einfach zu lesenden Regeln konfigurieren, die in etwa der folgenden Syntax folgen. Dabei stellen runde Klammern (…|…) notwendige Elemente, eckige Klammern […|…] optionale Elemente dar:

 (pass|block [drop|return|return-icmp|return-icmp6|return-rst]|match) [in|out] [log] [quick]
 [on <interface>] [on rdomain <number>] [inet|inet6] [proto (tcp|udp|icmp|icmp6)]
 ([from <src> [port <src>][os <src>]|to <dest> [port <dest>]]|all) [flags <a>/<b>]
 [icmp-type <type> code <code>|icmp6-type <type> code <code>] [probability <number>]
 [user <user>] [nat-to <src>|rdr-to <dst>]

Die folgenden Regeln blockieren alle Pakete von Hosts, die keine Mails einliefern dürfen (blocked_hosts), und erlauben es für alle anderen:

 blocked_hosts = { 223.33.14.23, 34.12.34.0/24, 17.0.0.0/8 }

 pass in on em0 inet proto tcp from any to self port 25,587
 block in on em0 inet proto tcp from $blocked_hosts to self port 25,587

Dabei ist em0 das Netzwerkinterface, auf dem die Filterung stattfindet, in die Richtung (eingehend), inet steht für IPv4-Pakete, proto tcp trifft auf TCP-Pakete zu, die symbolische Konstante any trifft auf alle Hosts zu (IP-Schreibweise 0.0.0.0), und self ist die eigene IP-Adresse des jeweiligen Interfaces.

Eine Besonderheit von PF ist, dass immer die letzte passende Regel zutrifft, also normalerweise unten die spezialisiertesten Regeln stehen und oben die allgemeinsten (Blacklisting). Whitelisting wird durch eine alles verbietende Regel am Anfang und folgende, erlaubende Regeln realisiert.

Daher würde die umgekehrte Reihenfolge der hier beschriebenen Regeln dazu führen, dass jeder Mails einliefern dürfte, da die in der ersten Regel blockierten Hosts in der zweiten Regel durchgelassen würden.

Das nächste Beispiel zeigt eine exemplarische NAT-Lösung, die z. B. auf einem Router laufen kann:

 ext_schnittstelle = em0
 intern_netz = 192.168.0.0/16

 match out on $ext_schnittstelle inet from $intern_netz to any nat-to $ext_schnittstelle

match trifft hierbei auf Pakete zu, entscheidet aber nicht über Durchlassen oder Blockieren. Alle Pakete, die die Firewall über die Schnittstelle $ext_schnittstelle verlassen und IPv4-Pakete (inet) aus dem eigenen (internen) Netz $intern_netz sind, werden mit der Absenderadresse von $ext_schnittstelle versehen. Weitere Regeln für eine funktionierende NAT-Firewall sind nicht mehr nötig.

Außerdem ist PF in der Lage, als TCP-Proxy zu fungieren, somit die eingehenden TCP-Verbindungen zu bestätigen und erst danach an die Anwendungen weiterzureichen. Dies verhindert SYN-Floods.

Siehe auch

  • ipfw, iptables (Paketfilter anderer Betriebssysteme)
  • pfSense – eine Firewall-/Routerdistribution mit pf und einer Web-GUI
  • OPNsense – stateful Firewalldistribution mit pf und Web-GUI, basierend auf FreeBSD 10.1-RELEASE

Literatur

  • Peter N.M. Hansteen: The Book of PF: A No-Nonsense Guide to the OpenBSD Firewall. 3. Auflage. No Starch Press, 2014, ISBN 978-1-59327-589-1.