[OpenBSD]

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

PF: Zakotwiczenia i nazwane zestawy (pod)reguł


Spis treści


Wprowadzenie

Poza głównym zestawem reguł, PF może przetwarzać także podzestawy. Ponieważ podzestawy mogą być modfikowane 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:

Jedynie główny zestaw reguł może zawierać dyrektywy anchor.

Nazwane zestawy reguł

Nazwany zestaw reguł, to grupa reguł filtrujących i/lub translacji, które mają przyporządkowaną nazwę. Punkty zakotwiczenia anchor w głównym zestawie reguł mogą zawierać wiele takich zestawów reguł. Gdy PF natrafi na jakąś regułę anchor, zostaną rozwinięte w kolejności alfabetycznej, zgodnie z ich nazwami, wszystkie dołączone do niego zestawy reguł. 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 dla zarówno 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. Na przykład:

load anchor goodguys:ssh from "/etc/anchor-goodguys-ssh"

Podczas ładowania głównego zestawu reguł, reguły zawarte w pliku /etc/anchor-goodguys-ssh zostaną załadowane do nazwanego zestawu reguł ssh podpiętego do zakotwiczenia goodguys.

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 -

Dodaje ona regułę pass do zestawu nazwanego ssh dołączonego do zakotwiczenia goodguys. PF dokona następnie porównania tej reguły (a także każdej kolejnej, dodanej reguły filtrującej) z chwilą, gdy dotrze do linii anchor goodguys w głównym zestawie reguł.

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:www -f /etc/anchor-goodguys-www

Ostatnia komenda powoduje załadowanie reguł z pliku /etc/anchor-goodguys-www do nazwanego zestawu reguł www w zakotwiczeniu goodguys.

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, iż wykorzystywane makra muszą być zdefiniowane w danym zestawie, a makra głównego zestawu reguł nie będą widoczne w nazwanych zestawach reguł.

Każdy nazwany zestaw reguł, 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 nazwanego zestawu reguł, który jest do niego podpięty. Nazwany zestaw reguł nie jest niszczony aż do momentu wyczyszczenia wszystkich reguł przy pomocy pfctl(8). Kiedy punkt zakotwiczenia nie posiada żadnego, podpiętego zestawu także jest niszczony.

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:allowed -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.

Manipulowanie nazwanymi zestawami reguł

Manipulowanie nazwanymi zestawami reguł 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 zestawu allowed podpiętego do zakotwiczenia ssh:

# pfctl -a ssh:allowed -s rules

Aby wyczyścić wszystkie reguły z tego samego zestawu:

# pfctl -a ssh:allowed -F rules

Gdy nazwa zestawu jest pominięta, akcja odnosi się do wszystkich reguł w zakotwiczeniu.

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
Originally [OpenBSD: anchors.html,v 1.10 ]
$Translation: anchors.html,v 1.7 2004/01/12 17:37:45 pl-team Exp $
$OpenBSD: anchors.html,v 1.5 2004/01/16 21:01:34 jufi Exp $