Index: head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml =================================================================== --- head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml +++ head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml @@ -19,6 +19,7 @@ MichaelBunzelÜbersetzt von JohannKois BenjaminLukas + BjörnHeidotting @@ -1674,2710 +1675,2138 @@ - - Die IPFILTER-Firewall (IPF) + + IPFW - firewall + Firewall - IPFILTER + IPFW - Geschrieben wurde IPFILTER von Darren Reed. IPFILTER ist vom - Betriebssystem unabhängig: Es ist eine Open Source Anwendung, - die auf die Betriebssysteme &os;, NetBSD, OpenBSD, &sunos;, HP/UX - und &solaris; portiert wurde. IPFILTER wird aktiv betreut und - gepflegt. Es werden regelmäßig neue Versionen - herausgegeben. - - IPFILTER basiert auf einer kernelseitigen Firewall und einem - NAT Mechanismus, der durch Anwenderprogramme - betreut und gesteuert werden kann. Die Regeln der Firewall werden - mit dem Programm &man.ipf.8; gesetzt oder gelöscht. Für - die Manipulation der NAT Regeln verwendet man - &man.ipnat.8;. Mit &man.ipfstat.8; werden Laufzeitstatistiken der - kernelseitigen Anteile von IPFILTER aufgelistet. Und mit dem - Programm &man.ipmon.8; kann man die Aktionen von IPFILTER in die - Protokolldateien des Systems speichern. - - IPF funktionierte ursprünglich mit einer - Regel-Prozess-Logik à la die letzte Regel, die - passt, entscheidet und verwendete ausschließlich - Regeln ohne feste Zustände. Inzwischen wurde die - Regel-Prozess-Logik drastisch modernisiert: Es gibt eine - und eine zustandsorientierte Option. Die offizielle Dokumentation beinhaltet - leider nur die veralteten Parameter zur Regelerstellung - die neuen - Funktionen werden nur als Zusatzoptionen aufgelistet, was ihre - Vorteile beim Erstellen einer weit überlegenen und viel - sichereren Firewall völlig untergräbt. - - Die Anweisungen in diesem Kapitel basieren darauf, Regeln mit - den Optionen und - zu erstellen. Mit diesem Grundwissen wird man einen kompletten - einschließenden Regelsatz erstellen können. - - Für eine ausführliche Erläuterung der alten Methode - zur Regelverarbeitung schauen Sie bitte auf - http://www.munk.me.uk/ipf/ipf-howto.html oder - http://coombs.anu.edu.au/~avalon/ip-filter.html. + IPFW ist eine + Stateful-Firewall + für &os;, die sowohl IPv4 als auch + IPv6 unterstützt. Die Firewall setzt sich + aus mehreren Komponenten zusammen: dem Kernel Firewall + Filter-Prozessor mit integriertem Paket-Accounting, + Protokollfunktionen, NAT, dem + &man.dummynet.4; Traffic-Shaper, + sowie Weiterleitungs-, Bridge- und ipstealth-Funktionen. - Antworten auf häufige Fragen finden Sie unter - http://www.phildev.net/ipf/index.html. + &os; enthält mit /etc/rc.firewall ein + Beispielregelwerk, welches mehrere Firewall-Typen für + gebräuchliche Szenarien definiert und unerfahrene Anwender + dabei unterstützen soll, ein geeignetes Regelwerk zu erstellen. + IPFW besitzt eine leistungsstarke + Syntax, mit der erfahrene Benutzer ihre eigenen Regeln + anfertigen können, um den Sicherheitsanforderungen der + jeweiligen Umgebung gerecht zu werden. - Und ein durchsuchbares Archiv der Mailingliste zu IPFILTER - gibt es unter http://marc.theaimsgroup.com/?l=ipfilter. + Diser Abschnitt beschreibt, wie + IPFW aktiviert wird und bietet einen + Überblick über die Regelsyntax. Zudem werden mehrere Regelsätze + für gebräuchliche Konfigurationsszenarien vorgestellt. - - Aktivieren von IPF + + <application>IPFW</application> aktivieren - IPFILTER - - enabling + IPFW + aktivieren - &os; enthält IPF in der Standardversion als ladbares - Kernelmodul. Dieses Modul wird vom System automatisch geladen, - wenn in der rc.conf der Eintrag - ipfilter_enable="YES" angelegt wird. In dieser - ursprünglichen Konfiguration ist die Protokollierung aktiv - und die Option default pass all ("Pakete passieren - lassen") als Standard gesetzt. Um die block all - ("alles Blockieren") Option zu setzen, muss man nicht gleich - einen neuen Kernel bauen - es reicht, block all - als letzte Position des Regelsatzes aufzulisten. - - - - Kernel-Optionen - - - Kerneloptionen + Das &os; Basissystem enthält für + IPFW ein ladbares Kernelmodul, was + bedeutet, dass kein angepasster Kernel benötigt wird, um + IPFW zu benutzen. - IPFILTER + + Kerneloptionen + IPFIREWALL - Kerneloptionen - - IPFILTER_LOG + Kerneloptionen + IPFIREWALL_VERBOSE - Kerneloptionen - - IPFILTER_DEFAULT_BLOCK + Kerneloptionen + IPFIREWALL_VERBOSE_LIMIT - IPFILTER - - Kerneloptionen + IPFW + Kerneloptionen - Es ist nicht unbedingt notwendig, IPF durch die folgenden - Optionen direkt in der Kernel einzubinden. Diese Möglichkeit - der Verwendung von IPF wird hier mehr als Hintergrundwissen angeboten. - Man sollte nur wissen, dass dadurch nicht mehr das Kernelmodul geladen - wird - und dementsprechend auch nicht mehr entladen werden kann. - - Die Beschreibung der einzelnen Optionen von IPF für die - Verwendung in der Kernelkonfiguration finden Sie auch in der Datei - /usr/src/sys/conf/NOTES. - - options IPFILTER -options IPFILTER_LOG -options IPFILTER_DEFAULT_BLOCK - - options IPFILTER aktiviert die Verwendung - der IPFILTER Firewall. - - options IPFILTER_LOG aktiviert den - Logging-Mechanismus. Das bedeutet, dass jedes Paket geloggt wird, - auf das eine Regel passt, die das Schlüsselwort - log enthält. Dazu wird der - Pseudo—Device ipl verwendet. - - options IPFILTER_DEFAULT_BLOCK ändert - das Verhalten der Firewall dahingehend, dass jedes Paket, dass nicht - explizit von einer pass Regel Zugang erhält, - abgewiesen, bzw. geblockt, wird. - - Diese Einstellungen werden erst aktiv, wenn der Kernel, in den sie - eingebunden wurden, kompiliert, installiert und gebootet wurde. - - - - Optionen in rc.conf - - Um IPF während des Bootvorgangs einzubinden, braucht man - lediglich die folgenden Zeilen der Datei - /etc/rc.conf anzufügen: - - ipfilter_enable="YES" # Startet IPF -ipfilter_rules="/etc/ipf.rules" # liest den Regelsatz aus einer Datei -ipmon_enable="YES" # Startet das IP-Monitor Log -ipmon_flags="-Ds" # D = Als Da:mon starten - # s = Protokollierung via syslog - # v = Protokollierung von tcp window, ack, seq - # n = Namen statt IP & port ausgeben - - - Falls sich hinter der Firewall ein lokales Netzwerk befindet, - das den reservierten privaten Adressbereich verwendet, müssen - die folgenden Zeilen zur Aktivierung von NAT - ebenfalls in /etc/rc.conf eingetragen - werden: - - gateway_enable="YES" # Aktivierung des LAN-Gateways -ipnat_enable="YES" # Startet die ipnat Funktion -ipnat_rules="/etc/ipnat.rules" # Liest die ipnat-Regeldefinitionen aus einer Datei - - - - - Der Befehl ipf - - ipf + Wenn Sie eine statische Unterstützung für + IPFW in den Kernel kompilieren + wollen, lesen Sie . Folgende + Optionen können in der Kernelkonfigurationsdatei verwendet + werden: - Mit dem Befehl &man.ipf.8; liest man die Datei, die den Regelsatz - enthält ein. Mit dem folgenden Befehl können Sie Ihre - eigenen, für Ihr System maßgeschneiderten Regeln einlesen - und so in einem Schritt alle Regeln der laufenden Firewall - ersetzen: + options IPFIREWALL # enables IPFW +options IPFIREWALL_VERBOSE # enables logging for rules with log keyword +options IPFIREWALL_VERBOSE_LIMIT=5 # limits number of logged packets per-entry +options IPFIREWALL_DEFAULT_TO_ACCEPT # sets default policy to pass what is not explicitly denied +options IPDIVERT # enables NAT - &prompt.root; ipf -Fa -f /etc/ipf.rules + Um IPFW beim Systemstart zu + aktivieren, fügen Sie folgende Zeile in + /etc/rc.conf ein: - bedeutet, dass alle intern gespeicherten - Tabellen mit Regeln gelöscht werden. + firewall_enable="YES" - gibt die Datei an, aus der die neuen Regeln - gelesen werden sollen. + Wenn Sie einen der von &os; zur Verfügung gestellten + Firewall-Profile benutzen möchten, fügen Sie eine weitere + Zeile hinzu, in der Sie das Profil bestimmen: - Mit diesen beiden Optionen erhalten Sie die Möglichkeit, - Änderungen an der Datei mit Ihrem Regelsatz vorzunehmen und - gleich die Firewall mit den neuen Regeln zu bestücken, ohne - den Rechner neu starten zu müssen. Da dieser Vorgang beliebig - wiederholt werden kann, ist es ein sehr bequemer Weg, neue Regeln - einzuarbeiten und zu testen. - - Um mehr über diese und weitere Optionen von &man.ipf.8; - zu erfahren, konsultieren Sie bitte die Manpage. - - &man.ipf.8; erwartet, dass es sich bei der Datei mit dem Regelsatz - um eine Standard-Textdatei handelt. Eine Datei, die ein Skript oder - Variablen enthält, wird nicht verarbeitet. - - Es gibt allerdings doch einen Weg, IPF Regeln mit Hilfe von - Skripten und Variablen zu erstellen. Weitere Informationen dazu - finden Sie unter . - + firewall_type="open" - - IPFSTAT + Folgende Profile stehen zur Verfügung: - ipfstat + + + open: gestattet jeglichen + Datenverkehr. + - - IPFILTER + + client: schützt lediglich diesen + Rechner. + - statistics - + + simple: schützt das gesamte + Netzwerk. + - Das normale Verhalten von &man.ipfstat.8; ist, die Zusammenfassung - der angefallenen Statistiken, die als Resultat der Anwendung von - nutzerspezifischen Regeln auf ein- und ausgehende Pakete seit dem - letzten Start der Firewall oder seit dem letzten Zurücksetzen - der Zähler auf Null durch das Kommando - ipf -Z angesammelt wurden, abzurufen und - anzuzeigen. + + closed: blockiert den gesamten + IP-Datenverkehr, mit Ausnahme des + Verkehrs über die Loopback-Schnittstelle. + - Für weiterführende Informationen schauen Sie bitte - auf die Manpage von &man.ipfstat.8;! + + workstation: schützt lediglich + diesen Rechner und verwendet zustandsorientierte + Regeln. + - Die Ausgabe von &man.ipfstat.8;, wenn keine Parameter - übergeben wurden, sieht etwa so aus: + + UNKNOWN: deaktiviert das Laden von + Firewallregeln. + - input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 -output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 -input packets logged: blocked 99286 passed 0 -output packets logged: blocked 0 passed 0 -packets logged: input 0 output 0 -log failures: input 3898 output 0 -fragment state(in): kept 0 lost 0 -fragment state(out): kept 0 lost 0 -packet state(in): kept 169364 lost 0 -packet state(out): kept 431395 lost 0 -ICMP replies: 0 TCP RSTs sent: 0 -Result cache hits(in): 1215208 (out): 1098963 -IN Pullups succeeded: 2 failed: 0 -OUT Pullups succeeded: 0 failed: 0 -Fastroute successes: 0 failures: 0 -TCP cksum fails(in): 0 (out): 0 -Packet log flags set: (0) + + filename: + absoluter Pfad zu einer Datei, in der die Firewallregeln + definiert sind. + + - Wenn die Option für - eingehend oder für - ausgehend übergeben wird, liefert das Kommando - eine entsprechende Liste von Filter-Regeln, die gerade installiert - sind und vom Kernel verwendet werden. + Wenn Sie firewall_type auf + client oder simple + setzen, müssen Sie die voreingestellten Regeln in + /etc/rc.firewall anpassen, damit sie + der Konfiguration des Systems entsprechen. - ipfstat -in zeigt alle aktive Regeln - für eingehende Verbindungen zusammen mit ihren Nummern. + Beachten Sie, dass das Profil filename + verwendet wird, um ein benutzerdefiniertes Regelwerk zu + laden. - ipfstat -on erledigt dasselbe für die - ausgehenden Verbindungen. + Eine alternative Möglichkeit, um ein benutzerdefiniertes + Regelwerk zu laden, bietet die Variable + firewall_script. Setzen Sie die Variable + auf den absoluten Pfad eines + ausführbaren Skripts, welches die Befehle + für IPFW enthält. Die Beispiele in + diesem Abschnitt gehen davon aus, dass + firewall_script auf + /etc/ipfw.rules gesetzt ist. - Die Ausgabe sieht in etwa folgendermaßen aus: + firewall_script="/etc/ipfw.rules" - @1 pass out on xl0 from any to any -@2 block out on dc0 from any to any -@3 pass out quick on dc0 proto tcp/udp from any to any keep state + Die Protokollierung wird mit diesem Eintrag + aktiviert: - ipfstat -ih zeigt die Tabelle der aktiven - Regeln für eingehende Verbindungen zusammen mit der Anzahl, - wie oft jeder einzelnen Regel entsprochen wurde. + firewall_logging="YES" - ipfstat -oh zeigt das Gleiche für - die ausgehenden Verbindungen. + Es existiert keine Variable für + /etc/rc.conf, um die Protokollierung zu + begrenzen. Um die Anzahl der Protokoll-Nachrichten pro + Verbindungsversuch zu begrenzen, legen Sie die Anzahl der + Einträge in /etc/sysctl.conf fest: - Hier wird die Ausgabe so oder so ähnlich aussehen: + net.inet.ip.fw.verbose_limit=5 - 2451423 pass out on xl0 from any to any -354727 block out on dc0 from any to any -430918 pass out quick on dc0 proto tcp/udp from any to any keep state + Nachdem Sie die Änderungen gespeichert haben, können Sie + die Firewall starten. Um auch die Anzahl der + Protokoll-Nachrichten zu konfigurieren, setzen Sie mit + sysctl den gewünschten Wert: - Einer der wichtigsten Funktionen von ipfstat - wird über die Option bereitgestellt. Mit - ihr wird eine Statustabelle vergleichbar der Prozess-Tabelle - von &man.top.1; ausgegeben. Mit dieser Funktion erhalten Sie im - Falle eines Angriffs die Möglichkeit, die angreifenden Pakete - zu identifizieren, abzufangen und auszuwerten. Weitere Unteroptionen - eröffnen, die IP-Adresse, den Port oder das Protokoll, geteilt - nach Herkunft und Ziel, auszuwählen und dann in Echtzeit zu - beobachten. Lesen Sie dazu bitte auch die Manpage von - &man.ipfstat.8;. + &prompt.root; service firewall start +&prompt.root; sysctl net.inet.ip.fw.verbose_limit=5 - - IPMON + + <application>IPFW</application> Regel-Syntax - ipmon + Wenn ein Paket die Firewall betritt, also + von der Firewall geprüft und verarbeitet wird, wird die + erste Regel des Regelwerkes auf das Paket angewandt. Auf + diese Weise wird in aufsteigender Reihenfolge der Regelnummer + mit allen weiteren Regeln verfahren. Falls die + Selektionsparameter einer Regel auf ein Paket zutreffen, wird + das Aktionsfeld der Regel ausgeführt und die Prüfung + des Pakets beendet, nachfolgende Regeln werden also nicht + mehr geprüft. Diese Suchmethode wird als erster + Treffer gewinnt bezeichnet. Falls keine Regel auf + das betreffende Paket zutrifft, wird die obligatorische + IPFW-Rückfallregel mit der Nummer + 65535 angewendet und das Paket wird ohne Rückantwort + verworfen. Wenn das Paket jedoch einer Regel mit dem + Schlüsselwort count, + skipto oder tee + entspricht, wird die Prüfung des Pakets weiter + fortgeführt. Weitere Details darüber, wie diese + Schlüsselwörter die Regelverarbeitung beeinflussen, finden Sie + in &man.ipfw.8;. - IPFILTER - - logging - - - Damit der Befehl ipmon korrekt arbeiten kann, - muss die Option IPFILTER_LOG in die - Kernelkonfiguration eingearbeitet werden. Das Kommando selbst - arbeitet in zwei verschiedenen Modi. Für den nativen Modus - startet man ipmon auf der Kommandozeile ohne die - Option . - - Der Hintergrundmodus (daemon mode) dient der - Erstellung eines stetigen Systemprotokolls, so dass Einträge - vergangener Ereignisse inspiziert werden können. So sollen &os; - und IPFILTER entsprechend ihrer Konfiguration zusammen arbeiten. - &os; kann mit einem eingebauten Mechanismus Systemprotokolle - turnusmäßig abspeichern. Aus diesem Grund sollte man - besser &man.syslogd.8; verwenden anstatt die Protokollinformationen - in eine Datei zu schreiben, wie es als Standard vorgesehen ist. In - der Standard-rc.conf-Datei (im Ordner - /etc/defaults/) wird dem Eintrag - ipmon_flags die Option - übergeben: - - ipmon_flags="-Ds" # D = Als Da:mon starten -# s = Protokollierung via syslog -# v = Protokollierung von tcp window, ack, seq -# n = Namen statt IP & port ausgeben - - Die Vorteile des Protokollierens liegen auf der Hand: Sie - versetzen den Administrator in die Lage, nach einem Vorfall - Informationen abzurufen, etwa welche Pakete aussortiert wurden, - welche Adressen diese Pakete gesendet haben oder wohin sie gesendet - werden sollten. Alles in allem erhält er ein sehr gutes Werkzeug - zum Aufspüren von Angreifern. - - Jedoch, auch wenn die Protokollierung aktiviert ist, wird IPF - keine einzige Regel zum Protokollieren von alleine entwerfen und - umsetzen. Der Administrator der Firewall entscheidet, welche Regeln - in seinem Regelsatz mitgeschrieben werden sollen und er muss - dementsprechend das Schlüsselword log in - dieser Regel angeben. Normalerweise werden nur Treffer auf abweisende - Regeln protokolliert. - - Es ist üblich, als letzte Regel eine alles blockierende - Regel mit dem Schlüsselwort log in den - Regelsatz einzutragen. Dadurch erkennt man alle Pakete, die keiner - Regel im Regelsatz entsprachen. - - - - IPMON Logging - - Syslogd verwendet seine eigene Methode - zum Sortieren der gesammtelten Protokolldaten - spezielle Gruppierungen - namens facility und level. IPMON - verwendet im daemon-Modus als - facility den Wert security. Die - folgenden level können für eine genauere - Trennung der Protokolldaten verwendet werden: - - LOG_INFO - Alle zu protokollierenden Pakete -LOG_NOTICE - Protokollierte Pakete, die passieren durften -LOG_WARNING - Protokollierte Pakete, die blockiert wurden -LOG_ERR - Protokollierte Pakete, deren Headerdaten nicht komplett vorlagen - - Damit IPFILTER angewiesen werden kann, alle Protokolldaten in - die Datei /var/log/ipfilter.log zu schreiben, - muss diese erst erstellt werden. Folgendes Kommando - übernimmt diese Aufgabe: - - &prompt.root; touch /var/log/ipfilter.log - - Die Funktionen von &man.syslogd.8; werden durch Definition in - der Datei /etc/syslog.conf gesteuert. In dieser - Datei kann sehr weitläfig eingestellt werden, wie - syslog mit den Systemnachrichten umgehen - soll, die ihm von Anwendungen wie IPF übergeben werden. - - Fügen Sie folgende Definition in die Datei - /etc/syslog.conf ein, um die Protokollierung - für IPF via syslog zu aktivieren: - - security.* /var/log/ipfilter.log + IPFW + Regel-Syntax + - security.* bedeutet, dass alle Nachrichten - der Klasse security.* am angegebenen Ort (hier - eine Datei) geschrieben werden sollen. + Bei der Erstellung der + IPFW-Regeln müssen die + Schlüsselwörter in der folgenden Reihenfolge geschrieben + werden. Einige Schlüsselwörter müssen zwingend angegeben + werden, während andere optional sind. Die Wörter in + Großbuchstaben repräsentieren Variablen und die Wörter in + Kleinbuchstaben müssen den Variablen vorangestellt + werden. Das Zeichen # wird benutzt, um + einen Kommentar einzuleiten und kann am Ende einer Regel oder + in einer eigenen Zeile stehen. Leerzeilen werden + ignoriert. - Um Änderungen an der Datei - /etc/syslog.conf zu aktivieren müssen Sie - den Rechner neu starten, oder den Befehl + CMD RULE_NUMBER set SET_NUMBER ACTION log + LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT + OPTIONS - &prompt.root; /etc/rc.d/syslogd reload + Dieser Abschnitt bietet einen Überblick über diese + Schlüsselwörter und deren Optionen. Es ist keine vollständige + Liste aller verfügbaren Optionen. Eine vollständige + Beschreibung der Regel-Syntax, die Sie verwenden können um + IPFW-Regeln zu erstellen, finden + Sie in &man.ipfw.8;. - ausführen. + + + CMD + + Jede Regel muss mit ipfw add + beginnen. + + - Vergessen Sie nicht, /etc/newsyslog.conf - anzupassen, damit die neuen Protokolldateien, die eben konfiguriert - wurden, auch in den Rotationsturnus eingefügt werden! - + + RULE_NUMBER + + Jede Regel gehört zu einer Nummer zwischen + 1 und 65534. Die + Nummer wird verwendet, um die Reihenfolge der + Regelverarbeitung zu kennzeichnen. Es ist möglich, dass + mehrere Regeln dieselbe Nummer haben. In diesem Fall + werden sie entsprechend der Reihenfolge angewendet, in + der sie aufgenommen wurden. + + - - Die Formatierung der Logdatei + + SET_NUMBER + + Jede Regel ist einer Set-Nummer + zwischen 0 und 31 + zugeordnet. Sets können einzeln aktiviert oder + deaktiviert werden. Dies macht es möglich, eine Reihe + von Regeln schnell hinzuzufügen oder zu löschen. Wenn + SET_NUMBER nicht angegeben ist, wird + die Regel zu Set 0 + hinzugefügt. + + - Nachrichten, die durch ipmon erzeugt werden, - bestehen aus durch Leerstellen getrennten Datenfeldern. Folgende - Felder sind in allen Nachrichten enthalten: + + ACTION + + Eine Regel kann mit einer der folgenden Aktionen + verknüpft werden. Die festgelegte Aktion wird + ausgeführt, wenn das Paket den Selektionskriterien der + Regel entspricht. - - - Das Datum der Paketerstellung. - - - - Die Uhrzeit der Paketerstellung in der Form - HH:MM:SS.F, mit Stunden, Minuten, Sekunden - und Sekundenbruchteilen, wobei letztere mehrere Stellen lang - sein können. - - - - Der Name der Schnittstelle, die das Paket verarbeitet hat, - bspw. dc0. - - - - Die Gruppe und die Nummer der angewandten Regel, bspw. - @0:17. - - - - Die ausgeführte Aktion: p für - passed (zugelassen), b für blockiert, - S für short packet (unvollständiger - Header), n für no match (gar keine Regel - wurde berührt) und L für Log-Regel. Die Reihe, in der - die Flags angezeigt werden ist: S, p, b, n, L. Ein groß - geschriebenes P oder B bedeutet, dass das Paket aufgrund einer - globalen Einstellung protokolliert wurde und nicht wegen einer - einzelnen Regel. - - - - Die Adressen. Diese bestehen aus drei Feldern: Der - Quelladresse mit Port (getrennt durch ein Komma), dem Symbol - -> und der Zieladresse. Also bspw. - 209.53.15.22,80 -> 198.64.221.18,1722. - - - - PR gefolgt vom Namen eines - Netzwerk-Protokolls oder dessen Nummer. Bspw. - PR tcp. - - - - len gefolgt von der Länge des Headers - und der Gesamtlänge des Paketes, beispielsweise - len 20 40. - - + allow | accept | pass | + permit: All diese Aktionen sind + gleichbedeutend und erlauben Pakete, die mit der Regel + übereinstimmen. - Wenn es sich um ein TCP-Paket handelt, wird - ein weiteres Feld, beginnend mit einem Querstrich und gefolgt von - Buchstaben, die den gesetzten Flags entsprechen, angezeigt. Lesen - Sie bitte die Manpage &man.ipmon.8; für eine Liste der Buchstaben - und deren Bedeutungen. - - Falls das Paket ein ICMP-Paket ist, werden zwei Felder am Ende - hinzugefügt - das erstere ist immer ICMP, das - zweite enthält die ICMP-Nachricht und den Nachrichtentyp, - getrennt durch einen Schrägstrich. ICMP 3/3 - steht beispielsweise für Port nicht - erreichbar. - + check-state: Diese Aktion + überprüft die Regel in der dynamischen Zustandstabelle. + Bei einer Übereinstimmung wird die mit der dynamischen + Regel verknüpfte Aktion ausgeführt, andernfalls wird mit + der Prüfung gegen die nächste Regel fortgefahren. Die + Regel check-state hat selbst kein + Selektionskriterium. Sollte keine + check-state-Regel im Regelwerk + vorhanden sein, wird die dynamische Zustandstabelle beim + ersten Vorkommen einer keep-state- + oder limit-Regel überprüft. - - Die Erstellung eines Regelsatzes mit Variablen + count: Aktualisiert die + Zähler für alle Pakete, die mit dieser Regel + übereinstimmen. Die Prüfung wird mit der nächsten Regel + fortgesetzt. - Erfahrenere IPF Anwender erstellen sich eine Datei, die die - Regeln enthält und gestalten diese als ein Skript, in dem - Variablen verwendet werden. Der wichtigste Vorteil besteht darin, - dass man lediglich den Wert der Variablen anpassen muss und diese, - sobald das Skript gestartet wird, durch die entsprechenden Werte - ersetzt und die Regeln entsprechend formuliert werden. In Skripten - kann man so häufig verwendete Werte einfach als Variable in - mehreren Regeln zuweisen. Am folgenden Beispiel soll das - verdeutlicht werden. - - Die Syntax dieses Skriptes ist kompatibel mit den Shells - &man.sh.1;, &man.csh.1; und &man.tcsh.1;. - - Variablen beginnen mit einem Dollar-Zeichen: - $Variablenname. Im Beispiel unten steht - $oif für die Variable, in der der Name - der Schnittstelle abgelegt wird, über die der Verkehr nach - außen erfolgt. - - In Variablenzuweisungen fehlt das beginnende $-Zeichen. - Alleine der Name der Variable wird angegeben, gefolgt von einem - Gleichheitszeichen, und dem Wert, der der Variablen zugewiesen werden - soll. Dieser muss in doppelten Anführungszeichen - ("") stehen. Also folgt eine Zuweisung dem Schema - Variablenname = "Wert". - - ############# Start of IPF rules script ######################## - -oif="dc0" # Name der Internet-Schnittstelle -odns="192.0.2.11" # IP des DNS-Servers unseres ISPs -myip="192.0.2.7" # die statische IP, die uns der ISP zugeteilt hat -ks="keep state" -fks="flags S keep state" - -# Sie haben die Wahl, aus diesem Skript eine eigene -# /etc/ipf.rules erstellen zu lassen oder es einfach -# direkt als Skript laufen zu lassen. -# -# Entfernen Sie dazu das eine Kommentarzeichen -# und kommentieren Sie die andere Zeile aus! -# -# 1) Diese Zeile verwenden Sie zur Erstellung von /etc/ipf.rules -#cat > /etc/ipf.rules << EOF -# -# 2) Diese Zeile, wenn Sie direkt mit dem Skript arbeiten wollen -/sbin/ipf -Fa -f - << EOF + deny | drop: Diese Aktionen + sind gleichbedeutend und verwerfen Pakete, die mit + dieser Regel übereinstimmen. + + Es stehen noch weitere Aktionen zur Verfügung. + Einzelheiten finden Sie in &man.ipfw.8;. + + -# Erlaubnis ausgehenden Verkehrs an den Nameserver des ISPs -pass out quick on $oif proto tcp from any to $odns port = 53 $fks -pass out quick on $oif proto udp from any to $odns port = 53 $ks - -# Erlaubnis ausgehenden unsicheren www-Verkehrs -pass out quick on $oif proto tcp from $myip to any port = 80 $fks - -# Erlaubnis ausgehenden sicheren www-Verkehrs https via TLS SSL -pass out quick on $oif proto tcp from $myip to any port = 443 $fks -EOF -################## End of IPF rules script ######################## - - Das ist schon alles. Die Regeln selbst sind im Beispiel nicht - so wichtig - achten Sie auf die Anwendung der Variablenzuweisung - am Anfang und die Verwendung der Variablen im Skript. Falls das - obige Beispiel in einer Datei namens - /etc/ipf.rules.script gespeichert wurde, - können die Regeln mit folgenden Kommando neu geladen - werden: - - &prompt.root; sh /etc/ipf.rules.script - - Es gibt ein Problem mit Regelsatz-Dateien, die Variablen - verwenden: IPF kann mit Variablen nichts anfangen - und kann derartige - Skripte nicht direkt einlesen. + + LOG_AMOUNT + + Erfüllt ein Paket die Selektionskriterien mit dem + Schlüsselwort log, wird dies von + &man.syslogd.8; mit der Annotation + SECURITY protokolliert. Dies erfolgt + allerdings nur, wenn die Anzahl der protokollierten + Pakete der betreffenden Regel die definierte + LOG_AMOUNT-Grenze nicht übersteigt. + Wenn LOG_AMOUNT nicht definiert ist, + wird die Grenze aus dem Wert von + net.inet.ip.fw.verbose_limit + benutzt. Ein Wert von 0 bedeutet + eine unbegrenzte Protokollierung. Wird eine definierte + Grenze erreicht, wird die Protokollierung für diese + Regel deaktiviert. Um die Protokollierung zu + reaktivieren, können Sie den Protokoll- oder Paketzähler + mit ipfw resetlog + zurücksetzen. - Unser kleines Skript kann daher nur auf eine der beiden folgenden - Weisen verwendet werden: + + Die Protokollierung findet statt, nachdem alle + Selektionskriterien geprüft und bevor die endgültige + Aktion auf das Paket angewendet wird. Der + Administrator entscheidet, welche Regel protokolliert + werden soll. + + + - - - Entfernen Sie das Kommentarzeichen der Zeile, die mit - cat beginnt. Kommentieren Sie die Zeile aus, - die mit /sbin/ipf beginnt. Schreiben Sie die - Zeile ipfilter_enable="YES" in die Datei - /etc/rc.conf und rufen Sie dann das Skript - auf, um /etc/ipf.rules zu erstellen oder - zu erneuern. - - - - Deaktivieren Sie IPFILTER in den Systemstart-Skripten, indem - Sie die Zeile ipfilter_enable="NO" in die - Datei /etc/rc.conf eintragen (was auch der - Standard-Einstellung entspricht). - - Fügen Sie ein Skript ähnlich dem folgenden in Ihr - Verzeichnis /usr/local/etc/rc.d/. Es - sinnvoll, dem Skript einen offensichtlichen Namen zu geben, wie - etwa ipf.loadrules.sh. Die Endung - .sh ist dabei verbindlich. - - #!/bin/sh -sh /etc/ipf.rules.script - - Die Zugriffsrechte für die Datei, die das Skript - enthält, müssen für den Eigentümer - root auf Lesen, Schreiben und Ausführen - gesetzt werden. + + PROTO + + Dieser optionale Wert wird verwendet, um einen + beliebigen Protokollnamen oder -nummer aus + /etc/protocols gegen das Paket zu + prüfen. + + - &prompt.root; chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh - - + + SRC + + Nach dem Schlüsslwortfrom muss + die Quelladresse stehen, oder ein Schlüsselwort, das die + Quelladresse darstellt. Eine Adresse wird dargestellt + duch any, me (jede + Adresse dieses Systems), me6 (jede + IPv6-Adresse dieses Systems), oder + table gefolgt von der Nummer der + Tabelle, welche die Adressen enthält. + IP-Adressen können in + CIDR-Notation geschrieben werden. + Beispielsweise 1.2.3.4/25 oder + 1.2.3.4:255.255.255.128. + + - Wenn nun Ihr System startet, werden Ihre IPF-Regeln geladen. - + + SRC_PORT + + Optional kann ein Quellport über eine Nummer oder + einen Namen aus /etc/services + spezifiziert werden. + + - - IPF Regelsätze + + DST + + Nach dem Schlüsselwort to muss + die Zieladresse stehen, oder ein Schlüsselwort, das die + Zieladresse darstellt. Es können die gleichen + Schlüsselwörter und Adressen benutzt werden, die bereits + im SRC-Abschnitt beschrieben wurden. + + - Ein Regelsatz ist eine Gruppe von IPF-Regeln, die anhand der - Werte eines Netzwerkpaketes entscheiden, ob dieses Paket durchgelassen - oder blockiert wird. Der Austausch von Paketen erfolgt immer - zweiseitig in Form einer sogenannten Session. Der Regelsatz der - Firewall verarbeitet sowohl die eingehenden Pakete aus dem - öffentlichen Internet als auch die Pakete, die vom System als - Antwort auf die Ersteren gesendet werden. Jeder Dienst, der via - TCP/IP arbeitet, zum Beispiel - telnet, www oder - mail, ist vordefiniert durch sein Protokoll und - seinen privilegierten Port, an dem er auf Anfragen wartet und - reagieren kann. Pakete, die gezielt einen Dienst ansprechen sollen, - werden von einem unprivilegierten Port des Senders an einen konkreten - privilegierten Port des Zielsystems geschickt. Alle genannten - Parameter (Ports, Adressen usw.) können als Auswahlkriterien zum - erstellen von Regeln eingesetzt werden, die Dienste erlauben oder - blockieren. + + DST_PORT + + Optional kann ein Zielport über eine Nummer oder + einen Namen aus /etc/services + spezifiziert werden. + + - - IPFILTER + + OPTIONS + + Nach der Quell- und Zieladresse können noch weitere + Optionen angegeben werden. Wie der Name bereits sagt, + sind OPTIONS optional. Häufig + verwendete Optionen sind in oder + out, mit denen die Richtug des + Pakets bestimmt wird, icmptypes + gefolgt vom Typ der ICMP-Nachricht, + sowie keep-state. - rule processing order - + Wenn ein Paket auf eine + keep-state-Regel zutrifft, wird + die Firewall eine dynamische Regel erstellen, die dem + bidirektionalen Datenverkehr zwischen den gleichen + Quell- und Zieladressen mit dem gleichen Protokoll + entspricht. + + Dynamische Regeln sind für einen sogenannten + SYN-flood-Angriff + anfällig, bei dem eine riesige Anzahl an dynamischen + Regeln erzeugt wird. Verwenden Sie die Option + limit, um einen solchen Angriff + entgegenzuwirken. Diese Option begrenzt die Anzahl + der gleichzeitig möglichen Sitzungen. Es handelt sich + dabei um einen Zähler, der die Anzahl von dynamischen + Regeln in Kombination mit der Quelladresse verfolgt. + Übersteigt der Zähler den durch limit + definierten Wert, wird das Paket verworfen. - IPF wurde ursprünglich mit einer Regel-Prozess-Logik - geschrieben, die ausschließlich statusfreie Regeln zuließ - und nach dem Prinzip die letzte Regel, die passt, - entscheidet arbeitete. Mit der Zeit erhielt IPF eine - Option sowie Option - für die Anwendung von zustandsorientierten Regeln, was die - Regel-Prozess-Logik signifikant modernisierte. - - Die Anweisungen in diesem Kapitel basieren auf der Verwendung - von Regeln, die diese beiden neuen Optionen verarbeiten. Dies ist - das Framework zur Entwicklung eines Firewallregelsatzes. - - - Wenn Sie mit einer Firewall arbeiten, seien Sie - sehr vorsichtig. Durch wenige Einstellungen - können Sie sich aus Ihrem System - aussperren. Wenn Sie auf der sicheren Seite - sein wollen, führen Sie die Firewall-Konfiguration direkt am - entsprechenden Gerät aus und nicht über eine - Netzwerkverbindung wie bspw. ssh. - + Es stehen noch viele weitere Optionen zur Verfügung. + &man.ipfw.8; enthält eine Beschreibung der einzelnen + Optionen. + + + - IPF Regel-Syntax + Beispiel für einen Regelsatz - - IPFILTER + Dieser Abschnitt die Erstellung eines Firewall-Skripts + namens /etc/ipfw.rules mit + zustandsorientierten (stateful + Regeln. Alle Regeln in diesem Beispiel verwenden die Optionen + in und out, um die + Richtung des Pakets zu verdeutlichen. Zusätzlich wird + via + interface-name benutzt, um die + Schnittstelle für das Paket zu prüfen. - rule syntax - + + Bei den anfänglichen Tests mit dem Firewall-Regelsatz + sollten Sie vielleicht folgende Einstellung + vornehmen: - Die Syntax zur Erstellung der Regeln, die hier vorgestellt wird, - ist dahingehend vereinfacht worden, dass sie ausschliesslich auf - den modernen Regelkontext, mit statusbehafteten Regeln und einer - die erste Regel, die passt, gewinnt-Logik, - zurückgreift. Um alles über die veraltete Syntax zu - erfahren, lesen Sie bitte die Man-Page von &man.ipf.8;. + net.inet.ip.fw.default_to_accept="1" - Ein #-Zeichen markiert den Beginn eines - Kommentars. Es darf nach nach einer Regel stehen oder als erstes - Zeichen einer Zeile. Leere Zeilen werden von der - Regel-Prozess-Logik ignoriert. + Dies legt die Standardregel von &man.ipfw.8; etwas + großzügiger fest, als das voreingestellte + default deny ip from any to any. Dadurch + sinkt die Gefahr, sich nach einem Neustart des Systems + auszusperren. + - Regeln enthalten Schlüsselwörter. Diese - Schlüsselwörter müssen in einer bestimmten Reihenfolge - von links nach rechts in einer Zeile erscheinen. Als solche - identifizierte Schlüsselwörter werden fett wiedergegeben. - Einige Schlüsselwörter haben Unteroptionen, die wiederum - selbst Schlüsselwörter sein und ebenfalls weiter - Unteroptionen einschließen können. + Das Firewall-Skript beginnt mit einem Hinweis, dass es + sich um ein Bourne Shell-Skript handelt. Danach werden alle + vorhandenen Filterregeln gelöscht. Anschließend wird die + Variable cmd erstellt, sodass + ipfw add nicht jedes mal von Hand + eingegeben werden muss. Die Variable pif + repräsentiert die mit dem Internet verbundene + Schnittstelle. - - + #!/bin/sh +# Flush out the list before we begin. +ipfw -q -f flush - ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO - SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG - STATEFUL +# Set rules command prefix +cmd="ipfw -q add" +pif="dc0" # interface name of NIC attached to Internet - ACTION = block | pass + Jetzt folgen die eigentlichen Filterregeln. Diese ersten + beiden Regeln erlauben den Datenverkehr aus dem internen + Netzwerk und über die Loopback-Schnittstelle: - IN-OUT = in | out + # Change xl0 to LAN NIC interface name +$cmd 00005 allow all from any to any via xl0 - OPTIONS = log | quick | on - interface-name +# No restrictions on Loopback Interface +$cmd 00010 allow all from any to any via lo0 - SELECTION = proto value | - source/destination IP | port = number | flags flag-value + Die nächste Regel erlaubt Pakete, für die ein Eintrag + in der dynamischen Zustandstabelle existiert: - PROTO = tcp/udp | udp | tcp | - icmp + $cmd 00101 check-state - SRC_ADD,DST_ADDR = all | from - object to object + Die nächsten Regeln definieren, welche internen Rechner + Verbindungen zu anderen Rechnern im Internet aufbauen dürfen. + Hier werden wieder zustandsorientierte Regeln + verwendet: - OBJECT = IP address | any + # Allow access to public DNS +# Replace x.x.x.x with the IP address of a public DNS server +# and repeat for each DNS server in /etc/resolv.conf +$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state +$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state - PORT_NUM = port number +# Allow access to ISP's DHCP server for cable/DSL configurations. +# Use the first rule and check log for IP address. +# Then, uncomment the second rule, input the IP address, and delete the first rule +$cmd 00120 allow log udp from any to any 67 out via $pif keep-state +#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state - TCP_FLAG = S +# Allow outbound HTTP and HTTPS connections +$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state +$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state - STATEFUL = keep state +# Allow outbound email connections +$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state +$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state - - ACTION +# Allow outbound ping +$cmd 00250 allow icmp from any to any out via $pif keep-state - Die ACTION bestimmt, was mit dem Paket passieren - soll, wenn der Rest der Regel zutrifft. Dieser Teil muss - für jede Regel angegeben werden. - - Das Schlüsselwort block gibt an, dass - das Paket verfallen soll, wenn die Auswahlparameter zutreffen. - - Das Schlüsselwort pass gibt an, dass - das Paket durch die Firewall durchgelassen werden soll, wenn die - Auswahlparameter zutreffen. - +# Allow outbound NTP +$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state - - IN-OUT +# Allow outbound SSH +$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state - Ebenfalls verbindlich ist die Angabe, welchen Teil der - Verbindung, Ein- oder Ausgang, die Regel beeinflussen soll. Das - nächste Schlüsselwort muss daher entweder - in, für eingehend, oder - out, für ausgehend, lauten - oder die Regel - wird aufgrund eines Syntaxfehlers nicht umgesetzt. - - in bedeutet, dass diese Regel auf eingehende - Pakete angewendet wird, die gerade an der dem öffentlichen - Internet zugewandten Schnittstelle empfangen wurden. - - out bedeutet, das diese Regel auf ausgehende - Pakete angewendet wird, also Pakete die gerade gesendet werden und - deren Zieladresse im öffentlichen Internet liegt. - +# deny and log all other outbound connections +$cmd 00299 deny log all from any to any out via $pif - - OPTIONS - - - Die Optionen müssen in der hier aufgeführten - Reihenfolge verwendet werden. - - - log bestimmt, dass die Kopfdaten des Paketes - an die Systemschnittstelle &man.ipl.4; geschrieben werden sollen. - Genaueres dazu weiter unten im Abschnitt LOGGING. - - quick bestimmt, dass, - wenn die Auswahlkriterien der Regel auf das - Paket zutreffen, keine weiteren Regeln ausgewertet werden. So - vermeidet man das Abarbeiten des gesamten Regelsatzes. Diese Option - ist eine verbindliche Vorraussetzung der modernen - Regel-Prozess-Logik. - - on bestimmt den Namen der Schnittstelle, - der als Auswahlkriterium hinzugefügt werden soll. Die Namen - aller verfügbaren Schnittstellen werden durch den Befehl - &man.ifconfig.8; angezeigt. wenn man diese Option verwendet, - passt die Regeln nur auf Pakete, die durch diese Schnittstelle - empfangen (in) oder gesendet - (out) wurden. Für die modernisierte - Regel-Prozess-Logik ist die Verwendung dieser Option - verbindlich. - - Wenn ein Paket protokolliert wird, werden die Kopfdaten in - die Pseudo-Schnittstelle &man.ipl.4; geschrieben. Folgende Parameter - können zusätzlich übergeben werden, müssen dazu - aber direkt nach dem Schlüsselwort log und in - gleicher Reihenfolge stehen: - - body bestimmt, dass die ersten 128 Bytes des - Paketinhaltes zusätzlich zu den Kopfdaten protokolliert - werden. - - first trifft nur zu, wenn das - Schlüsselwort log zusammen mit - keep-state verwendet wird. Es bestimmt, dass nur - das auslösende Paket protokolliert wird und nicht jedes weitere - Paket, dass von der gespeicherten Status-Regel betroffen ist. - + Die folgenden Regeln steuern die Verbindungen von + Rechern aus dem Internet ins interne Netzwerk. Zuerst werden + Pakete verworfen, die typischerweise im Zusammenhang mit + Angriffen stehen. Danach werden bestimmte Arten von + Verbindungen erlaubt. Alle Dienste aus dem öffentlichen + Internet beinhalten die Option limit, um + Flooding zu unterbinden. - - SELECTION + # Deny all inbound traffic from non-routable reserved address spaces +$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP +$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP +$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP +$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config +$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs +$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect +$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast - Die Schlüsselwörter, die in diesem Abschnitt - vorgestellt werden, dienen zur Beschreibung von Attributen, anhand - derer geprüft und entschieden wird, ob eine Regel zutrifft - oder nicht. Es gibt ein Schlüsselwort, und das hat mehrere - Optionen, von denen eine ausgewählt werden muss. Die - folgenden allgemeinen Attribute können beliebig zum Erstellen - einer Regel verwendet werden, allerdings nur in der vorgestellten - Reihenfolge: - +# Deny public pings$ +$cmd 00310 deny icmp from any to any in via $pif$ +$ +# Deny ident$ +$cmd 00315 deny tcp from any to any 113 in via $pif$ +$ +# Deny all Netbios services.$ +$cmd 00320 deny tcp from any to any 137 in via $pif$ +$cmd 00321 deny tcp from any to any 138 in via $pif$ +$cmd 00322 deny tcp from any to any 139 in via $pif$ +$cmd 00323 deny tcp from any to any 81 in via $pif$ - - PROTO +# Deny fragments +$cmd 00330 deny all from any to any frag in via $pif - proto ist das Schlüsselwort für - das im Paket angewendete Protokoll. Als Option ein Protokoll aus - Auswahlkriterium übergeben. Diese Option ist verbindlich, wenn - man die moderne Regel-Prozess-Logik verwendet. - - tcp/udp | udp | tcp | icmp oder irgendein - Protokollname, der in der Datei /etc/protocols - zu finden ist, kann übergeben werden. Außerdem kann das - Schlüsselwort tcp/udp verwendet werden, wenn - sowohl TCP als auch UDP von der - Regel betroffen sein sollen. Dieses Schlüsselwort wurde - eingeführt, um Duplikate sonst identischer Regeln zu - vermeiden. - +# Deny ACK packets that did not match the dynamic rule table +$cmd 00332 deny tcp from any to any established in via $pif - - SRC_ADDR/DST_ADDR +# Allow traffic from ISP's DHCP server. +# Replace x.x.x.x with the same IP address used in rule 00120. +#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state - Das Schlüsselwort all ist ein Synonym - für from any to any ohne weitere - Auswahlkriterien. - - from src to dst: Die Schlüsselwörter - from und to dienen zur Angabe - von Quelle und Ziel in Form von IP-Adressen oder -Bereichen. - Innerhalb einer Regel muss immer beides angegeben werden. - Statt einer Adresse kann auch das Schlüsselwort - any übergeben werden, das für jede - beliebige IP-Adresse steht. Zum Beispiel: - from any to any oder - from 0.0.0.0/0 to any oder - from any to 0.0.0.0/0 oder - from 0.0.0.0 to any oder - from any to 0.0.0.0 bedeuten alle das - Gleiche. - - IP-Bereiche können nur in der CIDR-Notation angegeben - werden. Der Port net-mgmt/ipcalc - hilft Ihnen bei der Berechnung der richtigen Angaben. - Weiterführende Informationen zu CIDR finden Sie auf der Webseite - von ipcalc. - +# Allow HTTP connections to internal web server +$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 - - PORT +# Allow inbound SSH connections +$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 - Wenn ein Port als Auswahlkriterium übergeben wurde, bei - Quelle und/oder Ziel, wird er nur bei TCP und - UDP Paketen verwendet. Angegeben werden kann - entweder die Portnummer oder der Dienstname aus - /etc/services. Die Verwendung der - Portoption mit dem to-Objekt ist verbindlich - für die Verwendung der modernisierten Regel-Prozess-Logik. - Ein Beispiel für die Filterung Paketen von allen Quell-IPs mit - beliebiger Portnummer auf beliebige Ziel-IPs mit der Portnummer 80 - (dem www-Port): - from any to any port = 80. - - - - Einfache Portvergleiche können auf verschiedenen Wegen - erfolgen. Mehrere Vergleichsoperatoren stehen dafür zur - Verfügung. Genauso können Bereiche angegeben - werden. - - port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" - | "ne" | "lt" | "gt" | "le" | "ge". - - Um einen Bereich anzugeben: port "<>" | "><" - - - Genau wie die Trefferspezifikation für Quelle und Ziel - sind auch die beiden folgenden Parameter obligatorisch bei der - Verwendung der modernen Regel-Prozess-Logik. - - +# Reject and log all other incoming connections +$cmd 00499 deny log all from any to any in via $pif - - <acronym>TCP</acronym>_FLAG + Die letzte Regel protokolliert alle Pakete, die mit + keiner Regel im Regelsatz übereinstimmen: - Flags spielen nur beim Filtern von TCP eine - Rolle. Die Buchstaben entsprechen jeweils einem möglichen - Flag, dass in den Kopfdaten der TCP-Pakete - geprueft werden soll. - - Die moderne Regel-Prozess-Logik verwendet den Parameter - flags S um eine Anfrage zum Start einer - TCP-Session zu identifizieren. - + # Everything else is denied and logged +$cmd 00999 deny log all from any to any + - - STATEFUL + + + <acronym>NAT</acronym> Konfiguration - keep state zeigt bei einer Passage-Regel an, - dass für alle Pakete, die die Selektion erfolgreich durchlaufen, - Stateful Filtering eingerichtet werden - soll. - - - Diese Option ist obligatorisch für die Verwendung der - modernen Prozess-Regel-Logik. - - - - - - Stateful Filtering + + + + Chern + Lee + + Beigetragen von + + + - IPFILTER - - stateful filtering + NAT + und IPFW - + &os;s integrierter NAT-Daemon, + &man.natd.8;, arbeitet in Verbindung mit + IPFW, um + Network Address Translation + bereitzustellen. NAT wird verwendet, um + mehreren internen Rechnern, über eine einzige + IP-Adresse, eine gemeinsame Verbindung zum + Internet zu ermöglichen. - Stateful filtering treats traffic as a bi-directional - exchange of packets comprising a session conversation. When - activated, keep-state dynamically generates internal rules for - each anticipated packet being exchanged during the - bi-directional session conversation. It has sufficient matching - capabilities to determine if the session conversation between the - originating sender and the destination are following the valid - procedure of bi-directional packet exchange. Any packets that - do not properly fit the session conversation template are - automatically rejected as impostors. - - Keep state will also allow ICMP packets related to a - TCP or UDP session through. So if you get - ICMP type 3 code 4 in response to some web surfing allowed out - by a keep state rule, they will be automatically allowed in. - Any packet that IPF can be certain is part of an active - session, even if it is a different protocol, will be let - in. - - What happens is: - - Packets destined to go out through the interface connected to the - public Internet are first checked against the dynamic state - table. If the packet matches the next expected packet - comprising an active session conversation, then it exits the - firewall and the state of the session conversation flow is - updated in the dynamic state table. Packets that do not belong to - an already active session, are simply checked against the outbound - ruleset. - - Packets coming in from the interface connected to the public - Internet are first checked against the dynamic state table. If - the packet matches the next expected packet comprising an - active session conversation, then it exits the firewall and - the state of the session conversation flow is updated in the - dynamic state table. Packets that do not belong to an already active - session, are simply checked against the inbound ruleset. - - When the conversation completes it is removed from the - dynamic state table. - - Stateful filtering allows you to focus on blocking/passing - new sessions. If the new session is passed, all its subsequent - packets will be allowed through automatically and any impostors - automatically rejected. If a new session is blocked, none of - its subsequent packets will be allowed through. Stateful - filtering has technically advanced matching abilities - capable of defending against the flood of different attack - methods currently employed by attackers. - + Um dies zu tun, muss der mit dem Internet verbundene + &os;-Rechner als Gateway eingerichtet sein. Das System muss + über zwei Netzwerkschnittstellen verfügen, wobei eine + Schnittstelle mit dem Internet verbunden ist und die andere + mit dem internen Netzwerk. Jeder Rechner im internen Netzwerk + sollte eine RFC + 1918 konforme Adresse zugewiesen bekommen. Zudem + muss das Standard-Gateway der Rechner auf die interne + IP-Adresse des &man.natd.8;-Systems + gesetzt werden. - - + Es ist noch ein wenig Konfiguration nötig, um die + NAT-Funktion von + IPFW zu aktivieren. Wenn das + System einen angepassten Kernel hat, muss die + Kernelkonfigurationsdatei die Zeile + option IPDIVERT sowie weitere + IPFIREWALL-Optionen, die in beschrieben sind, + enthalten. - Inclusive Ruleset Example + Um die NAT-Unterstützung beim Booten + zu aktivieren, müssen folgende Einträge in + /etc/rc.conf vorhanden sein: - The following ruleset is an example of how to code a very - secure inclusive type of firewall. An inclusive firewall only - allows services matching pass rules through, and blocks all - others by default. Firewalls intended to protect other machines, - also called network firewalls, should have at least - two interfaces, which are generally configured to trust one side - (the LAN) and not the other (the public Internet). Alternatively, - a firewall might be configured to protect only the system it is - running on—this is called a - host based firewall, and is particularly appropriate - for servers on an untrusted network. - - All &unix; flavored systems including &os; are designed to - use interface lo0 and IP address - 127.0.0.1 for internal - communication within the operating system. The firewall rules - must contain rules to allow free unmolested movement of these - special internally used packets. - - The interface which faces the public Internet is the one - to place the rules that authorize and control access of the outbound - and inbound connections. This can be your user PPP - tun0 interface or your NIC that is - connected to your DSL or cable modem. - - In cases where one or more NICs are cabled to private network - segments, those interfaces may require rules to allow packets - originating from those LAN interfaces transit to each other and/or - to the outside (Internet). - - The rules should be organized into three major - sections: first trusted interfaces, then the public - interface outbound, and last the public untrusted interface inbound. - - The rules in each of the public interface sections should - have the most frequently matched rules placed before less - commonly matched rules, with the last rule in the section - blocking and logging all packets on that interface and - direction. - - The Outbound section in the following ruleset only - contains pass rules which contain selection values that - uniquely identify the service that is authorized for public - Internet access. All the rules have the quick, on, - proto, port, and keep state options set. The proto - tcp rules have the flag option included to identify the - session start request as the triggering packet to activate the - stateful facility. - - The Inbound section has all the blocking of undesirable - packets first, for two different reasons. The first is that - malicious packets may be partial matches for legitimate traffic. - These packets have to be discarded rather than allowed in, based on - their partial matches against allow rules. - The second reason is that known and uninteresting rejects may be - blocked silently, rather than being caught and logged by the last - rules in the section. The final rule in each section, blocks and - logs all packets and can be used to create the legal evidence needed - to prosecute the people who are attacking your system. - - Another thing that should be taken care of, is to ensure there is no - response returned for any of the undesirable traffic. Invalid - packets should just get dropped and vanish. This way the attacker - has no knowledge if his packets have reached your system. The - less the attackers can learn about your system, the more - time they must invest before actually doing something bad. - Rules that include a log first option, will only - log the event the first time they are triggered. This option is - included in the sample nmap OS fingerprint rule. - The security/nmap utility is - commonly used by attackers who attempt to identify the operating - system of your server. - - Any time there are logged messages on a rule with - the log first option, an ipfstat -hio - command should be executed to evaluate how many times the rule has - actually matched. Large number of matches usually indicate that the - system is being flooded (i.e.: under attack). - - The /etc/services file may be used to - lookup unknown port numbers. Alternatively, - visit http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers - and do a port number lookup to find the purpose of a particular - port number. - - Check out this link for port numbers used by Trojans http://www.sans.org/security-resources/idfaq/oddports.php. - - The following ruleset creates a complete and very secure - inclusive type of firewall ruleset that has been - tested on production systems. It can be easily modified for your - own system. Just comment out any pass rules for - services that should not be authorized. - - To avoid logging unwanted messages, - just add a block rule in the inbound section. - - The dc0 interface name has to be changed - in every rule to the real interface name of the NIC - card that connects your system to the public Internet. For - user PPP it would be tun0. - - Add the following statements to - /etc/ipf.rules: - - ################################################################# -# No restrictions on Inside LAN Interface for private network -# Not needed unless you have LAN -################################################################# + gateway_enable="YES" # enables the gateway +natd_enable="YES" # enables NAT +natd_interface="rl0" # specify interface name of NIC attached to Internet +natd_flags="-dynamic -m" # -m = preserve port numbers; additional options are listed in &man.natd.8; -#pass out quick on xl0 all -#pass in quick on xl0 all + + Es ist auch möglich eine Konfigurationsdatei zu + verwenden, welche die Optionen enthält, die an + &man.natd.8; übergeben werden: -################################################################# -# No restrictions on Loopback Interface -################################################################# -pass in quick on lo0 all -pass out quick on lo0 all + natd_flags="-f /etc/natd.conf" -################################################################# -# Interface facing Public Internet (Outbound Section) -# Match session start requests originating from behind the -# firewall on the private network -# or from this gateway server destined for the public Internet. -################################################################# - -# Allow out access to my ISP's Domain name server. -# xxx must be the IP address of your ISP's DNS. -# Dup these lines if your ISP has more than one DNS server -# Get the IP addresses from /etc/resolv.conf file -pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state -pass out quick on dc0 proto udp from any to xxx port = 53 keep state + Die angegebene Datei muss die Konfigurationsoptionen + enthalten, eine Option pro Zeile. Zum Beispiel: -# Allow out access to my ISP's DHCP server for cable or DSL networks. -# This rule is not needed for 'user ppp' type connection to the -# public Internet, so you can delete this whole group. -# Use the following rule and check log for IP address. -# Then put IP address in commented out rule & delete first rule -pass out log quick on dc0 proto udp from any to any port = 67 keep state -#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state + redirect_port tcp 192.168.0.2:6667 6667 +redirect_port tcp 192.168.0.3:80 80 + Weitere Informationen zu dieser Konfigurationsdatei + finden Sie in &man.natd.8;. + -# Allow out non-secure standard www function -pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state + Als nächstes werden die NAT-Regeln + hinzugefügt. Wenn die Regeln zustandsorientiert sind, ist die + Platzierung der NAT-Regeln sehr wichtig und + die skipto-Aktion wird verwendet. Dies + erfordert, dass jede Regel über eine eindeutige Nummer + verfügt, um eindeutige Sprungziele zu erhalten. -# Allow out secure www function https over TLS SSL -pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state + Das folgende Beispiel baut auf dem im vorherigen Abschnitt + gezeigten Firewall-Relgelsatz auf. Es werden einige neue + Einträge hinzugefügt und bestehende Regeln modifiziert, um + NAT zu konfigurieren. Zunächst werden + einige Variablen hinzugefügt, darunter Regelnummern, die + keep-state-Option und eine Liste mit + TCP-Ports um die Anzahl der Regeln zu + reduzieren: -# Allow out send & get email function -pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state -pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state + #!/bin/sh +ipfw -q -f flush +cmd="ipfw -q add" +skip="skipto 500" +pif=dc0 +ks="keep-state" +good_tcpo="22,25,37,53,80,443,110" -# Allow out Time -pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state + Die NAT-Regel für eingehende Pakete + wird nach den beiden Regeln, die das + interne Netzwerk und die Loopback-Schnittstelle erlauben und + vor der + check-state-Regel eingefügt. Es ist + wichtig, dass die Nummer der NAT-Regel + (in diesem Beispiel 100) höher ist, als + die beiden vorherigen Regeln und niedriger, als die + check-state-Regel: -# Allow out nntp news -pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state + $cmd 005 allow all from any to any via xl0 # exclude LAN traffic +$cmd 010 allow all from any to any via lo0 # exclude loopback traffic +$cmd 100 divert natd ip from any to any in via $pif # NAT any inbound packets +# Allow the packet through if it has an existing entry in the dynamic rules table +$cmd 101 check-state -# Allow out gateway & LAN users' non-secure FTP ( both passive & active modes) -# This function uses the IPNAT built in FTP proxy function coded in -# the nat rules file to make this single rule function correctly. -# If you want to use the pkg_add command to install application packages -# on your gateway system you need this rule. -pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state + Die Regeln für den ausgehenden Verkehr werden ebenfalls + modifiziert, um Aktionen mit der + $skipto-Variable zu erlauben und + anzuzeigen, dass die Prüfung mit der Regel + 500 fortgesetzt wird. Die sieben Regeln + für TCP wurden durch die Regel + 125 ersetzt, da die sieben erlaubten + ausgehenden Ports in der Variable + $good_tcp0 enthalten sind. -# Allow out ssh/sftp/scp (telnet/rlogin/FTP replacements) -# This function is using SSH (secure shell) -pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state + # Authorized outbound packets +$cmd 120 $skip udp from any to x.x.x.x 53 out via $pif $ks +$cmd 121 $skip udp from any to x.x.x.x 67 out via $pif $ks +$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks +$cmd 130 $skip icmp from any to any out via $pif $ks -# Allow out insecure Telnet -pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state + Die eingehenden Regeln bleiben unverändert, mit Ausnahme + der letzten Regel, in der das + via $pif entfert wird, um ein- und + ausgehende Pakete prüfen zu können. Nach der letzten Regel + für ausgehende Pakete muss die NAT-Regel + folgen. Die Regel muss eine höhere Nummer als die letzte + Regel haben und die Nummer muss über die + skipto-Aktion referenziert werden. In + diesem Regelsatz leitet die Regel mit der Nummer + 500 alle ausgehenden Pakete zur + Weiterverarbeitung an &man.natd.8; weiter. Die darauf + folgende Regel lässt alle von NAT + verarbeiteten Pakete passieren. -# Allow out FreeBSD CVSup -pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state + $cmd 499 deny log all from any to any +$cmd 500 divert natd ip from any to any out via $pif # skipto location for outbound stateful rules +$cmd 510 allow ip from any to any -# Allow out ping to public Internet -pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state + In diesem Beispiel steuern die Regeln + 100, 101, + 125, 500 und + 510 die Adressübersetzung der ein- und + ausgehende Pakete, so dass immer die private + LAN IP-Adresse in der + dynamische Zustandstabelle registriert werden. -# Allow out whois from LAN to public Internet -pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state + Nehmen wir beispielsweise einen Web-Browser, der neue + HTTP-Sitzungen über Port 80 aufbaut. Wenn + nun das erste ausgehende Paket von der Firewall geprüft wird, + trifft es nicht auf Regel 100 zu, da das + Paket nach außen geleitet wird und nicht nach innen. Das + Paket trifft auch nicht auf Regel 101 zu, + da es das erste ist und somit noch nicht in der dynamischen + Zustandstabelle enthalten ist. Das Paket entspricht + schließlich Regel 125, da es ausgehend auf + einem erlaubten Port gesendet wird und von einer + IP-Adresse aus dem internen + LAN stammt. Für Pakete, die auf diese + Regel zutreffen, werden zwei Aktionen ausgeführt. Zuerst + wird durch die Aktion keep-state ein + dynamischer Eintrag in der Statustabelle erstellt und die + angegebene Aktion skipto 500 ausgeführt. + Als nächstes durchläuft das Paket NAT und + wird dann an das Internet gesendet. Nachdem dieses Paket am + Webserver angekommen ist, wird dort eine Antwort erzeugt und + zurückgeschickt. Dieses Paket wird wieder von oben nach unten + durch das Regelwerk geprüft. Dieses Mal trifft Regel + 100 auf das Paket zu und die Zieladresse + wird auf die zugehörige (lokale) + LAN-Adresse abgebildet. Danach wird das + Paket von der Regel check-state + verarbeitet. Die Zustandstabelle erkennt, dass eine + zugehörige aktive Sitzung vorliegt und das Paket wird + freigegeben und in das LAN geleitet. -# Block and log only the first occurrence of everything -# else that's trying to get out. -# This rule implements the default block -block out log first quick on dc0 all - -################################################################# -# Interface facing Public Internet (Inbound Section) -# Match packets originating from the public Internet -# destined for this gateway server or the private network. -################################################################# + Für den eingehenden Datenverkehr muss der Regelsatz + unerwünschte Pakete blockieren und Pakete für autorisierte + Dienste durchlassen. Ein Paket, das mit einer Regel für den + eingehenden Datenverkehr übereinstimmt, wird in der + dynamischen Zustandstabelle eingetragen und dann an das + LAN freigegeben. Das Antwortpaket wird + von der Regel check-state als Paket einer + aktiven Sitzung erkannt. Das Paket wird dann von Regel + 500 per NAT + verarbeitet, bevor es über die externe Schnittstelle versendet + wird. -# Block all inbound traffic from non-routable or reserved address spaces -block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP -block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP -block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP -block in quick on dc0 from 127.0.0.0/8 to any #loopback -block in quick on dc0 from 0.0.0.0/8 to any #loopback -block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config -block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs -block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect -block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast - -##### Block a bunch of different nasty things. ############ -# That I do not want to see in the log - -# Block frags -block in quick on dc0 all with frags - -# Block short tcp packets -block in quick on dc0 proto tcp all with short - -# block source routed packets -block in quick on dc0 all with opt lsrr -block in quick on dc0 all with opt ssrr - -# Block nmap OS fingerprint attempts -# Log first occurrence of these so I can get their IP address -block in log first quick on dc0 proto tcp from any to any flags FUP - -# Block anything with special options -block in quick on dc0 all with ipopts - -# Block public pings -block in quick on dc0 proto icmp all icmp-type 8 - -# Block ident -block in quick on dc0 proto tcp from any to any port = 113 - -# Block all Netbios service. 137=name, 138=datagram, 139=session -# Netbios is MS/Windows sharing services. -# Block MS/Windows hosts2 name server requests 81 -block in log first quick on dc0 proto tcp/udp from any to any port = 137 -block in log first quick on dc0 proto tcp/udp from any to any port = 138 -block in log first quick on dc0 proto tcp/udp from any to any port = 139 -block in log first quick on dc0 proto tcp/udp from any to any port = 81 - -# Allow traffic in from ISP's DHCP server. This rule must contain -# the IP address of your ISP's DHCP server as it is the only -# authorized source to send this packet type. Only necessary for -# cable or DSL configurations. This rule is not needed for -# 'user ppp' type connection to the public Internet. -# This is the same IP address you captured and -# used in the outbound section. -pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state + + Weiterleitung von Ports -# Allow in standard www function because I have apache server -pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state + Der Nachteil von &man.natd.8; ist, dass die Rechner im + LAN nicht aus dem Internet zugänglich + sind. Diese Rechner können zwar ausgehende Verbindungen + zur Außenwelt aufbauen, jedoch keine eingehenden + Verbindungen empfangen. Dies stellt ein Problem dar, wenn + Sie auf einem Rechner im LAN Dienste + anbieten möchten, die aus dem Internet erreichbar sein + sollen. In diesem Fall können Sie die Ports, welche über + das Internet erreichbar sein sollen, über die + &man.natd.8;-Maschine an den Rechner im + LAN weiterleiten. -# Allow in non-secure Telnet session from public Internet -# labeled non-secure because ID/PW passed over public Internet as clear text. -# Delete this sample group if you do not have telnet server enabled. -#pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state - -# Allow in secure FTP, Telnet, and SCP from public Internet -# This function is using SSH (secure shell) -pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state - -# Block and log only first occurrence of all remaining traffic -# coming into the firewall. The logging of only the first -# occurrence avoids filling up disk with Denial of Service logs. -# This rule implements the default block. -block in log first quick on dc0 all -################### End of rules file ##################################### - + Angenommen es gibt einen IRC-Server + auf Rechner A und einen Webserver + auf Rechner B. Damit dies + funktioniert, müssen die Verbindungen auf den Ports 6667 + (IRC) und 80 (HTTP) + an die jeweiligen Rechner weitergeleitet werden. - - <acronym>NAT</acronym> + Die Syntax für + lautet: - NAT + -redirect_port proto targetIP:targetPORT[-targetPORT] + [aliasIP:]aliasPORT[-aliasPORT] + [remoteIP[:remotePORT[-remotePORT]]] - - IP masquerading + Für das obige Beispiel sollten die Argumente wie folgt + aussehen: - NAT - + -redirect_port tcp 192.168.0.2:6667 6667 + -redirect_port tcp 192.168.0.3:80 80 - - network address translation + Damit werden die entsprechenden + TCP-Ports an die Rechner im + LAN weitergeleitet. - NAT - + Portbereiche können über + festgelegt werden. Zum Beispiel würde + tcp 192.168.0.2:2000-3000 + 2000-3000 alle Verbindungen auf die Ports + 2000 bis 3000 an die Ports 2000 bis 3000 an + Rechner A weiterleiten. - NAT stands for Network Address - Translation. To those familiar with &linux;, this concept is - called IP Masquerading; NAT and IP - Masquerading are the same thing. One of the many things the - IPF NAT function enables is the ability to - have a private Local Area Network (LAN) behind the firewall - sharing a single ISP assigned IP address on the public - Internet. - - You may ask why would someone want to do this. ISPs - normally assign a dynamic IP address to their non-commercial - users. Dynamic means that the IP address can be different each - time you dial in and log on to your ISP, or for cable and DSL - modem users, when the modem is power cycled. This dynamic IP - address is used to identify your system to the public Internet. - - Now lets say you have five PCs at home and each one needs - Internet access. You would have to pay your ISP for an - individual Internet account for each PC and have five phone - lines. - - With NAT only a single account is needed - with your ISP. The other four PCs may then be cabled to a switch and - the switch to the NIC in your &os; system which is going to - service your LAN as a gateway. NAT will - automatically translate the private LAN IP address for each - separate PC on the LAN to the single public IP address as it - exits the firewall bound for the public Internet. It also does - the reverse translation for returning packets. - - There is a special range of IP addresses reserved for - NATed private LANs. According to - RFC 1918, the following IP ranges may be used for private nets - which will never be routed directly to the public - Internet: - - - - + Diese Optionen können über + natd_flags="" in + /etc/rc.conf direkt beim Start an + &man.natd.8; übergeben werden. Alternativ können die + Optionen in eine Konfigurationsdatei eingetragen + werden. - + Weitere Konfigurationsmöglichkeiten sind in + &man.natd.8; beschrieben. + - + + Weiterleiten von Adressen - - - Start IP 10.0.0.0 + Das Weiterleiten von Adressen ist nützlich, wenn + mehr als eine IP-Adresse zur Verfügung + steht. Jeder Rechner im LAN kann über + &man.natd.8; seine eigene externe + IP-Adresse zugewiesen bekommen. + &man.natd.8; wird dann den ausgehenden Datenverkehr der + Rechner aus dem LAN mit der + entsprechenden externen IP-Adresse + umschreiben. Auch der eingehenden Datenverkehr über die + externe IP-Adresse wird an die + entsprechenden Rechner im LAN + weitergeleitet. Diese Methode ist auch als + statisches NAT bekannt. Wenn Ihnen + beispielsweise die IP-Adressen + 128.1.1.1, + 128.1.1.2 und + 128.1.1.3 zur + Verfügung stehen, kann 128.1.1.1 als externe + Adresse der &man.natd.8;-Maschine verwendet werden, während + 128.1.1.2 und + 128.1.1.3 an + Rechner A und + Rechner B im LAN + weitergeleitet werden. - - + Die Syntax für + lautet: - Ending IP 10.255.255.255 - + -redirect_address localIP publicIP - - Start IP 172.16.0.0 + + + + + localIP + Die interne IP-Adresse des + Rechners im LAN. + - - + + publicIP + Die externe IP-Adresse für + den entsprechenden Rechner im + LAN. + + + + - Ending IP 172.31.255.255 - + Für das obige Beispiel sollten die Argumente wie + folgt aussehen: - - Start IP 192.168.0.0 + -redirect_address 192.168.0.2 128.1.1.2 +-redirect_address 192.168.0.3 128.1.1.3 - - + Genau wie bei , werden + diese Argumente innerhalb der + /etc/rc.conf-Option + natd_flags="" angegeben, oder alternativ + über eine Konfigurationsdatei. Allerdings müssen beim + Weiterleiten von Adressen keine Ports umgeleitet werden, da + der gesamte eingehende Datenverkehr einer bestimmte + IP-Adresse weitergeleitet wird. - Ending IP 192.168.255.255 - - - - + Die externe IP-Adresse der + &man.natd.8;-Maschine muss auf der externen Schnittstelle + aktiv und mit einem Alias versehen sein. Weitere + Einzelheiten sind in &man.natd.8; beschrieben. + - - IP<acronym>NAT</acronym> + + Das <application>IPFW</application> Kommando - NAT - - and IPFILTER + ipfw - ipnat - - NAT rules are loaded by using the - ipnat command. Typically the - NAT rules are stored in - /etc/ipnat.rules. See &man.ipnat.8; for - details. - - When changing the NAT rules after - NAT has been started, make your changes to - the file containing the NAT rules, then run the ipnat command with - the flags to delete the internal in use - NAT rules and flush the contents of the - translation table of all active entries. - - To reload the NAT rules issue a command - like this: - - &prompt.root; ipnat -CF -f /etc/ipnat.rules + ipfw kann benutzt werden, um einzelne + Regeln im laufenden Betrieb hinzuzufügen oder zu entfernen. + Problematisch ist jedoch, dass diese Änderungen bei einem + Neustart des Systems verloren gehen. Daher ist es + empfehlenswert, eigene Regeln in einer Datei zu definieren + und diese zu laden, um die Regeln der Firewall im laufenden + Betrieb anzupassen. - To display some statistics about your - NAT, use this command: + ipfw ist auch hilfreich, um die + geladenen Regeln der auf der Konsole auszugeben. + IPFW erzeugt dynamisch einen + Zähler, der jedes Paket, auf das eine Regel zutrifft, zählt. + Dadurch ist es möglich, die Funktion einer Regel zu + überprüfen. - &prompt.root; ipnat -s + Eine Auflistung aller geladenen Regeln erhalten Sie + mit: - To list the NAT table's current - mappings, use this command: + &prompt.root; ipfw list - &prompt.root; ipnat -l + Eine Auflistung aller Regeln inklusive des letzten + Treffers erhalten Sie mit: - To turn verbose mode on, and display information relating - to rule processing and active rules/table entries: + &prompt.root; ipfw -t list - &prompt.root; ipnat -v - + Das nächste Beispiel zeigt Informationen über die Anzahl + der Pakete, die von einer Regel gefiltert wurden sowie die + Regel selbst. Der erste Spalte zeigt die Nummer der + Regel, gefolgt von der Anzahl der gefilterten Pakete + und der Anzahl der Pakete in Bytes. Zum Schluss steht die + Regel selbst: - - IP<acronym>NAT</acronym> Rules + &prompt.root; ipfw -a list - NAT rules are very flexible and can - accomplish many different things to fit the needs of commercial - and home users. - - The rule syntax presented here has been simplified to what - is most commonly used in a non-commercial environment. For a - complete rule syntax description see the &man.ipnat.5; manual - page. + Das folgende Kommando zeigt zusätzlich alle dynamischen + Regeln an: - The syntax for a NAT rule looks - something like this: + &prompt.root; ipfw -d list - map IF LAN_IP_RANGE -> PUBLIC_ADDRESS + Um diese Auflistung um die abgelaufenen + Regeln zu erweitern, geben Sie folgendes Kommando ein: - The keyword map starts the rule. + &prompt.root; ipfw -d -e list - Replace IF with the external - interface. + Hiermit werden alle Zähler auf Null zurückgesetzt: - The LAN_IP_RANGE is what your - internal clients use for IP Addressing, usually this is - something like 192.168.1.0/24. - - The PUBLIC_ADDRESS can either - be the external IP address or the special keyword - 0/32, which means to use the IP address - assigned to IF. - + &prompt.root; ipfw zero - - How <acronym>NAT</acronym> works + Es ist auch möglich, einen spezifischen Zähler + zurückzusetzen: - A packet arrives at the firewall from the LAN with a public - destination. It passes through the outbound filter rules, - NAT gets its turn at the packet and applies - its rules top down, first matching rule wins. - NAT tests each of its rules against the - packet's interface name and source IP address. When a packet's - interface name matches a NAT rule then the - source IP address (i.e.: private LAN IP address) of the packet - is checked to see if it falls within the IP address range - specified to the left of the arrow symbol on the - NAT rule. On a match the packet has its - source IP address rewritten with the public IP address - obtained by the 0/32 keyword. - NAT posts an entry in its internal - NAT table so when the packet returns from - the public Internet it can be mapped back to its original - private IP address and then passed to the filter rules for - processing. - + &prompt.root; ipfw zero NUM - - Enabling IP<acronym>NAT</acronym> + + Protokollierung von Firewall-Nachrichten - To enable IPNAT add these statements to - /etc/rc.conf. + Auch bei aktivierter Protokollierung wird + IPFW von selbst keine Regeln + protokollieren. Der Administrator muss entscheiden, welche + Regeln aus dem Regelwerk protokolliert werden sollen. In + diesen Regeln muss dann das Schlüsselwort + log hinzugefügt werden. Normalerweise + werden nur geblockte Pakete protokolliert. Es ist üblich, + die ipfw default deny everything-Regel am + Ende des Regelwerks mit dem Schlüsselwort + log zu duplizieren. Dadurch ist es + möglich, alle Pakete zu sehen, auf die keine Regel + zutraf. - To enable your machine to route traffic between - interfaces: + Protokollierung ist allerdings ein zweischneidiges + Schwert. Bei mangelnder Vorsicht oder einem DoS-Angriff + wird die Festplatte mit einer enormen Flut von + Protokolldaten belastet. Protokoll-Nachrichten werden nicht + nur an &man.syslogd.8; geschickt, sondern auch auf der + Konsole angezeigt, was dann schnell lästig werden + kann. - gateway_enable="YES" + Die Kerneloption + IPFIREWALL_VERBOSE_LIMIT=5 begrenzt die + Anzahl identischer Nachrichten an &man.syslogd.8; für eine + gegebene Regel auf fünf Nachrichten. Ist diese Option im + Kernel aktiviert, wird nach Erreichen den festgelegten + Anzahl die Protokollierung von aufeinanderfolgenden + Nachrichten auf den festgelegten Wert begrenzt, da + beispielsweise die Speicherung von 200 gleichen + Protokoll-Nachrichten sinnlos ist. Daher werden durch + diese Option nur fünf gleichartige Nachrichten + protokolliert. Alle weiteren Nachrichten werden nur gezählt + und deren Gesamtzahl wird schließlich von &man.syslogd.8; + wie folgt ausgegeben: - To start IPNAT automatically each - time: + Last message repeated 45 times - ipnat_enable="YES" + Alle protokollierten Pakete werden in der Voreinstellung + in /var/log/security gespeichert. Dies + wird in /etc/syslog.conf + definiert. + - To specify where to load the IPNAT rules - from: + + Ein Firewall-Regelwerk erstellen - ipnat_rules="/etc/ipnat.rules" - - - - <acronym>NAT</acronym> for a very large LAN - - For networks that have large numbers of PC's on the LAN or - networks with more than a single LAN, the process of funneling - all those private IP addresses into a single public IP address - becomes a resource problem that may cause problems with the - same port numbers being used many times across many - NATed LAN PC's, causing collisions. There - are two ways to relieve this resource problem. - - - Assigning Ports to Use - - - - - A normal NAT rule would look like: - - map dc0 192.168.1.0/24 -> 0/32 - - In the above rule the packet's source port is unchanged - as the packet passes through IPNAT. By - adding the portmap keyword, - IPNAT can be directed to only use source ports in the specified range. - For example the following rule will tell - IPNAT to modify the source port to be - within the range shown: - - map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000 - - Additionally we can make things even easier by using the - auto keyword to tell - IPNAT to determine by itself which ports - are available to use: - - map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto - - - - Using a Pool of Public Addresses - - In very large LANs there comes a point where there are just too - many LAN addresses to fit into a single public address. If a block - of public IP addresses is available, these addresses can be used as - a pool, and IPNAT may pick one of - the public IP addresses as packet-addresses are mapped on their way - out. - - For example, instead of mapping all packets through a single - public IP address, as in: - - map dc0 192.168.1.0/24 -> 204.134.75.1 - - A range of public IP addresses can be specified either with a - netmask: - - map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 - - or using CIDR notation: - - map dc0 192.168.1.0/24 -> 204.134.75.0/24 - - - - - Port Redirection - - A very common practice is to have a web server, email - server, database server and DNS server each segregated to a - different PC on the LAN. In this case the traffic from these - servers still have to be NATed, but there - has to be some way to direct the inbound traffic to the - correct LAN PCs. IPNAT has the redirection - facilities of NAT to solve this problem. - For example, assuming a web server operating on LAN address 10.0.10.25 and using a single public IP - address of 20.20.20.5 the rule would - be coded as follows: - - rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80 - - or: - - rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80 - - or for a LAN DNS Server on LAN address of 10.0.10.33 that needs to receive - public DNS requests: - - rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp - - - - FTP and <acronym>NAT</acronym> + Die meisten fortgeschrittenen + IPFW-Benutzer erzeugen eine + Datei, welche die Regeln für die Firewall enthält, um diese + als Skript ausführen zu können. Der Vorteil einer + derartigen Konfiguration besteht darin, dass dadurch mehrere + Regeln gleichzeitig geändert und aktiviert werden können, + ohne dass dazu das System neu gestartet werden muss. Dies + ist zudem beim Testen von Regeländerungen sehr hilfreich. + Weil es sich bei der Datei um ein Skript handelt, ist es + auch möglich, häufig verwendete Befehle durch Aliase zu + ersetzen und diese dann in mehreren Regeln zu nutzen. - FTP is a dinosaur left over from the time before the - Internet as it is known today, when research universities were - leased lined together and FTP was used to share files among - research Scientists. This was a time when data security was - not a consideration. Over the years the FTP protocol became - buried into the backbone of the emerging Internet and its - username and password being sent in clear text was never - changed to address new security concerns. FTP has two flavors, - it can run in active mode or passive mode. The difference is - in how the data channel is acquired. Passive mode is more - secure as the data channel is acquired by the ordinal ftp - session requester. For a real good explanation of FTP and the - different modes see http://www.slacksite.com/other/ftp.html. + Die Syntax des folgenden Skripts entspricht der Syntax + von &man.sh.1;, &man.csh.1; sowie &man.tcsh.1;. Felder, die + symbolisch substituiert werden, haben das Präfix $ + (Dollarzeichen). Symbolische Felder haben das + $-Präfix nicht. Der Wert, mit dem das symbolische + Feld belegt wird, muss in doppelten Anführungszeichen + ("") stehen. - - IP<acronym>NAT</acronym> Rules + Die Datei mit den Regeln könnte wie folgt aufgebaut + sein: - IPNAT has a special built in FTP proxy - option which can be specified on the NAT - map rule. It can monitor all outbound packet traffic for FTP - active or passive start session requests and dynamically - create temporary filter rules containing only the port number - really in use for the data channel. This eliminates the - security risk FTP normally exposes the firewall to from - having large ranges of high order port numbers open. - - This rule will handle all the traffic for the internal - LAN: - - map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp - - This rule handles the FTP traffic from the - gateway: - - map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp - - This rule handles all non-FTP traffic from the internal - LAN: - - map dc0 10.0.10.0/29 -> 0/32 - - The FTP map rule goes before our regular map rule. All - packets are tested against the first rule from the top. - Matches on interface name, then private LAN source IP - address, and then is it a FTP packet. If all that matches - then the special FTP proxy creates temp filter rules to let - the FTP session packets pass in and out, in addition to also - NATing the FTP packets. All LAN packets - that are not FTP do not match the first rule and fall - through to the third rule and are tested, matching on - interface and source IP, then are - NATed. - + ############### start of example ipfw rules script ############# +# +ipfw -q -f flush # Delete all rules +# Set defaults +oif="tun0" # out interface +odns="192.0.2.11" # ISP's DNS server IP address +cmd="ipfw -q add " # build rule prefix +ks="keep-state" # just too lazy to key this each time +$cmd 00500 check-state +$cmd 00502 deny all from any to any frag +$cmd 00501 deny tcp from any to any established +$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks +$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks +$cmd 00611 allow udp from any to $odns 53 out via $oif $ks +################### End of example ipfw rules script ############ - - IP<acronym>NAT</acronym> FTP Filter Rules + Die Regeln in diesem Beispiel sind nicht wichtig. + Wichtig ist es, zu zeigen, wie die symbolische Substitution + innerhalb der Regeln verwendet wird. - Only one filter rule is needed for FTP if the - NAT FTP proxy is used. + Wenn dieses Beispiel in + etc/ipfw.rules gespeichert wurde, so + könnten alle Regeln durch die Ausführung des folgenden + Kommandos neu geladen werden: - Without the FTP Proxy, the following three rules will be - needed: + &prompt.root; sh /etc/ipfw.rules - # Allow out LAN PC client FTP to public Internet -# Active and passive modes -pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state + Anstelle von /etc/ipfw.rules kann + ein beliebig anderer Name oder Speicherort verwendet + werden. -# Allow out passive mode data channel high order port numbers -pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state + Alternativ können die einzelnen Befehle dieses Skripts + auch von Hand eingegeben werden: -# Active mode let data channel in from FTP server -pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state + &prompt.root; ipfw -q -f flush +&prompt.root; ipfw -q add check-state +&prompt.root; ipfw -q add deny all from any to any frag +&prompt.root; ipfw -q add deny tcp from any to any established +&prompt.root; ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state +&prompt.root; ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state +&prompt.root; ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state - - IPFW + + IPFILTER (IPF) Firewall - - IPFW + IPFILTER - IPFW ist eine - Stateful-Firewall - für &os;, die sowohl IPv4 als auch - IPv6 unterstützt. Die Firewall setzt sich - aus mehreren Komponenten zusammen: dem Kernel Firewall - Filter-Prozessor mit integriertem Paket-Accounting, - Protokollfunktionen, NAT, dem - &man.dummynet.4; Traffic-Shaper, - sowie Weiterleitungs-, Bridge- und ipstealth-Funktionen. - - &os; enthält mit /etc/rc.firewall ein - Beispielregelwerk, welches mehrere Firewall-Typen für - gebräuchliche Szenarien definiert und unerfahrene Anwender - dabei unterstützen soll, ein geeignetes Regelwerk zu erstellen. - IPFW besitzt eine leistungsstarke - Syntax, mit der erfahrene Benutzer ihre eigenen Regeln - anfertigen können, um den Sicherheitsanforderungen der - jeweiligen Umgebung gerecht zu werden. - - Diser Abschnitt beschreibt, wie - IPFW aktiviert wird und bietet einen - Überblick über die Regelsyntax. Zudem werden mehrere Regelsätze - für gebräuchliche Konfigurationsszenarien vorgestellt. + IPFILTER, auch als + IPF bekannt, ist eine + plattformübergreifende Open Source Firewall, die auf + mehrere Betriebssysteme portiert wurde, einschließlich + &os;, NetBSD, OpenBSD und &solaris;. + + IPFILTER basiert auf einer + kernelseitigen Firewall und einem + NAT-Mechanismus, der durch Anwenderprogramme + gesteuert und überwacht werden kann. Firewallregeln werden mit + ipf gesetzt oder gelöscht. Für die + Manipulation der NAT-Regeln wird + ipnat benutzt. Mit + ipfstat werden Laufzeitstatistiken + der kernelseitigen Anteile von + IPFILTER aufgelistet. Mit + ipmon können die Aktionen von + IPFILTER in Protokolldateien + gespeichert werden. + + IPF wurde ursprünglich mit der + Verarbeitungslogik die letzte passende Regel + gewinnt geschrieben und verwendete ausschließlich + Regeln ohne feste Zustände. Inzwischen wurde + IPF modernisiert und unterstützt nun + auch die Optionen quick und + keep state. + + Antworten auf häufige Fragen finden Sie unter + http://www.phildev.net/ipf/index.html. Ein Archiv + der IPFILTER Mailingliste steht unter + + http://marc.info/?l=ipfilter zur Verfügung. + + Dieser Abschnitt des Handbuchs konzentriert sich auf + IPF unter &os;. Es werden auch + Firewallregeln mit den Optionen quick und + keep state vorgestellt. - - <application>IPFW</application> aktivieren + + <application>IPF</application> aktivieren - IPFW + IPFILTER aktivieren - Das &os; Basissystem enthält für - IPFW ein ladbares Kernelmodul, was - bedeutet, dass kein angepasster Kernel benötigt wird, um - IPFW zu benutzen. + IPF ist in &os; als ladbares + Kernelmodul enthalten. Das bedeutet, dass Sie keinen + angepassten Kernel erzeugen müssen um + IPF zu aktivieren. Kerneloptionen - IPFIREWALL + IPFILTER Kerneloptionen - IPFIREWALL_VERBOSE + IPFILTER_LOG Kerneloptionen - IPFIREWALL_VERBOSE_LIMIT + IPFILTER_DEFAULT_BLOCK - IPFW + IPFILTER Kerneloptionen - Wenn Sie eine statische Unterstützung für - IPFW in den Kernel kompilieren - wollen, lesen Sie . Folgende - Optionen können in der Kernelkonfigurationsdatei verwendet - werden: + Benutzer, die IPF lieber + statisch in den Kernel kompilieren, sollten den Anweisungen in + folgen. Die folgenden + Kerneloptionen stehen zur Verfügung: - options IPFIREWALL # enables IPFW -options IPFIREWALL_VERBOSE # enables logging for rules with log keyword -options IPFIREWALL_VERBOSE_LIMIT=5 # limits number of logged packets per-entry -options IPFIREWALL_DEFAULT_TO_ACCEPT # sets default policy to pass what is not explicitly denied -options IPDIVERT # enables NAT + options IPFILTER +options IPFILTER_LOG +options IPFILTER_LOOKUP +options IPFILTER_DEFAULT_BLOCK - Um IPFW beim Systemstart zu - aktivieren, fügen Sie folgende Zeile in - /etc/rc.conf ein: + options IPFILTER aktiviert die + Unterstützung für IPFILTER. + options IPFILTER_LOG aktiviert die + Protokollierung über die Pseudo-Schnittstelle + ipl für Firewallrelgen, die das + Schlüsselwort log enthalten. + IPFILTER_LOOKUP aktiviert + IP-Pools, um die Suche nach + IP-Adressen zu beschleunigen. + IPFILTER_DEFAULT_BLOCK ändert das + Verhalten der Firewall dahingehend, dass jedes Paket, das + nicht explizit von einer pass-Regel + Zugang erhält, geblockt wird. + + Um IPF während des Bootens zu + aktivieren, müssen folgende Einträge in + /etc/rc.conf hinzugefügt werden. Diese + Einträge aktivieren ebenfalls die Protokollierung und die + Regel default pass all. Um diese + Voreinstellung zu ändern, ohne einen neuen Kernel zu + übersetzen, müssen Sie am Ende der Firewallregeln eine + block all Regel hinzufügen. + + ipfilter_enable="YES" # Start ipf firewall +ipfilter_rules="/etc/ipf.rules" # loads rules definition text file +ipmon_enable="YES" # Start IP monitor log +ipmon_flags="-Ds" # D = start as daemon + # s = log to syslog + # v = log tcp window, ack, seq + # n = map IP & port to names + + Wenn die NAT-Funktionalität benötigt + wird, müssen auch diese Zeilen hinzugefügt werden: + + gateway_enable="YES" # Enable as LAN gateway +ipnat_enable="YES" # Start ipnat function +ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat + + Jetzt können Sie IPF + starten: + + &prompt.root; service ipfilter start + + Um die Firewallregeln zu laden, übergeben Sie den Namen + des Regelwerks an ipf. Mit dem folgenden + Kommando ersetzen Sie alle aktuell geladenen Regeln: - firewall_enable="YES" + &prompt.root; ipf -Fa -f /etc/ipf.rules - Wenn Sie einen der von &os; zur Verfügung gestellten - Firewall-Profile benutzen möchten, fügen Sie eine weitere - Zeile hinzu, in der Sie das Profil bestimmen: + -Fa löscht zunächst alle internen + Regeln und mit -f wird die Datei angegeben, + welche die zu ladenen Regeln enthält. - firewall_type="open" + Damit haben Sie die Möglichkeit, Änderungen an der + laufenden Firewall zu machen, ohne dass das System neu + gestartet werden muss. Da dieser Vorgang beliebig oft + wiederholt werden kann, ist es ein sehr bequemer Weg neue + Regeln zu testen. - Folgende Profile stehen zur Verfügung: + Diese und weitere Optionen sind in &man.ipf.8; + beschrieben. + - - - open: gestattet jeglichen - Datenverkehr. - + + <application>IPF</application> Regel-Syntax - - client: schützt lediglich diesen - Rechner. - + + IPFILTER + Regel-Syntax + - - simple: schützt das gesamte - Netzwerk. - + Mit der hier beschriebenen Regel-Syntax können + zustandsorientierte Regeln erstellt werden. Beim Erstellen + von Regeln ist zu beachten, dass Regeln ohne das Schlüsselwort + quick der Reihe nach geprüft werden und + die letzte zutreffende Regel angewendet wird. + Das bedeutet, dass selbst dann, wenn die erste zutreffende + Regel eine pass-Regel ist, das Paket + dennoch geblockt wird, falls später eine + block-Regel zutrifft. Beispielregelsätze + finden Sie in + /usr/share/examples/ipfilter. + + Beim Erstellen von Regeln wird das Zeichen + # verwendet, um einen Kommentar bis zum + Ende der Zeile einzuleiten. Leere Zeilen werden + ignoriert. - - closed: blockiert den gesamten - IP-Datenverkehr, mit Ausnahme des - Verkehrs über die Loopback-Schnittstelle. - + Die Schlüsselwörter, die in den Regeln verwendet werden, + müssen in einer bestimmten Reihenfolge geschrieben werden, + von links nach rechts. Einige Schlüsselwörter sind + verbindlich, andere sind optional. Einige Schlüsselwörter + haben Unteroptionen, die wiederum selbst Schlüsselwörter sind + und ebenfalls weitere Unteroptionen einschließen können. Die + Reihenfolge der Schlüsselwörter ist wie folgt, wobei die + Wörter in Großbuchstaben eine Variable darstellen und die + Wörter in Kleinbuchstaben der Variable vorangestellt werden + müssen: + + ACTION DIRECTION OPTIONS proto PROTO_TYPE + from SRC_ADDR SRC_PORT to DST_ADDR DST_PORT + TCP_FLAG|ICMP_TYPE keep state STATE + + Dieser Abschnitt beschreibt jedes dieser Schlüsselwörter + und ihre Optionen. Es ist jedoch keine vollständige Liste + aller möglichen Optionen. &man.ipf.5; enthält eine + vollständige Beschreibung der Syntax und einige + Beispiele zur Erstellung von + IPF-Regeln. - - workstation: schützt lediglich - diesen Rechner und verwendet zustandsorientierte - Regeln. - + + + ACTION - - UNKNOWN: deaktiviert das Laden von - Firewallregeln. - + + Dieses Schlüsselwort bestimmt, was mit dem Paket zu + tun ist, wenn es auf eine Regel zutrifft. Jede Regel + muss dieses Schlüsselwort + enthalten. Die folgenden Aktionen werden + erkannt: + + block: Das Paket wird + verworfen. + + pass: Das Paket wird + durchgelassen. + + log: Das Paket wird + protokolliert. + + count: Zählt die Anzahl der + Pakete und die Bytes. Die kann einen Hinweis darauf + geben, wie oft Pakete auf diese Regel zutreffen. + + auth: Das Paket geht in eine + Warteschlange zur Weiterverarbeitung durch ein anderes + Programm. + + call: Ermöglicht den Zugriff auf + eingebaute IPF-Funktionen, + die komplexere Aktionen ermöglichen. - - filename: - absoluter Pfad zu einer Datei, in der die Firewallregeln - definiert sind. - - + decapsulate: Entfernt alle + Header, um den Inhalt des Pakets zu verarbeiten. + + - Wenn Sie firewall_type auf - client oder simple - setzen, müssen Sie die voreingestellten Regeln in - /etc/rc.firewall anpassen, damit sie - der Konfiguration des Systems entsprechen. + + DIRECTION - Beachten Sie, dass das Profil filename - verwendet wird, um ein benutzerdefiniertes Regelwerk zu - laden. + + Als nächstes muss für jede Regel explizit die + Richtung mit einem der folgenden Schlüsselwörter + angegeben werden: + + in: Die Regel wird auf ein + eingehendes Paket angewendet. + + out: Die Regel wird auf ein + ausgehendes Paket angewendet. + + all: Die Regel gilt für beide + Richtungen. + + Wenn das System mehrere Schnittstellen ausweist, + kann die Schnittstelle zusammen mit der Richtung + angegeben werden. Ein Beispiel wäre + in on fxp0. + + - Eine alternative Möglichkeit, um ein benutzerdefiniertes - Regelwerk zu laden, bietet die Variable - firewall_script. Setzen Sie die Variable - auf den absoluten Pfad eines - ausführbaren Skripts, welches die Befehle - für IPFW enthält. Die Beispiele in - diesem Abschnitt gehen davon aus, dass - firewall_script auf - /etc/ipfw.rules gesetzt ist. + + OPTIONS - firewall_script="/etc/ipfw.rules" + + Optionen müssen nicht zwingend angegeben werden. + Falls jedoch mehrere Optionen angegeben werden, müssen + sie in der hier gezeigten Reihenfolge verwendet + werden. + + log: Wenn die Firewall die + angegebene Aktion durchführt, werden die Kopfdaten des + Pakets auf der Pseudo-Schnittstelle &man.ipl.4; + protokolliert. + + quick: Wenn ein Paket mit dieser + Regel übereinstimmt, wird die Aktion für diese Regel + ausgeführt und die Regelprüfung stoppt an dieser + Stelle. + + on: Auf dieses Schlüsselwort muss + der Name der Schnittstelle folgen. Die Regel trifft nur + dann zu, wenn das Paket auf der angegebenen + Schnittstelle in die angegebene Richtung geht. + + Wenn das Schlüsselwort log + verwendet wird, können die folgenden Ausdrücke in + dieser Reihenfolge benutzt werden: + + body: die ersten 128 Bytes des + Paketinhaltes werden zusätzlich zu den Kopfdaten + protokolliert. + + first: trifft nur zu, wenn das + Schlüsselwort log zusammen mit + keep-state verwendet wird. Es + bestimmt, dass nur das auslösende Paket protokolliert + wird und nicht jedes weitere Paket, dass von der + gespeicherten Status-Regel betroffen ist. + + Es stehen noch weitere Optionen zur Rückmeldung + von Fehlern verfügbar. Ausführliche Details finden Sie + in &man.ipf.5;. + + - Die Protokollierung wird mit diesem Eintrag - aktiviert: + + PROTO_TYPE - firewall_logging="YES" + + Der Protokolltyp ist optional. Er ist jedoch + zwingend erforderlich, falls die Regel einen + SRC_PORT oder DST_PORT angeben muss da es den Typ des + Protokolls bestimmt. Wenn Sie das Protokoll angeben, + verwenden Sie das Schlüsselwort + proto, gefolgt von der + Protokollnummer oder dem Namen aus + /etc/protocols. Zum Beispiel + tcp, udp, oder + icmp. Wenn PROTO_TYPE angegeben + wird und SCR_PORT oder DST_PORT ausgelassen werden, + stimmen alle Portnummern für dieses Protokoll mit dieser + Regel überein. + + - Es existiert keine Variable für - /etc/rc.conf, um die Protokollierung zu - begrenzen. Um die Anzahl der Protokoll-Nachrichten pro - Verbindungsversuch zu begrenzen, legen Sie die Anzahl der - Einträge in /etc/sysctl.conf fest: + + SRC_ADDR - net.inet.ip.fw.verbose_limit=5 + + Das Schlüsselwort from ist + verpflichtend und darauf folgt das Schlüsselwort, das + die Quelle des Pakets darstellt. Die Quelle kann ein + Rechnername, eine IP-Adresse gefolgt + von der CIDR-Maske, ein Adresspool + oder das Schlüsselwort all sein. + &man.ipf.5; enthält einige Beispiele. + + IP-Bereiche können nur in der + CIDR-Notation angegeben werden. Der + Port oder das Paket net-mgmt/ipcalc + hilft bei der Berechnung der richtigen + CIDR-Maske. Weiterführende + Informationen finden Sie auf der Webseite + http://jodies.de/ipcalc. + + - Nachdem Sie die Änderungen gespeichert haben, können Sie - die Firewall starten. Um auch die Anzahl der - Protokoll-Nachrichten zu konfigurieren, setzen Sie mit - sysctl den gewünschten Wert: + + SCR_PORT - &prompt.root; service firewall start -&prompt.root; sysctl net.inet.ip.fw.verbose_limit=5 - - - - <application>IPFW</application> Regel-Syntax - - Wenn ein Paket die Firewall betritt, also - von der Firewall geprüft und verarbeitet wird, wird die - erste Regel des Regelwerkes auf das Paket angewandt. Auf - diese Weise wird in aufsteigender Reihenfolge der Regelnummer - mit allen weiteren Regeln verfahren. Falls die - Selektionsparameter einer Regel auf ein Paket zutreffen, wird - das Aktionsfeld der Regel ausgeführt und die Prüfung - des Pakets beendet, nachfolgende Regeln werden also nicht - mehr geprüft. Diese Suchmethode wird als erster - Treffer gewinnt bezeichnet. Falls keine Regel auf - das betreffende Paket zutrifft, wird die obligatorische - IPFW-Rückfallregel mit der Nummer - 65535 angewendet und das Paket wird ohne Rückantwort - verworfen. Wenn das Paket jedoch einer Regel mit dem - Schlüsselwort count, - skipto oder tee - entspricht, wird die Prüfung des Pakets weiter - fortgeführt. Weitere Details darüber, wie diese - Schlüsselwörter die Regelverarbeitung beeinflussen, finden Sie - in &man.ipfw.8;. - - - IPFW - Regel-Syntax - - - Bei der Erstellung der - IPFW-Regeln müssen die - Schlüsselwörter in der folgenden Reihenfolge geschrieben - werden. Einige Schlüsselwörter müssen zwingend angegeben - werden, während andere optional sind. Die Wörter in - Großbuchstaben repräsentieren Variablen und die Wörter in - Kleinbuchstaben müssen den Variablen vorangestellt - werden. Das Zeichen # wird benutzt, um - einen Kommentar einzuleiten und kann am Ende einer Regel oder - in einer eigenen Zeile stehen. Leerzeilen werden - ignoriert. - - CMD RULE_NUMBER set SET_NUMBER ACTION log - LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT - OPTIONS - - Dieser Abschnitt bietet einen Überblick über diese - Schlüsselwörter und deren Optionen. Es ist keine vollständige - Liste aller verfügbaren Optionen. Eine vollständige - Beschreibung der Regel-Syntax, die Sie verwenden können um - IPFW-Regeln zu erstellen, finden - Sie in &man.ipfw.8;. - - - - CMD - Jede Regel muss mit ipfw add - beginnen. + Die Portnummer der Quelle ist optional. Wenn sie + jedoch verwendet wird, muss in der Regel zuerst + PROTO_TYPE angegeben werden. Die Portnummer muss auch + auf das Schlüsselwort proto + folgen. + + Es werden verschiedene Vergleichsoperatoren + unterstützt: = (gleich), + != (nicht gleich), + < (kleiner als), + > (größer als), + <= (kleiner als oder gleich) + >= (größer als oder + gleich). + + Um Portbereiche anzugeben, schreiben Sie zwei + Portnummern zwischen <> + (kleiner als und größer als), + >< (größer als und kleiner + als), oder : (größer als oder gleich + und kleiner als oder gleich). - RULE_NUMBER - - Jede Regel gehört zu einer Nummer zwischen - 1 und 65534. Die - Nummer wird verwendet, um die Reihenfolge der - Regelverarbeitung zu kennzeichnen. Es ist möglich, dass - mehrere Regeln dieselbe Nummer haben. In diesem Fall - werden sie entsprechend der Reihenfolge angewendet, in - der sie aufgenommen wurden. - - + DST_ADDR - - SET_NUMBER - Jede Regel ist einer Set-Nummer - zwischen 0 und 31 - zugeordnet. Sets können einzeln aktiviert oder - deaktiviert werden. Dies macht es möglich, eine Reihe - von Regeln schnell hinzuzufügen oder zu löschen. Wenn - SET_NUMBER nicht angegeben ist, wird - die Regel zu Set 0 - hinzugefügt. + Das Schlüsselwort to ist + verpflichtend und darauf folgt das Schlüsselwort, + welches das Ziel des Pakets darstellt. Dieses Ziel kann + ein Rechnername, eine IP-Adresse + gefolgt von der CIDR-Maske, ein + Adresspool oder das Schlüsselwort all + sein. - ACTION - - Eine Regel kann mit einer der folgenden Aktionen - verknüpft werden. Die festgelegte Aktion wird - ausgeführt, wenn das Paket den Selektionskriterien der - Regel entspricht. - - allow | accept | pass | - permit: All diese Aktionen sind - gleichbedeutend und erlauben Pakete, die mit der Regel - übereinstimmen. - - check-state: Diese Aktion - überprüft die Regel in der dynamischen Zustandstabelle. - Bei einer Übereinstimmung wird die mit der dynamischen - Regel verknüpfte Aktion ausgeführt, andernfalls wird mit - der Prüfung gegen die nächste Regel fortgefahren. Die - Regel check-state hat selbst kein - Selektionskriterium. Sollte keine - check-state-Regel im Regelwerk - vorhanden sein, wird die dynamische Zustandstabelle beim - ersten Vorkommen einer keep-state- - oder limit-Regel überprüft. - - count: Aktualisiert die - Zähler für alle Pakete, die mit dieser Regel - übereinstimmen. Die Prüfung wird mit der nächsten Regel - fortgesetzt. - - deny | drop: Diese Aktionen - sind gleichbedeutend und verwerfen Pakete, die mit - dieser Regel übereinstimmen. - - Es stehen noch weitere Aktionen zur Verfügung. - Einzelheiten finden Sie in &man.ipfw.8;. - - + DST_PORT - - LOG_AMOUNT - Erfüllt ein Paket die Selektionskriterien mit dem - Schlüsselwort log, wird dies von - &man.syslogd.8; mit der Annotation - SECURITY protokolliert. Dies erfolgt - allerdings nur, wenn die Anzahl der protokollierten - Pakete der betreffenden Regel die definierte - LOG_AMOUNT-Grenze nicht übersteigt. - Wenn LOG_AMOUNT nicht definiert ist, - wird die Grenze aus dem Wert von - net.inet.ip.fw.verbose_limit - benutzt. Ein Wert von 0 bedeutet - eine unbegrenzte Protokollierung. Wird eine definierte - Grenze erreicht, wird die Protokollierung für diese - Regel deaktiviert. Um die Protokollierung zu - reaktivieren, können Sie den Protokoll- oder Paketzähler - mit ipfw resetlog - zurücksetzen. - - - Die Protokollierung findet statt, nachdem alle - Selektionskriterien geprüft und bevor die endgültige - Aktion auf das Paket angewendet wird. Der - Administrator entscheidet, welche Regel protokolliert - werden soll. - + Die Portnummer des Ziels ist optional. Wenn sie + jedoch verwendet wird, muss in der Regel zuerst + PROTO_TYPE angegeben werden. Die Portnummer muss auch + auf das Schlüsselwort proto + folgen. - PROTO - - Dieser optionale Wert wird verwendet, um einen - beliebigen Protokollnamen oder -nummer aus - /etc/protocols gegen das Paket zu - prüfen. - - + TCP_FLAG|ICMP_TYPE - - SRC - Nach dem Schlüsslwortfrom muss - die Quelladresse stehen, oder ein Schlüsselwort, das die - Quelladresse darstellt. Eine Adresse wird dargestellt - duch any, me (jede - Adresse dieses Systems), me6 (jede - IPv6-Adresse dieses Systems), oder - table gefolgt von der Nummer der - Tabelle, welche die Adressen enthält. - IP-Adressen können in - CIDR-Notation geschrieben werden. - Beispielsweise 1.2.3.4/25 oder - 1.2.3.4:255.255.255.128. + Wenn tcp als PROTO_TYPE verwendet + wird, können bestimmte TCP-Flags + angegeben werden, die den Zustand einer Verbindung + bestimmen. Mögliche Flags sind: + S (SYN), + A (ACK), + P (PSH), + F (FIN), + U (URG), + R (RST), + C (CWN) und + E (ECN). + + Wenn icmp als PROTO_TYPE + verwendet wird, kann der ICMP-Typ mit + angegeben werden. &man.ipf.5; enthält eine Auflistung + der zulässigen Typen. - SRC_PORT - - Optional kann ein Quellport über eine Nummer oder - einen Namen aus /etc/services - spezifiziert werden. - - + STATE - - DST - Nach dem Schlüsselwort to muss - die Zieladresse stehen, oder ein Schlüsselwort, das die - Zieladresse darstellt. Es können die gleichen - Schlüsselwörter und Adressen benutzt werden, die bereits - im SRC-Abschnitt beschrieben wurden. + Wenn eine pass-Regel das + Schlüsselwort keep state enthält, + wird IPF einen Eintrag in + der dynamischen Zustandstabelle hinzufügen, damit + nachfolgende Pakete dieser Verbindung ebenfalls + durchgelassen werden. IPF + kann den Zustand für TCP, + UDP und + ICMP-Sitzungen verfolgen. + IPF wird jedes Paket, das + zu einer aktiven Sitzung gehört, durchlassen, auch + wenn ein anderes Protokoll verwendet wird. + + Pakete, die über die Schnittstelle zum öffentlichen + Internet raus gehen, werden von + IPF zuerst gegen die + dynamische Zustandstabelle geprüft. Wenn das nächste + Paket dieser aktiven Sitzung mit dem vorherigen Paket + übereinstimmt, verlässt dieses Paket die Firewall und + der Status wird in der dynamischen Zustandstabelle + aktualisiert. Pakete, die nicht zu einer aktiven + Sitzung gehören, werden gegen ausgehende Regeln geprüft. + Eingehende Pakete von der Schnittstelle zum öffentlichen + Internet werden gegen die dynamische Zustandstabelle + geprüft. Wenn das nächste Paket mit der aktiven Sitzung + übereinstimmt, verlässt dieses Paket die Firewall und + der Status wird in der dynamischen Zustandstabelle + aktualisiert. Pakete, die nicht zu einer aktiven + Sitzung gehören, werden gegen eingehende Regeln + geprüft. + + Mehrere Schlüsselwörter können an + keep state angefügt werden. Bei der + Verwendung dieser Schlüsselwörter werden verschiedene + Optionen gesetzt, um die zustandsorientierte Filterung + zu steuern. &man.ipf.5; enthält eine Liste der + verfügbaren Optionen und deren Beschreibungen. + + - - DST_PORT - - Optional kann ein Zielport über eine Nummer oder - einen Namen aus /etc/services - spezifiziert werden. - - + + Beispielregelsatz - - OPTIONS - - Nach der Quell- und Zieladresse können noch weitere - Optionen angegeben werden. Wie der Name bereits sagt, - sind OPTIONS optional. Häufig - verwendete Optionen sind in oder - out, mit denen die Richtug des - Pakets bestimmt wird, icmptypes - gefolgt vom Typ der ICMP-Nachricht, - sowie keep-state. + Dieser Abschnitt beschreibt die Erstellung eines + Regelsatzes, welcher nur entsprechende Dienste erlaubt und + alle anderen Verbindungen blockiert. + + &os; verwendet die Loopback-Schnittstelle + (lo0) und die + IP-Adresse 127.0.0.1 zur internen + Kommunikation. Der Regelsatz muss Regeln enthalten, die + Pakete für diesen internen Verkehr ermöglichen: - Wenn ein Paket auf eine - keep-state-Regel zutrifft, wird - die Firewall eine dynamische Regel erstellen, die dem - bidirektionalen Datenverkehr zwischen den gleichen - Quell- und Zieladressen mit dem gleichen Protokoll - entspricht. + # no restrictions on the loopback interface +pass in quick on lo0 all +pass out quick on lo0 all - Dynamische Regeln sind für einen sogenannten - SYN-flood-Angriff - anfällig, bei dem eine riesige Anzahl an dynamischen - Regeln erzeugt wird. Verwenden Sie die Option - limit, um einen solchen Angriff - entgegenzuwirken. Diese Option begrenzt die Anzahl - der gleichzeitig möglichen Sitzungen. Es handelt sich - dabei um einen Zähler, der die Anzahl von dynamischen - Regeln in Kombination mit der Quelladresse verfolgt. - Übersteigt der Zähler den durch limit - definierten Wert, wird das Paket verworfen. + Die mit dem Internet verbundene Schnittstelle wird für die + Autorisierung und den Zugriff aller ein- und ausgehenden + Verbindungen verwendet. Wenn eine oder mehrere Schnittstellen + mit privaten Netzwerken verbunden sind, müssen Regeln + existieren, die den Datenverkehr aus dem + LAN zwischen den internen Netzwerken oder + ins Internet erlauben. Der Regelsatz sollte in drei Bereiche + unterteilt werden: vertrauenswürdige interne Schnittstellen, + ausgehende Verbindungen über die öffentlichen Schnittstellen + und eingehende Verbindungen über die öffentliche + Schnittstelle. - Es stehen noch viele weitere Optionen zur Verfügung. - &man.ipfw.8; enthält eine Beschreibung der einzelnen - Optionen. - - - - + Diese beiden Regeln erlauben den gesamten Datenverkehr + über eine vertrauenswürdige + LAN-Schnittstelle namens + xl0: + + # no restrictions on inside LAN interface for private network +pass out quick on xl0 all +pass in quick on xl0 all + + Die Regeln für den ein- und ausgehenden Verkehr der + öffentlichen Schnittstelle sollten in einer bestimmten + Reihenfolge geschrieben werden. Zuerst Regeln, die häufiger + übereinstimmen, danach Regeln, die seltener übereinstimmen. + Die letzte Regel blockiert und protokolliert alle Pakete auf + der Schnittstelle. + + Der folgende Regelsatz definiert die ausgehenden Regeln + der öffentlichen Schnittstelle dc0. + Die Regeln prüfen den Zustand und identifizieren bestimmte + Dienste, auf die die internen Systeme zugreifen dürfen. Alle + Regeln verwenden das Schlüsselwort quick + und geben die passenden Portnummern und ggf. auch die + Zieladressen an. + + # interface facing Internet (outbound) +# Matches session start requests originating from or behind the +# firewall, destined for the Internet. + +# Allow outbound access to public DNS servers. +# Replace x.x.x. with address listed in /etc/resolv.conf. +# Repeat for each DNS server. +pass out quick on dc0 proto tcp from any to x.x.x. port = 53 flags S keep state +pass out quick on dc0 proto udp from any to xxx port = 53 keep state - - Beispiel für einen Regelsatz +# Allow access to ISP's specified DHCP server for cable or DSL networks. +# Use the first rule, then check log for the IP address of DHCP server. +# Then, uncomment the second rule, replace z.z.z.z with the IP address, +# and comment out the first rule +pass out log quick on dc0 proto udp from any to any port = 67 keep state +#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state - Dieser Abschnitt die Erstellung eines Firewall-Skripts - namens /etc/ipfw.rules mit - zustandsorientierten (stateful - Regeln. Alle Regeln in diesem Beispiel verwenden die Optionen - in und out, um die - Richtung des Pakets zu verdeutlichen. Zusätzlich wird - via - interface-name benutzt, um die - Schnittstelle für das Paket zu prüfen. +# Allow HTTP and HTTPS +pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state +pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state - - Bei den anfänglichen Tests mit dem Firewall-Regelsatz - sollten Sie vielleicht folgende Einstellung - vornehmen: +# Allow email +pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state +pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state - net.inet.ip.fw.default_to_accept="1" +# Allow NTP +pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state - Dies legt die Standardregel von &man.ipfw.8; etwas - großzügiger fest, als das voreingestellte - default deny ip from any to any. Dadurch - sinkt die Gefahr, sich nach einem Neustart des Systems - auszusperren. - - - Das Firewall-Skript beginnt mit einem Hinweis, dass es - sich um ein Bourne Shell-Skript handelt. Danach werden alle - vorhandenen Filterregeln gelöscht. Anschließend wird die - Variable cmd erstellt, sodass - ipfw add nicht jedes mal von Hand - eingegeben werden muss. Die Variable pif - repräsentiert die mit dem Internet verbundene - Schnittstelle. - - #!/bin/sh -# Flush out the list before we begin. -ipfw -q -f flush - -# Set rules command prefix -cmd="ipfw -q add" -pif="dc0" # interface name of NIC attached to Internet - - Jetzt folgen die eigentlichen Filterregeln. Diese ersten - beiden Regeln erlauben den Datenverkehr aus dem internen - Netzwerk und über die Loopback-Schnittstelle: - - # Change xl0 to LAN NIC interface name -$cmd 00005 allow all from any to any via xl0 - -# No restrictions on Loopback Interface -$cmd 00010 allow all from any to any via lo0 - - Die nächste Regel erlaubt Pakete, für die ein Eintrag - in der dynamischen Zustandstabelle existiert: - - $cmd 00101 check-state - - Die nächsten Regeln definieren, welche internen Rechner - Verbindungen zu anderen Rechnern im Internet aufbauen dürfen. - Hier werden wieder zustandsorientierte Regeln - verwendet: - - # Allow access to public DNS -# Replace x.x.x.x with the IP address of a public DNS server -# and repeat for each DNS server in /etc/resolv.conf -$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state -$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state - -# Allow access to ISP's DHCP server for cable/DSL configurations. -# Use the first rule and check log for IP address. -# Then, uncomment the second rule, input the IP address, and delete the first rule -$cmd 00120 allow log udp from any to any 67 out via $pif keep-state -#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state - -# Allow outbound HTTP and HTTPS connections -$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state -$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state - -# Allow outbound email connections -$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state -$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state - -# Allow outbound ping -$cmd 00250 allow icmp from any to any out via $pif keep-state - -# Allow outbound NTP -$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state - -# Allow outbound SSH -$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state - -# deny and log all other outbound connections -$cmd 00299 deny log all from any to any out via $pif - - Die folgenden Regeln steuern die Verbindungen von - Rechern aus dem Internet ins interne Netzwerk. Zuerst werden - Pakete verworfen, die typischerweise im Zusammenhang mit - Angriffen stehen. Danach werden bestimmte Arten von - Verbindungen erlaubt. Alle Dienste aus dem öffentlichen - Internet beinhalten die Option limit, um - Flooding zu unterbinden. - - # Deny all inbound traffic from non-routable reserved address spaces -$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP -$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP -$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP -$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback -$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback -$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config -$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs -$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect -$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast - -# Deny public pings$ -$cmd 00310 deny icmp from any to any in via $pif$ -$ -# Deny ident$ -$cmd 00315 deny tcp from any to any 113 in via $pif$ -$ -# Deny all Netbios services.$ -$cmd 00320 deny tcp from any to any 137 in via $pif$ -$cmd 00321 deny tcp from any to any 138 in via $pif$ -$cmd 00322 deny tcp from any to any 139 in via $pif$ -$cmd 00323 deny tcp from any to any 81 in via $pif$ - -# Deny fragments -$cmd 00330 deny all from any to any frag in via $pif - -# Deny ACK packets that did not match the dynamic rule table -$cmd 00332 deny tcp from any to any established in via $pif - -# Allow traffic from ISP's DHCP server. -# Replace x.x.x.x with the same IP address used in rule 00120. -#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state - -# Allow HTTP connections to internal web server -$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 - -# Allow inbound SSH connections -$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 - -# Reject and log all other incoming connections -$cmd 00499 deny log all from any to any in via $pif - - Die letzte Regel protokolliert alle Pakete, die mit - keiner Regel im Regelsatz übereinstimmen: - - # Everything else is denied and logged -$cmd 00999 deny log all from any to any - - - - - <acronym>NAT</acronym> Konfiguration - - - - - Chern - Lee - - Beigetragen von - - - - - - NAT - und IPFW - - - &os;s integrierter NAT-Daemon, - &man.natd.8;, arbeitet in Verbindung mit - IPFW, um - Network Address Translation - bereitzustellen. NAT wird verwendet, um - mehreren internen Rechnern, über eine einzige - IP-Adresse, eine gemeinsame Verbindung zum - Internet zu ermöglichen. - - Um dies zu tun, muss der mit dem Internet verbundene - &os;-Rechner als Gateway eingerichtet sein. Das System muss - über zwei Netzwerkschnittstellen verfügen, wobei eine - Schnittstelle mit dem Internet verbunden ist und die andere - mit dem internen Netzwerk. Jeder Rechner im internen Netzwerk - sollte eine RFC - 1918 konforme Adresse zugewiesen bekommen. Zudem - muss das Standard-Gateway der Rechner auf die interne - IP-Adresse des &man.natd.8;-Systems - gesetzt werden. - - Es ist noch ein wenig Konfiguration nötig, um die - NAT-Funktion von - IPFW zu aktivieren. Wenn das - System einen angepassten Kernel hat, muss die - Kernelkonfigurationsdatei die Zeile - option IPDIVERT sowie weitere - IPFIREWALL-Optionen, die in beschrieben sind, - enthalten. - - Um die NAT-Unterstützung beim Booten - zu aktivieren, müssen folgende Einträge in - /etc/rc.conf vorhanden sein: - - gateway_enable="YES" # enables the gateway -natd_enable="YES" # enables NAT -natd_interface="rl0" # specify interface name of NIC attached to Internet -natd_flags="-dynamic -m" # -m = preserve port numbers; additional options are listed in &man.natd.8; - - - Es ist auch möglich eine Konfigurationsdatei zu - verwenden, welche die Optionen enthält, die an - &man.natd.8; übergeben werden: - - natd_flags="-f /etc/natd.conf" - - Die angegebene Datei muss die Konfigurationsoptionen - enthalten, eine Option pro Zeile. Zum Beispiel: - - redirect_port tcp 192.168.0.2:6667 6667 -redirect_port tcp 192.168.0.3:80 80 - - Weitere Informationen zu dieser Konfigurationsdatei - finden Sie in &man.natd.8;. - - - Als nächstes werden die NAT-Regeln - hinzugefügt. Wenn die Regeln zustandsorientiert sind, ist die - Platzierung der NAT-Regeln sehr wichtig und - die skipto-Aktion wird verwendet. Dies - erfordert, dass jede Regel über eine eindeutige Nummer - verfügt, um eindeutige Sprungziele zu erhalten. - - Das folgende Beispiel baut auf dem im vorherigen Abschnitt - gezeigten Firewall-Relgelsatz auf. Es werden einige neue - Einträge hinzugefügt und bestehende Regeln modifiziert, um - NAT zu konfigurieren. Zunächst werden - einige Variablen hinzugefügt, darunter Regelnummern, die - keep-state-Option und eine Liste mit - TCP-Ports um die Anzahl der Regeln zu - reduzieren: - - #!/bin/sh -ipfw -q -f flush -cmd="ipfw -q add" -skip="skipto 500" -pif=dc0 -ks="keep-state" -good_tcpo="22,25,37,53,80,443,110" - - Die NAT-Regel für eingehende Pakete - wird nach den beiden Regeln, die das - interne Netzwerk und die Loopback-Schnittstelle erlauben und - vor der - check-state-Regel eingefügt. Es ist - wichtig, dass die Nummer der NAT-Regel - (in diesem Beispiel 100) höher ist, als - die beiden vorherigen Regeln und niedriger, als die - check-state-Regel: - - $cmd 005 allow all from any to any via xl0 # exclude LAN traffic -$cmd 010 allow all from any to any via lo0 # exclude loopback traffic -$cmd 100 divert natd ip from any to any in via $pif # NAT any inbound packets -# Allow the packet through if it has an existing entry in the dynamic rules table -$cmd 101 check-state - - Die Regeln für den ausgehenden Verkehr werden ebenfalls - modifiziert, um Aktionen mit der - $skipto-Variable zu erlauben und - anzuzeigen, dass die Prüfung mit der Regel - 500 fortgesetzt wird. Die sieben Regeln - für TCP wurden durch die Regel - 125 ersetzt, da die sieben erlaubten - ausgehenden Ports in der Variable - $good_tcp0 enthalten sind. - - # Authorized outbound packets -$cmd 120 $skip udp from any to x.x.x.x 53 out via $pif $ks -$cmd 121 $skip udp from any to x.x.x.x 67 out via $pif $ks -$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks -$cmd 130 $skip icmp from any to any out via $pif $ks - - Die eingehenden Regeln bleiben unverändert, mit Ausnahme - der letzten Regel, in der das - via $pif entfert wird, um ein- und - ausgehende Pakete prüfen zu können. Nach der letzten Regel - für ausgehende Pakete muss die NAT-Regel - folgen. Die Regel muss eine höhere Nummer als die letzte - Regel haben und die Nummer muss über die - skipto-Aktion referenziert werden. In - diesem Regelsatz leitet die Regel mit der Nummer - 500 alle ausgehenden Pakete zur - Weiterverarbeitung an &man.natd.8; weiter. Die darauf - folgende Regel lässt alle von NAT - verarbeiteten Pakete passieren. - - $cmd 499 deny log all from any to any -$cmd 500 divert natd ip from any to any out via $pif # skipto location for outbound stateful rules -$cmd 510 allow ip from any to any - - In diesem Beispiel steuern die Regeln - 100, 101, - 125, 500 und - 510 die Adressübersetzung der ein- und - ausgehende Pakete, so dass immer die private - LAN IP-Adresse in der - dynamische Zustandstabelle registriert werden. - - Nehmen wir beispielsweise einen Web-Browser, der neue - HTTP-Sitzungen über Port 80 aufbaut. Wenn - nun das erste ausgehende Paket von der Firewall geprüft wird, - trifft es nicht auf Regel 100 zu, da das - Paket nach außen geleitet wird und nicht nach innen. Das - Paket trifft auch nicht auf Regel 101 zu, - da es das erste ist und somit noch nicht in der dynamischen - Zustandstabelle enthalten ist. Das Paket entspricht - schließlich Regel 125, da es ausgehend auf - einem erlaubten Port gesendet wird und von einer - IP-Adresse aus dem internen - LAN stammt. Für Pakete, die auf diese - Regel zutreffen, werden zwei Aktionen ausgeführt. Zuerst - wird durch die Aktion keep-state ein - dynamischer Eintrag in der Statustabelle erstellt und die - angegebene Aktion skipto 500 ausgeführt. - Als nächstes durchläuft das Paket NAT und - wird dann an das Internet gesendet. Nachdem dieses Paket am - Webserver angekommen ist, wird dort eine Antwort erzeugt und - zurückgeschickt. Dieses Paket wird wieder von oben nach unten - durch das Regelwerk geprüft. Dieses Mal trifft Regel - 100 auf das Paket zu und die Zieladresse - wird auf die zugehörige (lokale) - LAN-Adresse abgebildet. Danach wird das - Paket von der Regel check-state - verarbeitet. Die Zustandstabelle erkennt, dass eine - zugehörige aktive Sitzung vorliegt und das Paket wird - freigegeben und in das LAN geleitet. - - Für den eingehenden Datenverkehr muss der Regelsatz - unerwünschte Pakete blockieren und Pakete für autorisierte - Dienste durchlassen. Ein Paket, das mit einer Regel für den - eingehenden Datenverkehr übereinstimmt, wird in der - dynamischen Zustandstabelle eingetragen und dann an das - LAN freigegeben. Das Antwortpaket wird - von der Regel check-state als Paket einer - aktiven Sitzung erkannt. Das Paket wird dann von Regel - 500 per NAT - verarbeitet, bevor es über die externe Schnittstelle versendet - wird. - - - Weiterleitung von Ports - - Der Nachteil von &man.natd.8; ist, dass die Rechner im - LAN nicht aus dem Internet zugänglich - sind. Diese Rechner können zwar ausgehende Verbindungen - zur Außenwelt aufbauen, jedoch keine eingehenden - Verbindungen empfangen. Dies stellt ein Problem dar, wenn - Sie auf einem Rechner im LAN Dienste - anbieten möchten, die aus dem Internet erreichbar sein - sollen. In diesem Fall können Sie die Ports, welche über - das Internet erreichbar sein sollen, über die - &man.natd.8;-Maschine an den Rechner im - LAN weiterleiten. - - Angenommen es gibt einen IRC-Server - auf Rechner A und einen Webserver - auf Rechner B. Damit dies - funktioniert, müssen die Verbindungen auf den Ports 6667 - (IRC) und 80 (HTTP) - an die jeweiligen Rechner weitergeleitet werden. - - Die Syntax für - lautet: - - -redirect_port proto targetIP:targetPORT[-targetPORT] - [aliasIP:]aliasPORT[-aliasPORT] - [remoteIP[:remotePORT[-remotePORT]]] - - Für das obige Beispiel sollten die Argumente wie folgt - aussehen: - - -redirect_port tcp 192.168.0.2:6667 6667 - -redirect_port tcp 192.168.0.3:80 80 - - Damit werden die entsprechenden - TCP-Ports an die Rechner im - LAN weitergeleitet. +# Allow FTP +pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state - Portbereiche können über - festgelegt werden. Zum Beispiel würde - tcp 192.168.0.2:2000-3000 - 2000-3000 alle Verbindungen auf die Ports - 2000 bis 3000 an die Ports 2000 bis 3000 an - Rechner A weiterleiten. +# Allow SSH +pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state - Diese Optionen können über - natd_flags="" in - /etc/rc.conf direkt beim Start an - &man.natd.8; übergeben werden. Alternativ können die - Optionen in eine Konfigurationsdatei eingetragen - werden. +# Allow ping +pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state - Weitere Konfigurationsmöglichkeiten sind in - &man.natd.8; beschrieben. - +# Block and log everything else +block out log first quick on dc0 all - - Weiterleiten von Adressen + Die folgenden Beispielregeln für den eingehenden Verkehr + auf der öffentlichen Schnittstelle blockieren zuerst alle + unerwünschten Pakete. Dies reduziert die Anzahl der Pakete, + die durch die letzte Regel protokolliert werden. - Das Weiterleiten von Adressen ist nützlich, wenn - mehr als eine IP-Adresse zur Verfügung - steht. Jeder Rechner im LAN kann über - &man.natd.8; seine eigene externe - IP-Adresse zugewiesen bekommen. - &man.natd.8; wird dann den ausgehenden Datenverkehr der - Rechner aus dem LAN mit der - entsprechenden externen IP-Adresse - umschreiben. Auch der eingehenden Datenverkehr über die - externe IP-Adresse wird an die - entsprechenden Rechner im LAN - weitergeleitet. Diese Methode ist auch als - statisches NAT bekannt. Wenn Ihnen - beispielsweise die IP-Adressen - 128.1.1.1, - 128.1.1.2 und - 128.1.1.3 zur - Verfügung stehen, kann 128.1.1.1 als externe - Adresse der &man.natd.8;-Maschine verwendet werden, während - 128.1.1.2 und - 128.1.1.3 an - Rechner A und - Rechner B im LAN - weitergeleitet werden. + # interface facing Internet (inbound) +# Block all inbound traffic from non-routable or reserved address spaces +block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP +block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP +block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP +block in quick on dc0 from 127.0.0.0/8 to any #loopback +block in quick on dc0 from 0.0.0.0/8 to any #loopback +block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config +block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs +block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect +block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast - Die Syntax für - lautet: +# Block fragments and too short tcp packets +block in quick on dc0 all with frags +block in quick on dc0 proto tcp all with short - -redirect_address localIP publicIP +# block source routed packets +block in quick on dc0 all with opt lsrr +block in quick on dc0 all with opt ssrr - - - - - localIP - Die interne IP-Adresse des - Rechners im LAN. - +# Block OS fingerprint attempts and log first occurrence +block in log first quick on dc0 proto tcp from any to any flags FUP - - publicIP - Die externe IP-Adresse für - den entsprechenden Rechner im - LAN. - - - - +# Block anything with special options +block in quick on dc0 all with ipopts - Für das obige Beispiel sollten die Argumente wie - folgt aussehen: +# Block public pings and ident +block in quick on dc0 proto icmp all icmp-type 8 +block in quick on dc0 proto tcp from any to any port = 113 - -redirect_address 192.168.0.2 128.1.1.2 --redirect_address 192.168.0.3 128.1.1.3 +# Block incoming Netbios services +block in log first quick on dc0 proto tcp/udp from any to any port = 137 +block in log first quick on dc0 proto tcp/udp from any to any port = 138 +block in log first quick on dc0 proto tcp/udp from any to any port = 139 +block in log first quick on dc0 proto tcp/udp from any to any port = 81 - Genau wie bei , werden - diese Argumente innerhalb der - /etc/rc.conf-Option - natd_flags="" angegeben, oder alternativ - über eine Konfigurationsdatei. Allerdings müssen beim - Weiterleiten von Adressen keine Ports umgeleitet werden, da - der gesamte eingehende Datenverkehr einer bestimmte - IP-Adresse weitergeleitet wird. + Wenn eine Regel mit der Option + log first protokolliert wird, können Sie + mit ipfstat -hio prüfen, wie viele + Übereinstimmungen es für diese Regel gibt. Eine große Anzahl + von Übereinstimmungen kann darauf hindeuten, dass das System + angegriffen wird. + + Die restlichen Regeln definieren, welche Verbindungen aus + dem Internet kommend hergestellt werden dürfen. Die letzte + Regel blockiert alle Verbindungen, die nicht ausdrücklich von + vorhergehenden Regeln erlaubt wurden. - Die externe IP-Adresse der - &man.natd.8;-Maschine muss auf der externen Schnittstelle - aktiv und mit einem Alias versehen sein. Weitere - Einzelheiten sind in &man.natd.8; beschrieben. - + # Allow traffic in from ISP's DHCP server. Replace z.z.z.z with +# the same IP address used in the outbound section. +pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state + +# Allow public connections to specified internal web server +pass in quick on dc0 proto tcp from any to x.x.x.x port = 80 flags S keep state + +# Block and log only first occurrence of all remaining traffic. +block in log first quick on dc0 all - - Das <application>IPFW</application> Kommando + + <acronym>NAT</acronym> Konfiguration - - ipfw - + Um NAT zu aktivieren, fügen Sie + folgende Zeilen in /etc/rc.conf hinzu. + Geben Sie den Namen der Datei an, welche die + NAT-Regeln enthält: - ipfw kann benutzt werden, um einzelne - Regeln im laufenden Betrieb hinzuzufügen oder zu entfernen. - Problematisch ist jedoch, dass diese Änderungen bei einem - Neustart des Systems verloren gehen. Daher ist es - empfehlenswert, eigene Regeln in einer Datei zu definieren - und diese zu laden, um die Regeln der Firewall im laufenden - Betrieb anzupassen. + gateway_enable="YES" +ipnat_enable="YES" +ipnat_rules="/etc/ipnat.rules" - ipfw ist auch hilfreich, um die - geladenen Regeln der auf der Konsole auszugeben. - IPFW erzeugt dynamisch einen - Zähler, der jedes Paket, auf das eine Regel zutrifft, zählt. - Dadurch ist es möglich, die Funktion einer Regel zu - überprüfen. + NAT-Regeln sind sehr flexibel, um den + Bedürfnissen von kommerziellen Anwendern und Heimanwendern + gerecht zu werden. Die hier vorgestellte Regelsyntax wurde + vereinfacht, um die gemeinsame Nutzung zu demonstrieren. + Eine vollständige Beschreibung der Syntax finden Sie in + &man.ipnat.5;. - Eine Auflistung aller geladenen Regeln erhalten Sie - mit: + Die grundlegende Syntax für eine + NAT-Regel ist wie folgt. + map leitet die Regel ein und + IF sollte durch den Namen der externen + Schnittstelle ersetzt werden: - &prompt.root; ipfw list + map IF LAN_IP_RANGE -> PUBLIC_ADDRESS - Eine Auflistung aller Regeln inklusive des letzten - Treffers erhalten Sie mit: + LAN_IP_RANGE ist ein Bereich + von IP-Adressen, der von den internen + Rechnern verwendet wird. In der Regel ist dies ein privater + Bereich, beispielsweise 192.168.1.0/24. + PUBLIC_ADDRESS kann entweder eine + statische externe IP-Adresse sein, oder das + Schlüsselwort 0/32, welches der + zugewiesenen IP-Adresse für + IF entspricht. + + Wenn ein Paket aus dem LAN mit einem + öffentlichen Ziel an der IPF + Firewall ankommt, werden zunächst die Regeln für den + ausgehenden Verkehr geprüft. Danach wird das Paket an das + NAT-Regelwerk geleitet, wo es von oben nach + unten gelesen und geprüft wird, wobei die erste + übereinstimmende Regel gewinnt. + IPF testet jede + NAT-Regel gegen die Schnittstelle und die + Quell-IP-Adresse des Pakets. Wenn der + Schnittstellenname des Pakets mit einer + NAT-Regel übereinstimmt, wird geprüft, ob + die Quell-IP-Adresse des Pakets auf den + Bereich in LAN_IP_RANGE passt. + Wenn dies der Fall ist, wird die + Quell-IP-Adresse des Pakets mit der Adresse + aus PUBLIC_ADDRESS + überschrieben. IPF speichert die + Einträge in seiner internen NAT-Tabelle, so + dass wenn das Paket aus dem Internet zurückkehrt, es der + ursprünglichen privaten IP-Adresse + zugeordnet werden kann, bevor es von den weiteren + Firewallregeln geprüft wird. + + Bei Netzwerken mit einer großen Anzahl von Systemen oder + mehreren Subnetzen, steigert sich der Ressourcenverbrauch + für das Umschreiben der IP-Adressen. Es + existieren zwei Methoden, um dieses Problem zu umgehen. + + Bei der ersten Methode wird ein Portbereich definiert, der + für die Quell-Ports verwendet wird. Durch das Hinzufügen des + Schlüsselworts portmap kann + NAT angewiesen werden, nur Quell-Ports aus + dem angegebenen Bereich zu benutzen: + + map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000 + + Alternativ kann das Schlüsselwort auto + verwendet werden. Dadurch ermittelt NAT + selbstständig die zur Verfügung stehenden Ports: + + map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto + + Mit der zweiten Methode wird ein Pool von öffentlichen + Adressen verwendet. Dies ist nützlich, wenn es viele Systeme + im Netzwerk gibt und ein Block öffentlicher + IP-Adressen verfügbar ist. Aus diesem Pool + kann NAT dann + IP-Adressen für die ausgehenden Pakete + auswählen. + + Der Bereich der öffentlichen + IP-Adressen kann mit einer Netzmaske oder + der CIDR-Notation festgelegt werden. Die + folgenden Regeln sind identisch: + + map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 +map dc0 192.168.1.0/24 -> 204.134.75.0/24 + + Es ist gängige Praxis, öffentlich zugängliche Web- oder + Mail-Server getrennt von den internen Netzwerksegmenten zu + betreiben. Der Verkehr von diesen Servern muss dennoch von + NAT bearbeitet werden und die Portumleitung + ist erforderlich, um den eingehenden Datenverkehr an den + richtigen Server zu leiten. Verwenden Sie beispielsweise + folgende Regel, um den eingehenden Verkehr auf der + öffentlichen IP-Adresse 20.20.20.5 dem internen + Server mit der Adresse 10.0.10.25 zuzuordnen: + + rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80 + + Wenn dies der einzige Webserver im Netz ist, würde auch + folgende Regel funktionieren, die alle + HTTP-Anfragen an 10.0.10.25 umleitet: + + rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80 + + IPF enthält einen + FTP-Proxy, der zusammen mit + NAT benutzt werden kann. Dieser Proxy + überwacht den ausgehenden Datenverkehr für aktive und passive + Verbindungsanfragen und erstellt dynamische Filterregeln, + welche die Portnummern des jeweiligen + FTP-Datenkanal enthalten. Dadurch entfällt + die Notwendigkeit, viele Ports für + FTP-Verbindungen zu öffnen. + + In diesem Beispiel verwendet die erste Regel den Proxy + für ausgehende FTP-Verbindungen aus dem + internen LAN. Die zweite Regel übergibt + den FTP-Datenverkehr von der Firewall an + das Internet und die dritte Regel handhabt den restlichen + Datenverkehr aus dem internen LAN: + + map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp +map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp +map dc0 10.0.10.0/29 -> 0/32 + + FTP map-Regeln + stehen vor den NAT-Regeln. Wenn ein Paket + mit der FTP-Regel übereinstimmt, erstellt + der FTP-Proxy eine temporäre Filterregel, + damit die Pakete durchgelassen und von NAT + verarbeitet werden können. Alle Pakte aus dem + LAN, die nicht für FTP + bestimmt sind, werden von NAT verarbeitet, + wenn sie mit der dritten Regel übereinstimmen. + + Ohne den FTP-Proxy würden stattdessen + folgende Regeln benötigt. Beachten Sie, dass ohne den Proxy + alle Ports oberhalb von 1024 freigegeben + werden müssen: - &prompt.root; ipfw -t list + # Allow out LAN PC client FTP to public Internet +# Active and passive modes +pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state - Das nächste Beispiel zeigt Informationen über die Anzahl - der Pakete, die von einer Regel gefiltert wurden sowie die - Regel selbst. Der erste Spalte zeigt die Nummer der - Regel, gefolgt von der Anzahl der gefilterten Pakete - und der Anzahl der Pakete in Bytes. Zum Schluss steht die - Regel selbst: +# Allow out passive mode data channel high order port numbers +pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state$ +# Active mode let data channel in from FTP server +pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state - &prompt.root; ipfw -a list + Nachdem die Datei mit den NAT-Regeln + bearbeitet wurde, führen Sie ipnat mit + aus, um die aktuellen + NAT-Regeln und den Inhalt der dynamischen + Zuordnungstabelle zu löschen. Geben Sie + zusammen mit dem + NAT-Regelsatz an: - Das folgende Kommando zeigt zusätzlich alle dynamischen - Regeln an: + &prompt.root; ipnat -CF -f /etc/ipnat.rules - &prompt.root; ipfw -d list + Statistiken zu NAT lassen sich wie + folgt anzeigen: - Um diese Auflistung um die abgelaufenen - Regeln zu erweitern, geben Sie folgendes Kommando ein: + &prompt.root; ipnat -s - &prompt.root; ipfw -d -e list + Die aktuellen Zuordnungen der + NAT-Tabelle geben Sie mit diesem Kommando + aus: - Hiermit werden alle Zähler auf Null zurückgesetzt: + &prompt.root; ipnat -l - &prompt.root; ipfw zero + Ausführliche Informationen erhalten Sie mit: - Es ist auch möglich, einen spezifischen Zähler - zurückzusetzen: + &prompt.root; ipnat -v + - &prompt.root; ipfw zero NUM + + <application>IPF</application> Statistiken - - Protokollierung von Firewall-Nachrichten + ipfstat + + IPFILTER + Statistiken + - Auch bei aktivierter Protokollierung wird - IPFW von selbst keine Regeln - protokollieren. Der Administrator muss entscheiden, welche - Regeln aus dem Regelwerk protokolliert werden sollen. In - diesen Regeln muss dann das Schlüsselwort - log hinzugefügt werden. Normalerweise - werden nur geblockte Pakete protokolliert. Es ist üblich, - die ipfw default deny everything-Regel am - Ende des Regelwerks mit dem Schlüsselwort - log zu duplizieren. Dadurch ist es - möglich, alle Pakete zu sehen, auf die keine Regel - zutraf. + IPF enthält mit &man.ipfstat.8; + ein Werkzeug, mit dem Statistiken abgerufen und angezeigt + werden können. Die Zahlen beziehen sich auf den Zeitpunkt, an + dem die Firewall zuletzt gestartet wurde, beziehungsweise die + Statistik mit ipf -Z zurückgesetzt + wurde. - Protokollierung ist allerdings ein zweischneidiges - Schwert. Bei mangelnder Vorsicht oder einem DoS-Angriff - wird die Festplatte mit einer enormen Flut von - Protokolldaten belastet. Protokoll-Nachrichten werden nicht - nur an &man.syslogd.8; geschickt, sondern auch auf der - Konsole angezeigt, was dann schnell lästig werden - kann. + Die Ausgabe von ifstat sieht in etwa + wie folgt aus: - Die Kerneloption - IPFIREWALL_VERBOSE_LIMIT=5 begrenzt die - Anzahl identischer Nachrichten an &man.syslogd.8; für eine - gegebene Regel auf fünf Nachrichten. Ist diese Option im - Kernel aktiviert, wird nach Erreichen den festgelegten - Anzahl die Protokollierung von aufeinanderfolgenden - Nachrichten auf den festgelegten Wert begrenzt, da - beispielsweise die Speicherung von 200 gleichen - Protokoll-Nachrichten sinnlos ist. Daher werden durch - diese Option nur fünf gleichartige Nachrichten - protokolliert. Alle weiteren Nachrichten werden nur gezählt - und deren Gesamtzahl wird schließlich von &man.syslogd.8; - wie folgt ausgegeben: + input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 +output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 +input packets logged: blocked 99286 passed 0 +output packets logged: blocked 0 passed 0 +packets logged: input 0 output 0 +log failures: input 3898 output 0 +fragment state(in): kept 0 lost 0 +fragment state(out): kept 0 lost 0 +packet state(in): kept 169364 lost 0 +packet state(out): kept 431395 lost 0 +ICMP replies: 0 TCP RSTs sent: 0 +Result cache hits(in): 1215208 (out): 1098963 +IN Pullups succeeded: 2 failed: 0 +OUT Pullups succeeded: 0 failed: 0 +Fastroute successes: 0 failures: 0 +TCP cksum fails(in): 0 (out): 0 +Packet log flags set: (0) - Last message repeated 45 times + Es stehen viele Optionen zur Verfügung. Wird entweder + (eingehend) oder + (ausgehend) angegeben, wird der Befehl die entsprechende + Liste mit den derzeit vom Kernel benutzten Filterregeln + anzeigen. Um auch die Regelnummern zu sehen, muss + angegeben werden. Zum Beispiel zeigt + ipfstat -on die Tabelle für ausgehende + Regeln und die Regelnummer an: - Alle protokollierten Pakete werden in der Voreinstellung - in /var/log/security gespeichert. Dies - wird in /etc/syslog.conf - definiert. - + @1 pass out on xl0 from any to any +@2 block out on dc0 from any to any +@3 pass out quick on dc0 proto tcp/udp from any to any keep state - - Ein Firewall-Regelwerk erstellen + Wenn Sie der Regel ein voranstellen, + wird der Zähler für die jeweilige Regel ausgegeben. Zum + Beispiel gibt ipfstat -oh die ausgehenden + Regeln inklusive der Zähler aus: - Die meisten fortgeschrittenen - IPFW-Benutzer erzeugen eine - Datei, welche die Regeln für die Firewall enthält, um diese - als Skript ausführen zu können. Der Vorteil einer - derartigen Konfiguration besteht darin, dass dadurch mehrere - Regeln gleichzeitig geändert und aktiviert werden können, - ohne dass dazu das System neu gestartet werden muss. Dies - ist zudem beim Testen von Regeländerungen sehr hilfreich. - Weil es sich bei der Datei um ein Skript handelt, ist es - auch möglich, häufig verwendete Befehle durch Aliase zu - ersetzen und diese dann in mehreren Regeln zu nutzen. + 2451423 pass out on xl0 from any to any +354727 block out on dc0 from any to any +430918 pass out quick on dc0 proto tcp/udp from any to any keep state - Die Syntax des folgenden Skripts entspricht der Syntax - von &man.sh.1;, &man.csh.1; sowie &man.tcsh.1;. Felder, die - symbolisch substituiert werden, haben das Präfix $ - (Dollarzeichen). Symbolische Felder haben das - $-Präfix nicht. Der Wert, mit dem das symbolische - Feld belegt wird, muss in doppelten Anführungszeichen - ("") stehen. + Benutzen Sie ipfstat -t um die + Zustandstabelle in einem &man.top.1; ähnlichen Format + anzuzeigen. Unterliegt die Firewall einem Angriff, bietet + diese Option die Möglichkeit, die entsprechenden Pakete zu + identifizieren. Mit den optionalen Flags können + IP-Adressen, Ports oder Protokolle in + Echtzeit überwacht werden. Lesen Sie &man.ipfstat.8; für + weitere Informationen. + + + + <application>IPF</application> Protokollierung + + + ipmon + + + + IPFILTER + Protokollierung + + + IPF enthält mit + ipmon ein Werkzeug, mit dem die + Protokolle der Firewall in menschenlesbarer Form gespeichert + werden können. Dies erfordert jedoch, dass + options IPFILTER_LOG in die + Kernelkonfigurationsdatei hinzugefügt wird. Folgen Sie dazu + den Anweisungen in . + + Um eine kontinuierliche Protokolldatei bereitzustellen, + läuft dieses Kommando normalerweise im Daemon-Modus, damit + auch ältere Ereignisse nachverfolgt werden können. Da &os; + mit &man.syslogd.8; ein Werkzeug besitzt, das automatisch + Protokolldateien rotiert, wird in der Voreinstellung für + ipmon_flags -Ds in + rc.conf verwendet: + + ipmon_flags="-Ds" # D = start as daemon + # s = log to syslog + # v = log tcp window, ack, seq + # n = map IP & port to names + + Protokollierung bietet die im Nachhinein die Möglichkeit + festzustellen, welche Pakete verworfen wurden, von welchen + Adressen diese Pakete kamen und wohin sie gehen sollten. + Diese Informationen sind hilfreich beim Aufspüren von + Angreifern. + + Nachdem die Protokollierung in + /etc/rc.conf aktiviert und mit + service ipmon start gestartet wurde, wird + IPF Regeln aufzeichnen, welche das + Schlüsselwort log enthalten. Der + Firewalladministrator entscheidet, welche Regeln protokolliert + werden. In der Regel werden nur geblockte Pakete + protokolliert. Es ist üblich, das Schlüsselwort + log in der letzten Regel des Regelsatzes + mit aufzunehmen. Dies macht es möglich, alle Pakete zu sehen, + die mit keiner Regel des Regelsatzes übereinstimmten. + + In der Voreinstellung verwendet + ipmon -Ds local0 als + Protokoll-Facility. Die folgenden Level können verwendet + werden, um die erfassten Daten weiter aufzuspalten: + + LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block. +LOG_NOTICE - packets logged which are also passed +LOG_WARNING - packets logged which are also blocked +LOG_ERR - packets which have been logged and which can be considered short due to an incomplete header + + Damit IPF alle Daten + protokolliert, legen Sie zunächst eine neue Datei + /var/log/ipfilter.log an: - Die Datei mit den Regeln könnte wie folgt aufgebaut - sein: + &prompt.root; touch /var/log/ipfilter.log - ############### start of example ipfw rules script ############# -# -ipfw -q -f flush # Delete all rules -# Set defaults -oif="tun0" # out interface -odns="192.0.2.11" # ISP's DNS server IP address -cmd="ipfw -q add " # build rule prefix -ks="keep-state" # just too lazy to key this each time -$cmd 00500 check-state -$cmd 00502 deny all from any to any frag -$cmd 00501 deny tcp from any to any established -$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks -$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks -$cmd 00611 allow udp from any to $odns 53 out via $oif $ks -################### End of example ipfw rules script ############ + Um alle Nachrichten in der angegebenen Datei zu + protokollieren, fügen Sie den folgenden Eintrag in + /etc/syslog.conf ein: + + local0.* /var/log/ipfilter.log + + Führen Sie service syslogd reload aus, + damit &man.syslogd.8; /etc/syslog.conf + neu einliest, um die Änderungen zu aktivieren. + + Denken Sie daran, auch + /etc/newsyslog.conf anzupassen, damit das + neue Protokoll rotiert wird. + + Die von ipmon generierten Nachrichten + bestehen aus Daten, welche durch Leerzeichen getrennt sind. + Alle Nachrichten enthalten die folgenden Felder: - Die Regeln in diesem Beispiel sind nicht wichtig. - Wichtig ist es, zu zeigen, wie die symbolische Substitution - innerhalb der Regeln verwendet wird. + + + Das Datum, an dem das Paket empfangen wurde. + - Wenn dieses Beispiel in - etc/ipfw.rules gespeichert wurde, so - könnten alle Regeln durch die Ausführung des folgenden - Kommandos neu geladen werden: + + Die Uhrzeit, wann das Paket empfangen wurde. Das + Format ist HH:MM:SS.F (Stunden, Minuten, Sekunden und + Sekundenbruchteile). + - &prompt.root; sh /etc/ipfw.rules + + Der Name der Schnittstelle, die das Paket + verarbeitet hat. + - Anstelle von /etc/ipfw.rules kann - ein beliebig anderer Name oder Speicherort verwendet - werden. + + Die Gruppen- und Regelnummer im Format + @0:17. + - Alternativ können die einzelnen Befehle dieses Skripts - auch von Hand eingegeben werden: + + Die Aktion: p für durchgelassene + Pakete, b für blockierte Pakete, + S für kurze Pakete, + n für Pakete auf die keine Regel zutraf + und L für Pakete die protokolliert + wurden. + - &prompt.root; ipfw -q -f flush -&prompt.root; ipfw -q add check-state -&prompt.root; ipfw -q add deny all from any to any frag -&prompt.root; ipfw -q add deny tcp from any to any established -&prompt.root; ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state -&prompt.root; ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state -&prompt.root; ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state - + + Die Adressen werden in drei Felder unterteilt: die + Quelladresse und der Port getrennt durch Komma, das + Zeichen ->, sowie die Zieladresse und Port. Zum + Beispiel 209.53.17.22,80 -> + 198.72.220.17,1722. + + + + PR, gefolgt vom Namen oder Nummer + des Protokolls. Zum Beispiel + PR tcp. + + + + len, gefolgt von der Größe des + Headers und der Gesamtgröße des Pakets. Zum Beispiel + len 20 40. + + + + Wenn es sich beim dem Paket um ein + TCP-Paket handelt, gibt es ein zusätzliches + Feld, das mit einem Bindestrich beginnt und die Buchstaben der + entsprechenden Flags enthält. Eine Liste der Flags und deren + Buchstaben finden Sie in &man.ipf.5;. + + Wenn es sich beim dem Paket um ein + ICMP-Paket handelt, gibt es zwei + zusätzliche Felder: das erste Feld ist immer + icmp und das zweite Feld enthält die + ICMP-Nachricht und den Nachrichten-Code, + getrennt durch einen Schrägstrich. Beispielswiese + icmp 3/3 für die Nachricht + Port unreachable.