[OpenBSD]

[Zurück: Laufzeitoptionen] [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 benutzt wird, um eine dynamische Liste von Adressen vorzuhalten, wird ein Unter-Regelsatz zur Vorhaltung einer dynamischen Gruppe von Regeln genutzt. Ein Unterregelsatz wird an den Hauptregelsatz mit Hilfe eines anchor angehängt.

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 Anhäufung von Regeln, 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 im Hauptregelsatz fortgesetzt, es sei denn das Paket entsprach einer Filterregel mit gesetzter quick-Option, in welchem Fall die Entsprechung als endgültig angesehen, und die Regelverarbeitung sowohl im Anker als auch im Hauptregelsatz abgebrochen wird.

Zum Beispiel:

ext_if = "fxp0"

block on $ext_if
pass  out on $ext_if
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.

Regeln können unter Verwendung der gleichen Syntax und Optionen in einen Anker geladen werden, wie es für das Laden von Regeln in den Hauptregelsatz gilt. 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
pass  out on $ext_if
anchor ssh in on $ext_if proto tcp to 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 Regeln eines Ankers zu leeren:

# pfctl -a ssh -F rules

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

[Zurück: Laufzeitoptionen] [Inhalt] [Weiter: Paket-Queueing und Priorisierung]


[zurück] www@openbsd.org
$OpenBSD: anchors.html,v 1.28 2012/11/02 07:24:05 ajacoutot Exp $