[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äß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 }"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.
anchor "goodguys" {
anchor {
pass in proto tcp from 192.0.2.3 to port 80
}
pass in proto tcp from $allow to port 22
}
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.
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
}
}
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]