[OpenBSD]

[Wstecz: Scrub (normalizacja pakietów)] [Spis treści] [Dalej: Kolejkowanie]

PF: Zakotwiczenia


Spis treści


Wprowadzenie

Poza głównym zestawem reguł, PF może przetwarzać także podzestawy. Ponieważ podzestawy mogą być modyfikowane w trakcie działania przy pomocy pfctl(8), mogą stanowić wygodny sposób dynamicznego zarządzania aktywnym zestawem reguł. Podczas gdy tabele są wykorzystywane do przechowywania dynamicznych list adresów, podzestawy reguł mogą przechowywać dynamiczne zestawy reguł filtrujących, nat, rdr, i binat.

Podzestawy reguł są dołączane do głównego zestawu reguł przy pomocy zakotwiczeń (ang. anchors). Są cztery typy reguł zakotwiczeń anchor:

Zakotwiczenia mogą być zagnieżdżane co pozwala by zestawy podreguł wiązały się wzajemnie. Reguły zakotwiczeń będą oceniane względem zakotwiczenia w którym zostały załadowane. Na przykład, zakotwiczone zestawy reguł w głównym zestawie reguł utworzą punkty zakotwiczenia w tym zestawie, jako zestawie nadrzędnym, a reguły zakotwiczeń w podpiętych z dyrektywą load anchor plikach reguł utworzą punkty zakotwiczenia w danym podzestawie, jako ich zestawie nadrzędnym.

Zakotwiczenia

Zakotwiczona to kolekcje reguł filtrujących, translacji, tabel i innych zakotwiczeń, które mają przyporządkowaną nazwę. Gdy PF natrafi na jakąś regułę anchor w głównym zestawie reguł, w momencie gdy jest przetwarzany główny zestaw reguł zostaną przetworzone wszystkie zawarte w nim reguły. Porównywanie reguł będzie następnie kontynuowane, chyba że pakiet zostanie dopasowany do reguły korzystającej z opcji quick lub reguły translacyjnej w tym zakotwiczeniu, kiedy to dopasowanie będzie uznane za ostateczne i spowoduje zaniechanie dalszego porównywania reguł w samym, zakotwiczeniu jak i głównym zestawie reguł.

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

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

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.

Opcje zakotwiczeń

Opcjonalnie, reguły anchor mogą precyzować interfejs sieciowy, protokół, adres źródłowy i docelowy itp przy pomocy tej samej składni co reguły filtrujące. Jeśli takie informacje są podawane, reguły anchor są przetwarzane jedynie gdy pakiet pasuje do definicji danej reguły anchor. Na przykład:
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
   }
}

Manipulowanie zakotwiczeniami

Manipulowanie zakotwiczeniami odbywa się poprzez pfctl. Program ten może być wykorzystywany do dodawania i usuwania reguł z zestawu bez konieczności przeładowywania głównego zestawu reguł.

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]


[wstecz] www@openbsd.org
$OpenBSD$