[Wstecz: Scrub (normalizacja pakietów)] [Spis treści] [Dalej: Kolejkowanie]
Podzestawy reguł są dołączane do głównego zestawu reguł przy pomocy zakotwiczeń (ang. anchors). Są cztery typy reguł zakotwiczeń anchor:
Na przykład:
ext_if = "fxp0"
block on $ext_if all
pass out on $ext_if all keep state
anchor goodguys
Ten zestaw reguł sankcjonuje politykę domyślnego blokowania na interfejsie fxp0 zarówno dla przychodzącego jak i wychodzącego ruchu. Ruch jest następnie przepuszczany na zewnątrz wraz z śledzeniem stanu połączenia, a także tworzone jest zakotwiczenie nazwane goodguys. Zakotwiczenia mogą być wypełniane regułami na dwa sposoby:
Reguła load powoduje, że pfctl wypełnia regułami dane zakotwiczenie i nazwany zestaw reguł poprzez ich odczyt z pliku tekstowego. Reguła load musi być umieszczona po regule anchor. Na przykład:
anchor goodgays
load anchor goodguys:ssh from "/etc/anchor-goodguys-ssh"
Aby dodać reguły do zakotwiczenia przy pomocy pfctl, może zostać użyta komenda skonstruowana podobnie do poniższej:
# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
| pfctl -a goodguys/ssh -f -
Reguły mogą być także zapisywane i odczytywane z pliku tekstowego:
# 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
Aby załadować reguły zakotwiczeń bezpośrednio z zestawu reguł filtra, dołącz reguły zakotwiczeń zawierając je w nawiasach klamrowych:
anchor "goodguys" {
pass in proto tcp from 192.168.2.3 to port 22
}
Zakotwiczenia wprowadzone bezpośrednio mogą także zawierać inne zakotwiczenia.
allow = "{ 192.0.2.3 192.0.2.4 }"W zakotwiczeniach bezpośrednich nazwa zakotwidzenia jest opcjonalna. Zwróć uwagę, że zagnieżdżone zakotwiczenia w powyższym przykładzie nie posiadają nazw. Ponadto zwracamy uwagę na to jak makro $allow zostało zdefiniowane poza zaktowiczeniem (w głównym zestawie reguł) i później użyte wewnątrz zakotwiczenia.
anchor "goodguys" {
anchor {
pass in proto tcp from 192.0.2.3 to port 80
}
pass in proto tcp from $allow to port 22
}
Reguły filtrujące i translacyjne mogą być załadowane z nazwanego zestawu reguł z wykorzystaniem tych samych opcji i składni, co przy ładowaniu z głównego zestawu reguł. Z zastrzeżeniem, o ile nie używasz zakotwidzeń bezpośrednio, iż wykorzystywane makra muszą być zdefiniowane w danym zestawie, a makra z głównego zestawu reguł nie będą widoczne.
Odkąd zakotwiczenie może być gniazdem, możliwe jest sprecyzowanie, że wszystkie potomne zakotwiczenia wewnątrz sprecyzowanego, będą oceniane:
anchor "spam/*"
Ta składnia powoduje, że każda reguła wewnątrz każdego zakotwiczenia podłączonego do zakotwiczenia spam będzie oceniana. Zakotwiczenia potomne będą szacowane w kolejności alfabetycznej jednak nie będą schodziły rekurencyjnie. Zakotwiczenia zawsze będą oceniane względem zakotwiczenia w którym zostały zdefiniowane.
Każde zakotwiczenie , podobnie jak i główny zestaw reguł funkcjonuje niezależnie od innych zestawów. Operacje wykonywane na pojedynczym zestawie, takie jak wyczyszczenie (ang. flush), nie mają wpływu na pozostałe zestawy reguł. Ponad to, usunięcie zakotwiczenia z głównego zestawu reguł nie niszczy zakotwiczenia, ani żadnego zakotwiczenia potomnego, który jest do niego podpięty. Zakotwiczenie nie jest niszczone aż do momentu wyczyszczenia wszystkich reguł przy pomocy pfctl(8), w sytuacji w której nie istnieją żadne zakotwiczenia potomne wewnątrz.
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
Reguły zakotwiczenia ssh są przetwarzane jedynie dla pakietów TCP o docelowym porcie 22, i które nadchodzą przez fxp0. Reguły są następnie dodawane do zakotwiczenia anchor w następujący sposób:
# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -
Mimo iż reguły filtrujące nie precyzują interfejsu, protokołu czy portu, jedynie host 192.0.2.10 będzie miał prawo łączyć się przy pomocy SSH ze względu na definicje zakotwiczenia anchor.
Taka sama składnia może być zastosowana do zakotwiczeń bezpośrednich.
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
}
}
Aby wyświetlić wszystkie reguły zakotwiczenia nazwanego ssh:
# pfctl -a ssh -s rules
Aby wyczyścić wszystkie reguły z tego samego zakotwiczenia:
# pfctl -a ssh -F rules
Pełna lista komend znajduje się na stronach man pfctl(8).
[Wstecz: Scrub (normalizacja pakietów)] [Spis treści] [Dalej: Kolejkowanie]