[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.
- $if - Das Interface
- $srcaddr - Quell-IP-Adresse
- $dstaddr - Ziel-IP-Adresse
- $srcport - Die Quell-Port-Angabe
- $dstport - Die Ziel-Port-Angabe
- $proto - Das Protokoll
- $nr - Die Regelnummer
Die Makros werden während dem Laden des Regelsatzes erweitert und
NICHT zur Laufzeit.
Das Markieren folgt diesen Regeln:
- Markierungen sind standhaft. Sobald eine Markierung an einem Paket
durch eine zutreffende Regel angebracht wurde, kann sie niemals mehr
entfernt werden. Sie kann jedoch mit einer anderen Markierung ersetzt
werden.
- Wegen der Standhaftigkeit der Markierung kann ein Paket eine
Markierung selbst dann haben, wenn die letzte zutreffende Regel nicht
das tag-Schlüsselwort verwendet hat.
- Einem Paket wird immer nur maximal eine Markierung gleichzeitig
zugewiesen.
- Markierungen sind interne Identifizierer. Markierungen werden
nicht über das Kabel gesendet.
- Der Name einer Markierung kann bis zu 63 Zeichen lang sein. In
OpenBSD 4.0 und älteren Versionen war der Name auf 15 Zeichen begrenzt.
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
- Paketen, die durch $int_if kommen, werden eine Markierung
von INT_NET durch Regel #1 zugewiesen.
- TCP-Paketen, die durch $int_if kommen und für Port 80
bestimmt sind, werden eine Markierung von INT_NET durch Regel
#1 zugewiesen. Diese Markierung wird dann mit der
INT_NET_HTTP-Markierung durch Regel #2 ersetzt.
- Pakete, die durch $int_if von 192.168.1.5 kommen, werden
je nach Zustand markiert. Wenn das Paket für TCP-Port 80 bestimmt ist,
trifft es auf Regel #2 zu und wir mit INT_NET_HTTP markiert.
Ansonsten trifft das Paket auf Regel #3 zu, wird aber weiterhin mit
INT_NET markiert sein. Da das Paket auf Regel #1 zutrifft, wird
die INT_NET-Markierung angebracht und nicht wieder entfernt; es
sei denn, eine spätere zutreffende Regel markiert das Paket erneut
(das ist mit der »Klebrigkeit« einer Markierung gemeint).
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:
- Verkehr vom internen LAN zum Internet ist erlaubt (LAN_INET) und
muss übersetzt werden (LAN_INET_NAT)
- Verkehr vom internen LAN zur DMZ ist erlaubt (LAN_DMZ)
- Verkehr vom Internet zu Servern in der DMZ ist erlaubt (INET_DMZ)
- Verkehr vom Internet, der zum
spamd(8) umgeleitet wird, ist erlaubt (SPAMD)
- Jeglicher andere Verkehr wird geblockt
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]
www@openbsd.org
$OpenBSD: tagging.html,v 1.21 2011/11/27 16:55:44 ajacoutot Exp $