[Vorige: Scrub (Pakket Normalisatie)] [Inhoud] [Volgende: Packet Queueing en Prioritisering]
Sub-regelsets worden aan de hoofd-regelset vastgehangen met behulp van ankers. Er zijn vier types van anchor regels:
Bijvoorbeeld:
ext_if = "fxp0"
block on $ext_if all
pass out on $ext_if all keep state
anchor goodguys
Deze regelset stelt een "standaard weigeren" beleid in op fxp0 voor zowel binnenkomend als buitengaand verkeer. Het verkeer wordt dan met behoud van toestand naar buiten gelaten en een ankerregel met de naam goodguys wordt aangemaakt. Ankers kunnen op twee manieren met regels gevuld worden:
De load regel zorgt ervoor dat pfctl het opgegeven anker opvult door de regels uit een tekstbestand in te lezen. De load regel moet na de anchor regel geplaatst worden. Voorbeeld:
anchor goodguys
load anchor goodguys from "/etc/anchor-goodguys-ssh"
Om regels aan een anker toe te voegen met pfctl kan het volgende type van commando gebruikt worden:
# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
| pfctl -a goodguys -f -
Regels kunnen ook via een tekstbestand bewaard en ingeladen worden:
# 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- en vertalingsregels kunnen in een anker geladen worden met dezelfde syntaxis en opties als regels die in de hoofd-regelset geladen worden. Een valstrik is echter dat gelijk welke macro's die gebruikt worden, ook binnen het anker zelf moeten gedefinieerd worden; macro's die gedefinieerd worden in de ouder-regelset, zijn niet zichtbaar vanuit het anker.
Aangezien ankers genest kunnen worden, is het mogelijk om aan te geven dat alle kind-ankers binnen een gespecificeerd anker geëvalueerd moeten worden:
anchor "spam/*"
Deze syntaxis zorgt ervoor dat elke regel binnen elk anker vastgemaakt aan het spam anker, geëvalueerd wordt. De kind-ankers zullen in alfabetische volgorde geëvalueerd worden maar er wordt niet recursief in afgedaald. Ankers worden altijd geëvalueerd relatief ten opzichte van het anker waarin ze gedefinieerd zijn.
Elk anker, en ook de hoofd-regelset, bestaat afzonderlijk van de andere regelsets. Operaties gedaan op één regelset, zoals het doorspoelen ("flush") van de regels, hebben geen invloed op gelijk welke andere regel. Daarenboven leidt het verwijderen van een ankerpunt uit de hoofd-regelset niet tot de vernietiging van het anker of gelijk welke kind-ankers die aan dat anker vastgemaakt zijn. Een anker wordt niet vernietigd voordat alle regels er uit gespoeld zijn met pfctl(8) en er geen kind-ankers meer zijn binnen het anker.
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
De regels in het anker ssh worden alleen geëvalueerd voor TCP pakketten bestemd voor poort 22 die binnenkomen op fxp0. Regels als de volgende worden dan toegevoegd aan het anchor:
# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -
Dus, zelfs al specificeert de filterregel geen interface, protocol of poort, toch zal de host 192.0.2.10 alleen toegestaan worden via SSH te verbinden omwille van de definitie van de anchor regel.
Om alle regels in het anker met de naam ssh op te sommen:
# pfctl -a ssh -s rules
Om alle filterregels uit hetzelfde anker weg te spoelen ("flush"):
# pfctl -a ssh -F rules
Bekijk voor een volledige lijst van commando's alstublieft pfctl(8).
[Vorige: Scrub (Pakket Normalisatie)] [Inhoud] [Volgende: Packet Queueing en Prioritisering]