[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 keep state

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

Zusätzlich zum Anbringen der Markierungen durch Filterregeln können nat-, rdr- und binat-Übersetzungsregeln ebenfalls durch das tag-Schlüsselwort Markierungen an Paketen anbringen.

Nach angebrachte Markierungen suchen

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

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 keep state

Übersetzungsregeln (nat/rdr/binat) können ebenfalls das tagged-Schlüsselwort nutzen, um auf Pakete zutreffen zu können.

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 Vekehrstyp 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.

Filter- und Übersetzungs-Regeln werden nun geschrieben, um die Pakete in die Richtlinie zu klassifizieren.

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 tagged LAN_INET_NAT -> ($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

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

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

Nun, da der gesamte Regelsatz aufgesetzt ist, sind Änderungen nur noch eine Sache von Klassifkationsregel-Ä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 keep state

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 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 tagged LAN_INET_NAT -> ($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 # richtlinien-erzwingung - lässt durch/blockt basierend auf der # definierten firewall-richtlinie 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

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 brconfig(8)-Kommandos erzeugt. Beispiel:
# brconfig 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.19 2007/11/12 20:29:59 saad Exp $