[OpenBSD]

[Zurück: Adress-Pools und Load Balancing] [Contents] [Weiter: Aufzeichnen]

PF: Pakete markieren (Richtlinienfilterung)


Inhaltsverzeichnis


Einführung

Paket-Markierung ist ein Weg, um Pakete mit einem internen Identifizierer zu markieren, der später als Kriterie in Filter- und Übersetzungs-Regeln genutzt werden kann. Mit dem Markieren ist es möglich, Dinge zu tun wie zum Beispiel das Erstellen von ,trusts' zwischen Interfaces und das Herausfinden, ob Pakete von Übersetzungsregeln bearbeitet worden sind. Es ist ebenfalls möglich, Regel-basiertes Filtern zu entfernen und mit Richtlinien-basiertem Filtern zu beginnen.

Markierungen den Paketen zuweisen

Um eine Markierung einem Paket zuzuweisen, verwende das tag-Schlüsselwort:
pass in on $int_if all tag INTERNAL_NET keep state

Die Markierung INTERNAL_NET wird zu jedem Paket hinzugefügt, das der oben genannten Regel entspricht.

Eine Markierung kann ebenfalls unter der Verwendung eines Makros zugewiesen werden. Zum Beispiel:

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

Dort gibt es einen Satz an vordefinierten Makros, welche verwendet werden können.

Die Makros werden während dem Laden des Regelsatzes erweitert und NICHT zur Laufzeit.

Das Markieren folgt diesen Regeln:

Nimm den folgenden Regelsatz als ein Beispiel.

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

Nach angebrachte Markierungen suchen

Um nach zuvor angebrachten Markierungen zu suchen, verwende das tagged-Schlüsselwort:
pass out on $ext_if tagged INT_NET

Ausgehende Pakete von $ext_if müssen mit der INT_NET-Markierung markiert sein, damit sie die oben angegebene Regel passieren können. Invertiertes Zutreffen kann ebenfalls mit Hilfe des !-Operators durchgeführt werden:

pass out on $ext_if ! tagged WIFI_NET

Richtlinienfilterung

Richtlinien-Filterung schlägt einen anderen Weg ein als es das Schreiben von Filter-Regelsätzen tut. Eine Richtlinie wird so definiert, dass sie sagt, welche Regeln für welchen Verkehrstyp gesetzt werden, und welcher Typ durchgelassen und welcher geblockt wird. Pakete werden dann in die Richtlinie klassifiziert, basierend auf den traditionellen Kriterien der Quell/Ziel-IP-Adresse/Port, Protokoll etc. Betrachte zum Beispiel die folgende Firewall-Richtlinie:

Beachte, wie die Richtlinie den gesamten Verkehr abdeckt, der durch die Firewall gelangen wird. Das Objekt in Klammern weist auf die Markierung hin, die für dieses Richtlinien-Objekt verwendet wird.

Regeln müssen nun geschrieben werden, um die Pakete in die Richtlinie zu klassifizieren.

block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025

Nun sind die Regeln, die die Richtlinie definieren, gesetzt.

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

Nun, da der gesamte Regelsatz aufgesetzt ist, sind Änderungen nur noch eine Sache von Klassifikationsregel-Änderungen. Wenn zum Beispiel ein POP3/SMTP-Server zur DMZ hinzugefügt wird, ist es notwendig, eine Klassifkationsregel für POP3- und SMTP-Verkehr wie folgt hinzuzufügen:

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

E-Mail-Verkehr wird nun als Teil des INET_DMZ-Richtlinien-Eintrages durchgelassen.

Der komplette Regelsatz:
# macros
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"

# klassifizierung - klassifiziert pakete basierend auf der definierten
# firewall-richtlinie
block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025
# richtlinien-erzwingung - lässt durch/blockt basierend auf der # definierten firewall-richtlinie pass in quick on $ext_if tagged SPAMD pass out quick on $ext_if tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ

Ethernet-Frames markieren

Das Markieren kann auf der Ethernet-Ebene stattfinden, wenn die Maschine, die das Markieren/Filtern durchführt, ebenfalls als bridge(4) eingesetzt wird. Durch das Erzeugen von bridge(4)-Filterregeln, die das tag-Schlüsselwort verwenden, kann PF dazu gebracht werden, basierend auf der Quell- oder Ziel-MAC-Adresse zu filtern. Bridge(4)-Regeln werden anhand des ifconfig(8)-Kommandos erzeugt. Beispiel:
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1

Und dann in pf.conf:

pass in on fxp0 tagged USER1

[Zurück: Adress-Pools und Load Balancing] [Inhalt] [Weiter: Aufzeichnen]


[zurück] www@openbsd.org
$OpenBSD: tagging.html,v 1.21 2011/11/27 16:55:44 ajacoutot Exp $