Tabele są wykorzystywane do przechowywania grup adresów IPv4 i/lub IPv6.
Wyszukiwania w tabelach są bardzo szybkie oraz zużywają mniej pamięci i czasu
procesora niż listy. Z tego powodu, tabela
jest idealna do przechowywania dużej grupy adresów, albowiem czas wyszukiwania
w tabeli z 50,000 adresów jest tylko nieznacznie większy niż w tabeli z 50
adresami.
Tabele mogą być efektywnie stosowane w wielu miejscach:
jako adresy przeznaczenia w opcjach wyznaczania tras route-to,
reply-to i dup-to reguł filtrowania.
Tabele są tworzone albo w
pf.conf albo przy pomocy
pfctl(8).
Konfiguracja
W pf.conf tabele są tworzone przy pomocy dyrektywy table.
Następujące atrybuty mogą być podawane dla każdej tabeli:
const - zawartość tabeli nie może być zmieniona po jej utworzeniu.
Jeśli ten atrybut nie jest podany, narzędzie
pfctl(8) może być wykorzystane do dodania lub usunięcia adresów
z tabeli w dowolnym momencie, nawet podczas pracy w
securelevel(7) równym dwa lub wyższym.
persist - zmusza jądro do przechowywania tabeli nawet, jeśli
żadne reguły nie odnoszą się do niej. Bez tego atrybutu, jądro automatycznie
usunie tabelę wraz z opróżnieniem ostatniej reguły odnoszącej się do tej tabeli.
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any
Adresy mogą być także podawane z użyciem modyfikatora negacji (lub "not")
jak np:
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
Tabela goodguys będzie teraz pasowała do wszystkich adresów w sieci
192.0.2.0/24 poza adresem 192.0.2.5.
Zwróć uwagę, że nazwy tabel zawsze otoczone są nawiasami trójkątnymi
< >.
Tabele mogą być także zainicjowane na podstawie plików tekstowych zawierających
listy adresów IP i sieci:
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
Plik /etc/spammers zwiera listę adresów IP -
i/lub bloki sieciowe CIDR,
każdy w oddzielnej linii. Każda linia zaczynająca się od
# jest traktowana jako komentarz i ignorowana.
Manipulacje za pomocą pfctl
Tabelami można manipulować ręcznie poprzez program
pfctl(8). Dla przykładu, aby dodać wpisy do utworzonej wyżej
tabeli <spammers> można użyć:
# pfctl -t spammers -Tadd 218.70.0.0/16
Komenda ta utworzy tabelę <spammers>, jeśli jeszcze nie istnieje.
Aby wyświetlić adresy z tabeli stosuje się:
# pfctl -t spammers -Tshow
Argument -v może także być użyty wraz z -Tshow, aby
wyświetlić statystyki dla każdego z wpisów. Aby usunąć adres z tabeli
korzysta się z:
# pfctl -t spammers -Tdelete 218.70.0.0/16
Więcej informacji o manipulowaniu tabelami przy pomocy pfctl
znajdziesz czytając stronę manuala
pfctl(8).
Specyfikowanie adresów
Host może być zdefiniowany nie tylko przy pomocy adresu IP ale także przez
podanie jego nazwy. Kiedy nazwa hosta rozwijana jest do adresu IP, wszystkie
otrzymywane w ten sposób adresy IPv4 i IPv6 są wstawiane do tabeli.
Adresy IP mogą być także wprowadzane do tabeli poprzez podanie odpowiedniej
nazwy interfejsu sieciowego lub słowa kluczowego self.
W takim wypadku, wszystkie adresy przypisane do tego interfejsu lub maszyny
(włącznie z interfejsem loopback) będą dodane do tabeli.
Jedynym ograniczeniem przy podawaniu adresu jest to, że adresy
0.0.0.0/0 i 0/0 nie będą działać w przypadku
tabel. Alternatywą jest wpisywanie tego adresu za każdym razem ręcznie lub
skorzystanie z makra.
Dopasowywanie adresu
Wyszukanie adresu w tabeli zwróci najlepiej pasujący wpis.
Pozwala to na tworzenie takich tabel jak ta:
block in on dc0 all
pass in on dc0 from <goodguys> to any
Adres każdego pakietu przychodzącego na interfejsie dc0 będzie
porównywany z tabelą
<goodguys>:
172.16.50.5 - najbardziej trafny jest 172.16.0.0/16; pakiet pasuje do
tabeli i zostanie przepuszczony
172.16.1.25 - najbardziej trafny jest !172.16.1.0/24; pakiet pasuje do
wpisu w tabeli, ale wpis ten jest zanegowany (używa modyfikatora "!");
pakiet nie pasuje do tabeli i będzie zablokowany
172.16.1.100 - jest to dokładnie 172.16.1.100; pakiet pasuje do
tabeli i zostanie przepuszczony
10.1.4.55 - pakiet nie pasuje do tabeli i będzie zablokowany