Een tabel wordt gebruikt om een groep van IPv4 en/of IPv6 adressen te
bevatten. Opzoekingen in een tabel zijn heel snel en verbruiken minder
geheugen en processortijd dan lijsten.
Om deze reden is een tabel ideaal om een grote groep adressen te bevatten
aangezien de opzoekingstijd in een tabel die 50.000 adressen bevat slechts
iets langer is dan voor ййn die 50 adressen bevat. Tabellen kunnen op de
volgende manieren gebruikt worden:
bestemmingsadres in route-to, reply-to en
dup-to filterregelopties.
Tabellen worden aangemaakt ofwel in
pf.conf ofwel met
pfctl(8).
Configuratie
In pf.conf worden tabellen aangemaakt met de table
instructie. De volgende kenmerken mogen voor elke tabel gespecificeerd worden:
const - de inhoud van de tabel kan niet gewijzigd worden zodra
de tabel is aangemaakt. Wanneer dit kenmerk niet gespecificeerd wordt, kan
pfctl(8) gebruikt worden om op elk ogenblik adressen toe te voegen aan
of te verwijderen uit de tabel, zelfs wanneer men met een
securelevel(7) van twee of hoger draait.
persist - zorgt ervoor dat de kernel de tabel in het geheugen
houdt zelfs als er geen regels naar verwijzen. Zonder dit kenmerk zal de
kernel automatisch de tabel verwijderen wanneer de laatste regel die ernaar
verwijst doorgespoeld ("flushed") wordt.
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any
Adressen kunnen ook als volgt gespecificeerd worden met een negatie (of "not")
door ze te laten voorafgaan door een !
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
De goodguys tabel zal nu overeenstemmen met alle adressen in het
192.0.2.0/24 netwerk behalve 192.0.2.5.
Merk op dat tabelnamen altijd besloten zijn in < > haakjes.
Tabellen kunnen ook gevuld worden vanuit tekstbestanden die een lijst
met IP adressen en netwerken bevatten:
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
Het bestand /etc/spammers zou een lijst van IP adressen
en/of CIDR
netwerkblokken bevatten, ййn per lijn.
Gelijk welke lijn die begint met # wordt behandeld als commentaar
en wordt genegeerd.
Manipulatie met pfctl
Tabellen kunnen "on the fly" gemanipuleerd worden met
pfctl(8). Om
bijvoorbeeld entries toe te voegen aan de <spammers> tabel die hoger
aangemaakt werd:
# pfctl -t spammers -T add 218.70.0.0/16
Dit zal ook de <spammers> tabel aanmaken als die nog niet bestaat.
Om de adressen in een tabel op te sommen:
# pfctl -t spammers -T show
Het -v argument kan ook gebruikt worden bij -Tshow om
statistieken voor elke entry in de tabel te tonen. Om adressen uit een
tabel te verwijderen:
# pfctl -t spammers -T delete 218.70.0.0/16
Lees voor meer informatie over het bewerken van tabellen met
pfctl alstublieft de
pfctl(8) man pagina.
Adressen Specificeren
Naast het gespecificeerd zijn met IP adres, kunnen hosts ook gespecificeerd
worden met hun hostname. Wanneer de hostname vertaald kan worden naar een IP
adres, worden alle resulterende IPv4 en IPv6 adressen in de tabel geplaatst.
IP adressen kunnen ook in een tabel ingegeven worden door een geldige
interfacenaam of het self sleutelwoord te specificeren.
De tabel zal dan alle IP adressen bevatten die respectievelijk toegekend
zijn aan die interface of aan de machine (loopback adressen inbegrepen).
Eйn beperking bij het specificeren van adressen is dat 0.0.0.0/0
en 0/0 niet zullen werken in tabellen.
Het alternatief is om dat adres hard te coderen of een
macro te gebruiken.
Adres Overeenstemming
Een adresopzoeking in een tabel zal de meest nauw overeenstemmende entry
teruggeven. Dit laat toe tabellen aan te maken zoals:
block in on dc0 all
pass in on dc0 from <goodguys> to any
Gelijk welk pakket dat binnenkomt via dc0 zal zijn bronadres
zien overeenstemmen in de tabel <goodguys>:
172.16.50.5 - nauwste overeenstemming is 172.16.0.0/16; pakket stemt
overeen met de tabel en zal doorgelaten worden
172.16.1.25 - nauwste overeenstemming is !172.16.1.0/24; pakket stemt
overeen met een entry in de tabel maar die entry wordt ontkend (gebruikt de
"!" modifier); pakket stemt niet overeen met de tabel en zal geblokkeerd
worden
172.16.1.100 - stemt precies overeen met 172.16.1.100; pakket stemt
overeen met de tabel en zal doorgelaten worden
10.1.4.55 - stemt niet overeen met de tabel en zal geblokkeerd worden