[OpenBSD]

[Zurück: Verkehr-Umleitung (Port-Weiterleitung)] [Inhalt] [Weiter: Laufzeit-Optionen]

PF: Abkürzungen zum Erzeugen von Regelsätzen


Inhaltsverzeichnis


Einführung

PF bietet viele Wege, um einen Regelsatz zu vereinfachen. Viele gute Beispiele sind die Verwendungen von Makros und Listen. Zusätzlich bietet die Regelsatz-Sprache, bzw. -Grammatik, ebenfalls einige Abkürzungen zum Vereinfachen des Regelsatzes. Eine Bauernregel lautet: je einfacher ein Regelsatz ist, umso einfacher kann er verstanden und verwaltet werden.

Makros verwenden

Makros sind nützlich, da sie eine Alternative zum festen Eintragen der Adressen, Portnummern, Interfacenamen etc. in den Regelsatz darstellen. Hat sich die IP-Adresse eines Servers geändert? Kein Problem, aktualisiere einfach den Makro; keine Notwendigkeit, sich mit den Filterregeln rumzuschlagen, für die so viel Zeit und Energie geopfert hast, um sie so perfekt wie möglich für deine Ansprüche zu machen.

Eine häufige Konvention in PF-Regelsätzen ist, einen Makro für jedes Netzwerk-Interface zu definieren. Wenn eine Netzwerkkarte jemals mit einer anderen ersetzt werden muss, die einen anderen Treiber verwendet, zum Beispiel eine 3Com- mit einer Intel-Karte ausgetauscht wird, kann der Makro aktualisiert werden und die Filterregeln werden so funktionieren, wie bisher. Ein anderer Vorteil fällt auf, wenn der gleiche Regelsatz auf mehreren Maschinen installiert wird. Einige Maschinen werden unterschiedliche Netzwerkkarten haben und das Verwenden von Makros, um die Netzwerk-Interfaces zu definieren, erlaubt es den Regelsätzen, mit minimalen Änderungen installiert zu werden. Makros verwenden, um Informationen in einem Regelsatz zu definieren, die sich ändern werden, wie zum Beispiel Portnummern, IP-Adressen und Interfacenamen, ist empfohlene Praxis.

# definiere Makros für jedes einzelne Netzwerk-Interface
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

Eine andere übliche Konvention ist das Verwenden von Makros, um IP-Adressen und Netzwerkblöcke zu definieren. Dies kann die Instandhaltung eines Regelsatzes sehr vereinfachen, wenn sich IP-Adressen ändern.

# define our networks
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

Wenn das interne Netzwerk jemals erweitert wird oder in einen anderen IP-Block umnummeriert wird, kann der Makro aktualisiert werden:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

Sobald der Regelsatz neugeladen wurde, funktioniert alles wieder wie zuvor.

Listen verwenden

Lass uns nun einen Blick auf einen guten Satz von Regeln werfen, um RFC 1918- Adressen in unserem Regelsatz zu handhaben, die nicht im Internet rumschwirren sollten, und wenn sie es tun, versuchen sie normalerweise, Ärger zu machen:
block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

Werfe nun einen Blick auf die folgende Vereinfachung:

block in  quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
   172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
   192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

Der Regelsatz wurde von acht Zeilen auf zwei reduziert. Es wird sogar noch besser, wenn Makros in Verbindung mit einer Liste verwendet werden:

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
   10.0.0.0/8 }"
ExtIF = "tl0"
block in  quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

Denke daran, dass Makros und Listen die pf.conf-Datei vereinfachen, aber Zeilen durch pfctl(8) tatsächlich aber in mehrere Regeln erweitert werden, sodass das oben gezeigte Beispiel tatsächlich in folgende Regeln erweitert wird:

block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 10.0.0.0/8
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 127.0.0.0/8

Wie du sehen kannst, ist die PF-Erweiterung eine pure Konvention für die Schreiber und Pfleger der pf.conf-Datei, nicht etwa eine Vereinfachung der Regeln, die von pf(4) verarbeitet werden.

Makros können benutzt werden, um mehr als nur ein paar Adressen und Ports zu definieren; sie können überall in einer PF-Regeldatei auftauchen:

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# Davids Klassenraum
$pre 21.14.24.80 $post

# Nicks Haus
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

Wird wie folgt erweitert:

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 6667 keep state

PF-Grammatik

Packet Filters Grammatik ist recht flexibel, welche im Gegenzug, große Flexibilität in einem Regelsatz ermöglicht. PF ist in der Lage, bestimmte Schlüsselwörter zu schlussfolgern, was bedeutet, dass sie nicht explizit in einer Regel angegeben werden müssen und das Sortieren der Schlüsselwörter einfacher wird, sodass es für die Sortierung nicht notwendig ist, sich die genaue Syntax zu merken.

Das Entfernen von Schlüsselwörtern

Um eine ,standardmäßiges Blocken'-Richtlinie zu definieren, werden diese beiden Regeln verwendet:

block in  all
block out all

Dies kann nun verkürzt werden:

block all

Wenn keine Richtung angegeben wird, nimmt PF an, dass die Regel für Pakete gilt, die sich in beide Richtungen bewegen.

Ähnlich können die ,from any to any'- und ,all'-Klauseln aus einer Regel herausgelassen werden, zum Beispiel:

block in on rl0 all
pass  in quick log on rl0 proto tcp from any to any port 22 keep state

kann wie folgt vereinfacht werden:

block in on rl0
pass  in quick log on rl0 proto tcp to port 22 keep state

Die erste Regel blockt alle eingehenden Pakete von irgendwo nach irgendwo auf rl0 und die zweite Regel lässt TCP-Verkehr auf rl0 zum Port 22 durch.

Return-Vereinfachung

Ein Regelsatz der verwendet wird, um Pakete zu blocken und mit einem TCP RST oder ICMP Unreachable zu antworten, könnte wie hier gezeigt aussehen:

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

Dies kann wie folgt vereinfacht werden:

block return

Wenn PF das return-Schlüsselwort sieht, ist er klug genug, um die passende Antwort zu senden oder gar nicht erst zu antworten, abhängig vom Protokoll des Pakets, das geblockt wurde.

Schlüsselwort-Sortierung

Die Reihenfolge, in welcher Schlüsselwörter angegeben werden ist in den meisten Fällen flexibel. Eine Regel zum Beispiel, die so geschrieben wurde:

pass in log quick on rl0 proto tcp to port 22 \
   flags S/SA keep state queue ssh label ssh

Hätte man ebenfalls so schreiben können:

pass in quick log on rl0 proto tcp to port 22 \
   queue ssh keep state label ssh flags S/SA

Andere, ähnliche Varianten werden ebenfalls funktionieren.

[Zurück: Verkehr-Umleitung (Port-Weiterleitung)] [Inhalt] [Weiter: Laufzeit-Optionen]


[zurück] www@openbsd.org
$OpenBSD: shortcuts.html,v 1.15 2007/11/12 20:29:59 saad Exp $