NAT- und Quell-IP-Filterung in PF mit OpenBSD> = 4.7

8

Ich habe gerade ein Buch über PF gelesen (Das Buch von PF, keine Stärke), aber es gibt eine Frage, die dadurch nicht beantwortet wird.

Wenn ich einen Gateway-Computer habe, der zwei Schnittstellen verwendet, $ int_if und $ ext_if, und die Pakete, die von $ int_if: net (dh 10.0.0.0/24) bis $ ext_if kommen match, NAT verwendet , wenn das NAT angewendet wird ? Vor oder nach den Filterregeln?

Beispiel:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23

Funktioniert es? Oder wird die Quell-IP eines Pakets von 10.0.0.23 NATed an die Adresse $ ext_if gesendet, bevor überprüft wird, ob es von 10.0.0.23 stammt?

Dieses Diagramm ist nicht hilfreich, um diese Frage zu beantworten, denke ich, aber es ist trotzdem interessant: [ http://www.benzedrine.cx/pf_flow.png ]

Wenn Sie die PF NAT-FAQ [ http://www.openbsd.org/faq/pf/nat.html ] lesen , insbesondere den Abschnitt "Konfigurieren von NAT", werden Sie auf folgende Sätze stoßen:

Wenn ein Paket durch eine Übereinstimmungsregel ausgewählt wird, werden Parameter (z. B. nat-to) in dieser Regel gespeichert und auf das Paket angewendet, wenn eine mit dem Paket übereinstimmende Durchlaufregel erreicht wird. Dies ermöglicht es, dass eine ganze Klasse von Paketen von einer einzigen Übereinstimmungsregel verarbeitet wird, und dann können spezifische Entscheidungen darüber, ob der Verkehr zugelassen werden soll, mit Block- und Passregeln getroffen werden.

Ich denke, das hört sich so an, als ob es nicht so ist, wie ich es im obigen Absatz angegeben habe. Daher wird die Quell-IP "gespeichert", bis eine Entscheidung über die mit dem Paket auszuführende Aktion getroffen wird. Wenn die Entscheidung getroffen wird, wird das NATting angewendet.

Was denken Sie?

PS: Dies ist eine ziemlich theoretische Frage. Wenn Sie ein bisschen pragmatisch sind, machen Sie es so:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23

Die blockRegel wird also bereits angewendet, wenn das Paket auf $ int_if eingeht.

EDIT: Eine andere Möglichkeit ist natürlich, vor NAT zu entscheiden:

pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)

Wenn ein Paket von .23 ankommt, stimmt es zuerst mit der ersten Regel überein, dann mit der zweiten Regel und der dritten "Regel". Da die zweite Regel die letzte Entscheidung über das Weiterleiten / Blockieren ist, wird das Paket blockiert. Recht?

dermesser
quelle

Antworten:

1

Ja, es ist ziemlich theoretisch, was Sie gefragt haben, aber eine sehr interessante Frage.

Die matchRegel wird angewendet, wenn sie auf die letzte übereinstimmende Regel einwirkt. matchRegeln sind "klebrig", wie Sie erwähnt haben. Der Hauptzweck von ihnen besteht darin, Dinge wie eine NAT-Regel einmal festlegen zu können und nicht am Ende einer Reihe von Regeln, die Sie über ausgehenden Datenverkehr haben, nat-to zu setzen.

In Ihrem Beispiel wird das Paket verworfen. Ich müsste mir den Code ansehen oder Henning Brauer bitten, sicher zu sein, ob sie die NAT-Prüfung im Drop-Fall vollständig überspringen, aber es würde nicht NATted herauskommen.

Ich denke, Ihre Regel wird durch das Book of PF abgedeckt (haben Sie die 2. Ausgabe?), Aber ich denke nicht, dass sie mit der Match-Regel explizit darüber sprechen.

Kurtm
quelle
0

Bitte korrigieren Sie mich, wenn ich falsch lag. Sie möchten alle ausgehenden Pakete von 10.0.0.0/24 weiterleiten, aber 10.0.0.23 blockieren? Wenn ja, ändern Sie Ihre Regel in:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop out quick on $ext_if from 10.0.0.23
pass out on $ext_if from 10.0.0.0/24

Verwenden Sie quickdiese Option einfach, um zu verhindern, dass die Firewall weiter filtert (ähnlich wie breakin einigen Programmiersprachen).

http://www.openbsd.org/faq/pf/filter.html#quick

Das schnelle Schlüsselwort

Wie bereits erwähnt, wird jedes Paket von oben nach unten anhand des Filterregelsatzes bewertet. Standardmäßig ist das Paket für die Weitergabe markiert, was durch eine beliebige Regel geändert werden kann und vor dem Ende der Filterregeln mehrmals hin und her geändert werden kann. Die letzte übereinstimmende Regel "gewinnt". Hiervon gibt es eine Ausnahme: Die Schnelloption für eine Filterregel bricht jede weitere Regelverarbeitung ab und bewirkt, dass die angegebene Aktion ausgeführt wird. Schauen wir uns einige Beispiele an:

Falsch:

block in on fxp0 proto tcp to port ssh
pass  in all 

In diesem Fall kann die Blocklinie ausgewertet werden, hat jedoch niemals Auswirkungen, da dann eine Linie folgt, die alles passiert.

Besser:

block in quick on fxp0 proto tcp to port ssh
pass  in all 

Diese Regeln werden etwas anders bewertet. Wenn die Blockierungslinie aufgrund der Schnelloption übereinstimmt, wird das Paket blockiert und der Rest des Regelsatzes wird ignoriert.


quelle
Ich kenne das quickSchlüsselwort, aber es gefällt mir nicht wirklich - ich versuche immer, die Bewertungsreihenfolge von pf zu verwenden;) Übrigens habe ich die Antwort auf einer OpenBSD-FAQ-Seite gefunden: "NAT wird als optionaler nat-to-Parameter für angegeben Eine ausgehende Passregel. Oft wird eine Übereinstimmungsregel verwendet, anstatt direkt in der Passregel festgelegt zu werden. Wenn ein Paket durch eine Übereinstimmungsregel ausgewählt wird, werden Parameter (z. B. nat-to) in dieser Regel gespeichert und auf die angewendet Paket, wenn eine mit dem Paket übereinstimmende Durchlaufregel erreicht ist. " Mein Regelsatz würde also keine Probleme verursachen und
.23
(Die Übereinstimmungsregel in Zeile 2 lässt die Pakete passieren, nachdem alle Regeln durchlaufen wurden, und dann wird NAT angewendet.)
dermesser