IPFW-Verständnis bezüglich der Syntax

  • Thread starter Thread starter Ardalrian
  • Start date Start date
A

Ardalrian

Guest
Hallo zusammen! :-)

Ich habe ein paar Probleme, IPFW zu verstehen. Ich habe schon mehrfach diverse Dinge ausprobiert, aber irgendwie bekomme ich über SSH sowie über HTTP keine Verbindung zum Server. Nun ein paar Beispiele, damit ich das auch später begreife.

Folgendes Script ist gegeben:

Code:
ipfw -f flush
ipfw add check-state
ipfw add 10 allow tcp from any to any 80 keep-state
ipfw add 90 deny all from any to any

Ich weiß, dass dieses Script keinen Sinn macht, aber ich möchte es erst mal nur verstehen.
Heißt das in diesem Fall, dass nur Port 80 (HTTP) für alle freigegeben und der Rest gesperrt ist? Da In oder Out nicht angegeben wurden, findet das bidirektional, also In sowie Out, statt, oder?

Ist es auch möglich, ohne Regelnummern wie im folgenden Beispiel-Script zu arbeiten?

Code:
ipfw add allow tcp in 80
ipfw add allow from 192.0.2.0/24 to me
ipfw add allow out
ipfw add deny

Quelle: [url]http://de.wikipedia.org/wiki/Ipfw[/url]

Ich arbeite mit der externen Regel-Datei ipfw.rules.

Ich bedanke mich im Voraus für jegliche Unterstützung euerseits! :-)

Mit freundlichem Gruß

Ardalrian
 
Last edited by a moderator:
Guten Morgen :)

Erst einmal vorweg den allgemeinen Teil, der inzwischen ja leider notwendig ist, da viele Nutzer von pf auf andere Paketfilter schließen. ipfw arbeitet nach dem "First rule matches"-Prinzip, d.h. sobald eine Regel greift, wird diese angewandt und das Paket verlässt den Paketfilter. Das führt dazu, dass spezielle Regeln vor allgemeinen Regeln stehen müssen. Aber das hast du beachtet, also dort kein Problem.

Code:
ipfw add check-state

Der "State Checker". Für jede statefull Regel (keep-state) wird an dieser Stelle für jede neue Verbindung eine dynamische Regel eingefügt. D.h. für das erste Paket von oder zu einem Server wird die eigentliche Regel ausgeführt und die dynamische Regel generiert. Jedes nachfolgende Paket nutzt dann diese dynamische Regel, bis sie durch ein Schließen der Verbindung wieder entfernt wird. Das führt zu höherer Geschwindigkeit (das Paket muss weniger Regeln durchlaufen, bis eine greift), wenn check-state so weit oben wie möglich im Script steht. Und es ermöglicht einfachere Regelsätze, da man nur Verbindungen in eine Richtung beachten muss. Wenn du beispielsweise eine Regel für ausgehende Verbindungen auf Port 80 hast, werden über die dynamische Regel antwortende Pakete auf bereits etablierten Verbindungen ohne, das weitere Regeln notwendig sind, hereingelassen.

Du solltest dieser Regel noch eine Nummer zuweisen. Das ist nicht zwingend notwendig (ipfw versucht die richtige Nummer zu raten), aber trotzdem eine gute Idee. Es macht das Regelwerk nachvollziehbarer.

Code:
ipfw add 10 allow tcp from any to any 80 keep-state
Lässt ein- und ausgehende Verbindungen auf Port TCP 80 durch, egal von wem sie kommen und für wen sie bestimmt sind. Dazu wird eine dynamische Regel zum statefull Filterin eingefügt.

Code:
ipfw add 90 deny all from any to any
Blockiert alles von jedem zu jedem, was nicht durch eine vorherige Regel durchgelassen wurde. Nicht zwingend notwendig, da in Standardeinstellung eine ähnliche Regel immer ans Ende des Regelwerks eingefügt wird, aber aus Gründen der Lesbarkeit ist es dennoch oft eine gute Idee sie einzufügen.

Ardalrian said:
Ist es auch möglich, ohne Regelnummern wie im folgenden Beispiel-Script zu arbeiten?
Ja, denn wie ich oben schon schrieb, weißt ipfw automagisch eine Nummer zu. Neue Regeln werden nach den vorhandenen (aber vor der standardregel am Ende) eingefügt. Ich würde dennoch immer Nummern nehmen, da das Regelwerk dadurch lesbarer wird. Gerade, wenn es mal mehr Regeln werden, Sprünge auftreten und solche schönen Dinge.
 
Ich habe mir jetzt folgendes Script auf Grundlage deines Postings gebastelt:

Code:
ipfw -q -f flush

ipfw add check-state
ipfw add 10 allow tcp from any to any in 80 keep-state
ipfw add 20 allow tcp from any to any in [SSH-PORT] keep-state
ipfw add 30 allow all from me to any out keep-state
ipfw add 40 deny all from any to any

Habe ich nun etwas nicht verstanden oder müsste Dieses funktionieren?

Sorry, wenn ich so begriffsstutzig bin, aber ich hatte mit meiner Firewall noch keinen Erfolg - bis auf das Blockieren von allen Verbindungen, was natürlich nicht Sinn der Sache ist, wenn der Systemadministrator keinen Zugriff mehr hat. :D
 
[SSH-Port] so wie es dort steht, wird imho nicht funktionieren. Schreib doch einfach 22.
Ansonsten sollte das so funktionieren. Du kannst dein Regelwerk natürlich auch von Hand laden:
Code:
# sh /pfad/zum/regelwerk
Wenn die Syntax dann nicht passt, gibt´s ne Fehlermeldung.
Und du kannst sehen wann eine Regel greift, mit Zähler:
Code:
# ipfw show

edit: das Loopback würde ich noch mit aufnehmen
Code:
ipfw -q -f flush
ipfw add 100 pass all from any to any via lo0
ipfw add 200 deny all from any to 127.0.0.0/8
ipfw add 300 deny ip from 127.0.0.0/8 to any
ipfw add 400 check-state
ipfw add 500 allow tcp from any to any in 80 keep-state
ipfw add 600 allow tcp from any to any in [SSH-PORT] keep-state
ipfw add 700 allow all from me to any out keep-state
ipfw add 800 deny all from any to any
 
Last edited:
Hm, mit dem Befehl

sh /pfad/zum/regelwerk

lädt er und meldet mir nach einiger Zeit

broken pipe

, was auf die Regeln hin deutet. Also muss irgendwas an dem Script faul sein. Sehr komisch.

Ich danke euch bis hierhin und werde es weiter versuchen.
Ich melde mich erneut, wenn ich den Fehler gefunden habe. :-)
 
Der Fehler bestand darin, dass in rc.conf die rc.firewall falsch war. Der Pfad meines Skriptes musste selbstverständlich hinein, dies hatte ich aber aus lauter Ärgernis mit der Datei ipfw.rules total vergessen. Ich habe jedes Mal die Syntax überprüft, konnte aber nie Fehler feststellen. Jetzt funktioniert alles einwandfrei.

Ich bedanke mich in jedem Fall bei euch für eure Hilfe! :-)
 
Back
Top