[Zurück: Verkehr-Umleitung (Port-Weiterleitung)] [Inhalt] [Weiter: Laufzeit-Optionen]
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.
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
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.
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.
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]