[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 zur Laufzeit mit pfctl(8) manipuliert werden können, bieten sie einen praktischen Weg, um einen aktiven Regelsatz dynamisch zu verändern. Während eine Tabelle eine dynamische Liste von Adressen enthält, wird ein Unterregelsatz verwendet, um einen dynamischen Satz an 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. Damit ist es möglich, Unterregelsätze in Reihe zusammenzuschließen. Ankerregeln werden relativ zu dem Anker zugewiesen, in welchem sie geladen werden. Zum Beispiel werden im Hauptregelsatz befindliche Ankerregeln Ankeranhänge erzeugen, die auf den Hauptregelsatz als Eltern verweisen. Ankerregeln, die aus Dateien mit der load anchor-Direktive geladen wurden, werden Ankerpunkte mit eben jenem Anker als Elternanker erstellen.

Anker

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

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äßig 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 drei Arten mit Regeln gefüllt werden:

Die load-Regel sorgt dafür, dass pfctl den angegebenen Anker anlegt, indem Regeln aus einer Textdatei gelesen werden. 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 geschrieben 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

Um Regeln direkt aus dem Hauptregelsatz zu laden, schließe deine Ankerregeln in geschweiften Klammern ein:

anchor "goodguys" {
   pass in proto tcp from 192.168.2.3 to port 22
}

Direkt eingetragene Anker können weitere Anker beinhalten.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" {
   anchor {
      pass in proto tcp from 192.0.2.3 to port 80
   }
   pass in proto tcp from $allow to port 22
}
Bei der Verwendung von direkt angegebenen Ankern wird der Ankername optional. Der eingebettete Anker im oben angegebenen Fall hat zum Beispiel keinen Namen. Des Weiteren wurde das Makro $allow außerhalb des Ankers (im Hauptregelsatz) erstellt und kann dennoch im Anker verwendet werden.

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 verwendet werden, ebenfalls im Anker definiert werden müssen - es sei denn, du verwendest direkt angegebene Anker. Makros, die im Elternregelsatz definiert wurden, sind von Ankern aus nicht sichtbar.

Da Anker verschachtelt werden können, ist es möglich anzugeben, dass alle Kindanker 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 Kindanker werden in alphabetischer Reihenfolge ausgewertet, verlieren sich aber nicht in Rekursivitäten. Anker werden immer relativ zum Anker ausgewertet, in dem sie definiert worden sind.

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 flushen), haben keine Auswirkung auf andere. Ebenfalls wird das Entfernen eines Ankerpunktes aus dem Hauptregelsatz keinen Anker oder irgendeinen Kindanker 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) geflusht wird und sich kein Kindanker mehr in diesem Anker befindet.

Ankeroptionen

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 Informationen 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 -

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.

Die gleiche Syntax kann auch in direkt angegebenen Ankern verwendet werden.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" in proto tcp {
   anchor proto tcp to port 80 {
      pass from 192.0.2.3
   }
   anchor proto tcp to port 22 {
      pass from $allow
   }
}

Anker manipulieren

Die Manipulation von Ankern wird durch pfctl bewerkstelligt. Sie 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 flushen:

# 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.21 2007/11/12 20:29:59 saad Exp $