[Zurück: Scrub (Paketnormalisierung)] [Inhalt] [Weiter: Paket-Queueing und Priorisierung]
Unterregelsätze werden mit Hilfe von Ankern an den Hauptregelsatz angehängt. Es gibt vier Typen dieser Anker-Regeln:
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.
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.
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]