[OpenBSD]

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

PF: Znakowanie pakietów


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 filtrownia 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łki. Proszę zwrócić uwagę na zastosowanie klauzuli keep state; keep state (lub modulate state/ synproxy state) musi być użyte w regułkach pass, które pozostawiają tag w pakiecie.

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

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 zró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ęde 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

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 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łąd 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 elektornicznej 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

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 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/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
Originally [OpenBSD: tagging.html,v 1.2 ]
$Translation: tagging.html,v 1.1 2004/02/07 19:15:52 pl-team Exp $
$OpenBSD: tagging.html,v 1.1 2004/02/08 12:16:38 jufi Exp $