[OpenBSD]

[Wstecz: Pule adresów i kierowanie ruchem] [Spis treści] [Dalej: Logowanie]

PF: Znakowanie pakietów (Policy Filtering)


Spis treści


Wprowadzenie

"Packet tagging" jest sposobem oznaczania pakietów poprzez nadanie im wewnętrznego identyfikatora, który może być wykorzystany w późniejszej translacji lub filtrowaniu danego pakietu. Wprowadzenie znakowania umożliwia stworzenie "zaufania" pomiędzy interfejsami oraz określenie sposobu w jaki pakiety zostały potraktowane przez regułki NAT. Dzięki taggowaniu pakietów możliwe staje się odejście od filtrowania opartego na regułkach i przejście do filtrowania bazującego na polityce ruchu.

Przypisywanie znaczników do pakietów

Dodanie znacznika (ang. tag) do pakietu możliwa słowo kluczowe tag:
pass in on $int_if all tag INTERNAL_NET keep state

Znacznik INTERNAL_NET zostanie dodany do każdego pakietu, który pasuje do powyższej reguły.

Znacznik może być także przypisany przy użyciu makr. Na przykład:

name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state

Istnieje także zestaw predefiniowanych makr gotowych do użycia.

Powyższe makra rozwijane są w trakcie ładowania zestawu reguł, a NIE w trakcie ich działania.

Packet tagging odbywa się wg następujących zasad:

Rozważmy poniższy zestaw regułek:

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
        INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

Obok regułek filtrujących znaczniki mogą być także dodawane do pakietów przez regułki NAT, czyli nat, rdr i binat, poprzez użycie słowa kluczowego tag.

Wykorzystanie zastosowanych znaczników

Aby sprawdzić czy pakiet posiada znacznik przypisany mu przez jedną z poprzednich reguł należy użyć klauzuli tagged:
pass out on $ext_if tagged INT_NET keep state

Pakiety chcące opuścić interfejs $ext_if niezależnie od konieczności spełnienia warunków regułki muszą posiadać znacznik INT_NET. Warunek nie posiadania danego znacznika oznacza się operatorem !:

pass out on $ext_if ! tagged WIFI_NET keep state

Reguły transponujące (nat/rdr/binat) także mogą korzystać z klucza tagged do dopasowywania pakietów.

Polityka filtrowania

Polityka filtrowania to zupełnie inne podejście do budowania zestawu reguł filtrujących. Polityka określa jaki zestaw pakietów ma być wykorzystany dla danego rodzaju ruchu sieciowego, a tym samym jakie datagramy mają zostać przepuszczone, a jakie zablokowane. W odróżnieniu od tradycyjnego sposobu filtrowania ruchu, polityka filtrowania wstępnie klasyfikuje pakiety na podstawie źródłowego/docelowego adresu IP, numeru portu, protkołu, itd. Oto przykładowa polityka filtrowania:

Proszę zauważyć, że przedstawiona powyżej polityka obejmuje cały ruch sieciowy przechodzący przez firewall. W nawiasach podane zostały znaczniki przypisywane dla określonego ruchu.

Mając określoną politykę filtrowania niezbędne będzie teraz napisanie odpowiednich regułek filtrujących oraz NAT, które uwzględniać będą powyższe założenia i odpowiednio przypisywać znaczniki.

rdr on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state

Po zdefiniowaniu regułek przychodzi pora na określenie jaki ruch może zostać przepuszony, a jak ma być zablokowany.

pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

Posiadając gotowy zestaw reguł, wprowadzanie wielu zmian odbywa się tylko przez dodanie lub odjęcie regułek klasyfikujących ruch. Na przykład jeśli zostanie dodany serwer POP3/SMTP do DMZ, wystarczy dodać regułkę podobną do tej:

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
   tag INET_DMZ keep state

Ruch poczty elektronicznej zostanie przepuszczony jako, że należy do polityki INET_DMZ.

Kompletny zestaw reguł:
# makra
int_if  = "dc0"
dmz_if  = "dc1"
ext_if  = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"

table <spamd> persist file "/etc/spammers"

# klasyfikacja -- podział pakietów na podstawie polityki filtrowania
# określonej dla firewalla.
rdr on $ext_if proto tcp from <spamd> to port smtp \
    tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state 
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
    tag INET_DMZ keep state 

# wprowadzenie w życie -- przepuszczanie/blokowanie oparte na polityce
# filtrowania określonej dla firewalla.
pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state 

Znaczniki dla ramek ethernetowych

Znakowanie może być także przeprowadzone na poziome ramek ethernetowych jeśli maszyna spełniająca rolę filtra pakietów jest jednocześnie mostem sieciowym (bridge(4)). Podczas tworzenia regułek dla bridge(4) można wykorzystać klauzulę tag, dzięki czemu PF będzie mógł filtrować pakiety na podstawie adresu MAC źródłowego lub docelowego. Reguły dla mostów siecowych tworzy się narzędziem brconfig(8). Oto przykład:
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1

Aby wykorzystać znacznik USER1 można w pliku pf.conf umieścić poniższą regułkę:

pass in on fxp0 tagged USER1

[Wstecz: Pule adresów i kierowanie ruchem] [Spis treści] [Dalej: Logowanie]


[back] www@openbsd.org
$OpenBSD$