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 block
Regel 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?
quick
Schlü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