[OpenBSD]

[Vorige: Scrub (Pakket Normalisatie)] [Inhoud] [Volgende: Packet Queueing en Prioritisering]

PF: Ankers


Inhoudsopgave


Inleiding

Bovenop de hoofd-regelset, kan PF ook sub-regelsets evalueren. Aangezien sub-regelsets "on the fly" kunnen gemanipuleerd worden door gebruik van pfctl(8), vormen ze een handige manier om dynamisch een actieve regelset te wijzigen. Zoals een a tabel gebruikt wordt om een dynamische lijst van adressen te bevatten, wordt een sub-regelset gebruikt om een dynamische set van filter, nat, rdr en binat regels te bevatten.

Sub-regelsets worden aan de hoofd-regelset vastgehangen met behulp van ankers. Er zijn vier types van anchor regels:

Ankers kunnen genest zijn, wat toelaat dat regelsets samengeketend worden. Ankerregels zullen geëvalueerd worden relatief ten opzichte van het anker waarin ze geladen worden. Bijvoorbeeld, ankerregels in de hoofd-regelset zullen anker vastknopingspunten creëren met de hoofd-regelset als hun ouder, en ankerregels geladen vanuit bestanden met de load anchor opdracht zullen ankerpunten creëren met dat anker als hun ouder.

Ankers

Een anker is een verzameling van filter- en/of vertalingsregels, tabellen en andere ankers waaraan een naam toegekend is. Wanneer PF een anchor regel tegenkomt in de hoofd-regelset, zal het de regels bevat binnen het ankerpunt evalueren zoals het de regels in de hoofd-regelset evalueert. De verwerking zal vervolgens verdergaan in de hoofd-regelset tenzij het pakket overeenstemt met een filterregel die de quick optie gebruikt of met een vertalingsregel binnen het anker, in welk geval de overeenstemming als definitief zal beschouwd worden en de evaluatie van regels in zowel het anker als de hoofd-regelsets zal afgebroken worden.

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 }"

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

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.

Ankeropties

Optioneel kunnen anchor regels interface, protocol, bron- en bestemmingsadres, markering ("tag"), enz. specificeren met dezelfde syntaxis als filterregels. Wanneer zulke informatie gegeven wordt, worden anchorregels alleen verwerkt als het pakket overeenstemt met de definitie van de anchor regel. Bijvoorbeeld:
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
   }
}

Ankers Manipuleren

Manipulatie van ankers gebeurt via pfctl. Het kan gebruikt worden om regels toe te voegen aan en te verwijderen uit het anker zonder de hoofd-regelset te herladen.

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]


[terug] www@openbsd.org
$OpenBSD: anchors.html,v 1.10 2007/12/16 17:18:35 tobias Exp $