[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 drie 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
Om regels rechtstreeks vanuit de hoofdregelset in te laden, kunnen de ankerregels omsloten worden in een blok afgebakend door accolades:
anchor "goodguys" {
pass in proto tcp from 192.168.2.3 to port 22
}
Inline ankers kunnen ook meerdere ankers bevatten.
allow = "{ 192.0.2.3 192.0.2.4 }"Bij inline ankers wordt de naam van het anker optioneel. Merk op hoe het geneste anker in het bovenstaande voorbeeld geen naam heeft. Merk ook op hoe de macro $allow aangemaakt wordt buiten het anker (in de hoofdregelset) en vervolgens binnen het anker gebruikt wordt.
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- 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, tenzij u inline ankers gebruikt, 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.
Dezelfde syntaxis kan toegepast worden op inline ankers.
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
}
}
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]