[OpenBSD]

[Zurück: Scrub (Paketnormalisierung)] [Inhalt] [Weiter: Paket-Queueing und Priorisierung]

PF: Anker


Inhaltsverzeichnis


Einführung

Zusätzlich zu den Hauptregelsätzen kann PF ebenfalls Unterregelsätze festsetzen. Seit Unterregelsätze ,on the fly' unter Verwendung von pfctl(8) manipuliert werden können, bieten sie einen praktischen Weg, um einen aktiven Regelsatz dynamisch zu verändern. Während eine Tabelle verwendet wird, um eine dynamische Liste von Adressen zu halten, wird ein Unterregelsatz verwendet, um einen dynamischen Satz von Filter-, nat-, rdr- und binat-Regeln zu halten.

Unterregelsätze werden mit Hilfe von Ankern an den Hauptregelsatz angehängt. Es gibt vier Typen dieser Anker-Regeln:

Anker können verschachtelt werden, was es ermöglicht, dass Unterregelsätze in Reihe zusammengeschlossen werden können. Anker-Regeln werden relativ zu dem Anker zugewiesen, in welchem sie geladen werden. Zum Beispiel werden im Hauptregelsatz befindliche Anker-Regeln Anker-Anhänge erzeugen, die auf den Hauptregelsatz als Eltern verweisen und Anker-Regeln, die von Dateien mit der load anchor-Direktive geladen wurden, werden Anker-Punkte mit eben jenem Anker als Eltern-Anker erstellen.

Anker

Ein Anker ist eine Kollektion von Filter- und/oder Übersetzungsregeln, Tabellen und anderen Ankern, denen ein Name zugewiesen wurde. Wenn PF auf eine anchor-Regel im Hauptregelsatz trifft, wird es die Regeln, die in diesem Anker liegen, genauso wie die Regeln im Hauptregelsatz zuweisen. Die Verarbeitung wird dann mit dem Hauptregelsatz weitergesetzt, außer das Paket trifft auf eine Filterregel, die die quick-Option gesetzt hat, oder auf eine Übersetzungsregel innerhalb des Ankers zu, so dass in diesem Fall die Übereinstimmung als final angesehen wird und in einem Abbruch der Überprüfungen der Regeln in sowohl dem Anker als auch im Hauptregelsatz endet.

Zum Beispiel:

ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor goodguys

Dieser Regelsatz setzt eine ,standardmäßiges Blocken'-Richtlinie auf fxp0 für sowohl einkommenden als auch ausgehenden Verkehr. Der Verkehr wird dann zustandsmäßig (statefully) herausgelassen und eine Ankerregel wird mit dem Namen goodguys erstellt. Anker können auf zwei Arten mit Regeln gefüllt werden:

Die load-Regel sorgt dafür, dass pfctl den angegebenen Anker durch das Lesen von Regeln aus einer Textdatei anlegt. Die load-Regel muss nach der anchor-Regel angegeben werden. Beispiel:

anchor goodguys
load anchor goodguys from "/etc/anchor-goodguys-ssh"

Um Regeln unter Verwendung von pfctl einem Anker hinzuzufügen, kann der folgende Befehlstyp verwendet werden:

# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
   | pfctl -a goodguys -f -

Regeln können ebenfalls in eine Textdatei gespeichert und geladen werden:

# cat >> /etc/anchor-goodguys-www
pass in proto tcp from 192.0.2.3 to any port 80
pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys -f /etc/anchor-goodguys-www

Filter- und Übersetzungsregeln können unter Verwendung der gleichen Syntax und Optionen in einen Anker wie Regeln in den Hauptregelsatz geladen werden. Ein Haken jedoch ist, dass jegliche Makros, die verwenden werden, ebenfalls im Anker definiert werden müssen; Makros, die im Eltern-Regelsatz definiert worden sind, sind von Ankern aus nicht sichtbar.

Da Anker verschachtelt werden können, ist es möglich anzugeben, dass alle ,child'-Anker innerhalb eines angegebenen Ankers verarbeitet werden:

anchor "spam/*"

Diese Syntax sorgt dafür, dass alle Regeln innerhalb eines jeden Ankers, der an den spam-Anker angehängt wurde, ausgewertet werden. Die ,child'-Anker werden in alphabetischer Reihenfolge ausgewertet, aber verlieren sich nicht in Rekursivitäten. Anker werden immer relativ zu dem Anker, in welchem sie definiert wurden, ausgewertet.

Jeder Anker, wie auch der Hauptregelsatz, existiert separat neben anderen Regelsätzen. Operationen, die in einem Regelsatz ausgeführt werden, wie zum Beispiel die Regeln zu ,flush'en, haben keine Auswirkung auf andere. Ebenfalls wird das Entfernen eines Ankerpunktes aus dem Hauptregelsatz keinen Anker oder irgendeinen ,child'-Anker zerstören, die diesem Anker angehängt worden sind. Ein Anker wird nicht zerstört, bis er von allen Regeln unter Verwendung von pfctl(8) ge,flush't wird und sich kein ,child'-Anker mehr in diesem Anker befindet.

Anker-Optionen

Wenn gewünscht, können anchor-Regeln ein Interface, Protokoll, Quell- und Zieladresse, Tags, etc., unter Verwendung der selben Syntax der Filterregeln spezifizieren. Wenn solche Information gegeben sind, werden anchor-Regeln nur verarbeitet, wenn das Paket mit der Regeldefinition vom anchor übereinstimmt. Zum Beispiel:
ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor ssh in on $ext_if proto tcp from any to any port 22

Die Regeln in dem Anker ssh werden nur für TCP-Pakete verarbeitet, die für den Port 22 bestimmt sind und über fxp0 hereinkommen. Regeln werden wie folgt dem anchor angehängt:

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -

So, selbst wenn die Filterregel kein Interface, Protokoll oder Port angibt, wird dem Host 192.0.2.10 die Verbindung nur erlaubt sein, wenn er SSH verwendet, da die Definition der anchor-Regel greift.

Anker manipulieren

Die Manipulierung von Ankern wird durch pfctl bewerkstelligt. Es kann verwendet werden, um Regeln einem Anker hinzuzufügen oder zu löschen, ohne den Hauptregelsatz neuzuladen.

Um alle Regeln in dem Anker namens ssh aufzulisten:

# pfctl -a ssh -s rules

Um alle Filterregeln von dem gleichen Anker zu ,flush'en:

# pfctl -a ssh -F rules

Für eine vollständige Liste der Kommandos, siehe bitte pfctl(8).

[Zurück: Scrub (Paketnormalisierung)] [Inhalt] [Weiter: Paket-Queueing und Priorisierung]


[zurück] www@openbsd.org
$OpenBSD: anchors.html,v 1.13 2006/05/01 12:19:17 jufi Exp $