Page MenuHomeFreeBSD

D8026.diff
No OneTemporary

D8026.diff

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 @@
<author><personname><firstname>Michael</firstname><surname>Bunzel</surname></personname><contrib>Übersetzt von </contrib></author>
<author><personname><firstname>Johann</firstname><surname>Kois</surname></personname></author>
<author><personname><firstname>Benjamin</firstname><surname>Lukas</surname></personname></author>
+ <author><personname><firstname>Björn</firstname><surname>Heidotting</surname></personname></author>
</authorgroup>
</info>
@@ -1674,2710 +1675,2138 @@
</sect2>
</sect1>
- <sect1 xml:id="firewalls-ipf">
- <title>Die IPFILTER-Firewall (IPF)</title>
+ <sect1 xml:id="firewalls-ipfw">
+ <title>IPFW</title>
<indexterm>
- <primary>firewall</primary>
+ <primary>Firewall</primary>
- <secondary>IPFILTER</secondary>
+ <secondary>IPFW</secondary>
</indexterm>
- <para>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.</para>
-
- <para>IPFILTER basiert auf einer kernelseitigen Firewall und einem
- <acronym>NAT</acronym> 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 <acronym>NAT</acronym> 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.</para>
-
- <para>IPF funktionierte ursprünglich mit einer
- Regel-Prozess-Logik &agrave; la <quote>die letzte Regel, die
- passt, entscheidet</quote> und verwendete ausschließlich
- Regeln ohne feste Zustände. Inzwischen wurde die
- Regel-Prozess-Logik drastisch modernisiert: Es gibt eine
- <option>quick</option> und eine zustandsorientierte <option>
- keep-state</option> 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.</para>
-
- <para>Die Anweisungen in diesem Kapitel basieren darauf, Regeln mit
- den Optionen <option>quick</option> und <option>keep-state</option>
- zu erstellen. Mit diesem Grundwissen wird man einen kompletten
- einschließenden Regelsatz erstellen können.</para>
-
- <para>Für eine ausführliche Erläuterung der alten Methode
- zur Regelverarbeitung schauen Sie bitte auf <uri
- xlink:href="http://www.munk.me.uk/ipf/ipf-howto.html">
- http://www.munk.me.uk/ipf/ipf-howto.html</uri> oder <uri
- xlink:href="http://coombs.anu.edu.au/~avalon/ip-filter.html">
- http://coombs.anu.edu.au/~avalon/ip-filter.html</uri>.</para>
+ <para><application>IPFW</application> ist eine
+ <foreignphrase>Stateful-Firewall</foreignphrase>
+ für &os;, die sowohl <acronym>IPv4</acronym> als auch
+ <acronym>IPv6</acronym> unterstützt. Die Firewall setzt sich
+ aus mehreren Komponenten zusammen: dem Kernel Firewall
+ Filter-Prozessor mit integriertem Paket-Accounting,
+ Protokollfunktionen, <acronym>NAT</acronym>, dem
+ &man.dummynet.4; <foreignphrase>Traffic-Shaper</foreignphrase>,
+ sowie Weiterleitungs-, Bridge- und ipstealth-Funktionen.</para>
- <para>Antworten auf häufige Fragen finden Sie unter
- <uri xlink:href="http://www.phildev.net/ipf/index.html">http://www.phildev.net/ipf/index.html</uri>.</para>
+ <para>&os; enthält mit <filename>/etc/rc.firewall</filename> ein
+ Beispielregelwerk, welches mehrere Firewall-Typen für
+ gebräuchliche Szenarien definiert und unerfahrene Anwender
+ dabei unterstützen soll, ein geeignetes Regelwerk zu erstellen.
+ <application>IPFW</application> besitzt eine leistungsstarke
+ Syntax, mit der erfahrene Benutzer ihre eigenen Regeln
+ anfertigen können, um den Sicherheitsanforderungen der
+ jeweiligen Umgebung gerecht zu werden.</para>
- <para>Und ein durchsuchbares Archiv der Mailingliste zu IPFILTER
- gibt es unter <uri xlink:href="http://marc.theaimsgroup.com/?l=ipfilter">http://marc.theaimsgroup.com/?l=ipfilter</uri>.</para>
+ <para>Diser Abschnitt beschreibt, wie
+ <application>IPFW</application> aktiviert wird und bietet einen
+ Überblick über die Regelsyntax. Zudem werden mehrere Regelsätze
+ für gebräuchliche Konfigurationsszenarien vorgestellt.</para>
- <sect2>
- <title>Aktivieren von IPF</title>
+ <sect2 xml:id="firewalls-ipfw-enable">
+ <title><application>IPFW</application> aktivieren</title>
<indexterm>
- <primary>IPFILTER</primary>
-
- <secondary>enabling</secondary>
+ <primary><application>IPFW</application></primary>
+ <secondary>aktivieren</secondary>
</indexterm>
- <para>&os; enthält IPF in der Standardversion als ladbares
- Kernelmodul. Dieses Modul wird vom System automatisch geladen,
- wenn in der <filename>rc.conf</filename> der Eintrag<literal>
- ipfilter_enable="YES"</literal> angelegt wird. In dieser
- ursprünglichen Konfiguration ist die Protokollierung aktiv
- und die Option <literal>default pass all</literal> ("Pakete passieren
- lassen") als Standard gesetzt. Um die <literal>block all</literal>
- ("alles Blockieren") Option zu setzen, muss man nicht gleich
- einen neuen Kernel bauen - es reicht, <literal>block all</literal>
- als letzte Position des Regelsatzes aufzulisten.</para>
- </sect2>
-
- <sect2>
- <title>Kernel-Optionen</title>
-
- <indexterm>
- <primary>Kerneloptionen</primary>
+ <para>Das &os; Basissystem enthält für
+ <application>IPFW</application> ein ladbares Kernelmodul, was
+ bedeutet, dass kein angepasster Kernel benötigt wird, um
+ <application>IPFW</application> zu benutzen.</para>
- <secondary>IPFILTER</secondary>
+ <indexterm>
+ <primary>Kerneloptionen</primary>
+ <secondary>IPFIREWALL</secondary>
</indexterm>
<indexterm>
- <primary>Kerneloptionen</primary>
-
- <secondary>IPFILTER_LOG</secondary>
+ <primary>Kerneloptionen</primary>
+ <secondary>IPFIREWALL_VERBOSE</secondary>
</indexterm>
<indexterm>
- <primary>Kerneloptionen</primary>
-
- <secondary>IPFILTER_DEFAULT_BLOCK</secondary>
+ <primary>Kerneloptionen</primary>
+ <secondary>IPFIREWALL_VERBOSE_LIMIT</secondary>
</indexterm>
<indexterm>
- <primary>IPFILTER</primary>
-
- <secondary>Kerneloptionen</secondary>
+ <primary><application>IPFW</application></primary>
+ <secondary>Kerneloptionen</secondary>
</indexterm>
- <para>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.</para>
-
- <para>Die Beschreibung der einzelnen Optionen von IPF für die
- Verwendung in der Kernelkonfiguration finden Sie auch in der Datei
- <filename>/usr/src/sys/conf/NOTES</filename>.</para>
-
- <programlisting>options IPFILTER
-options IPFILTER_LOG
-options IPFILTER_DEFAULT_BLOCK</programlisting>
-
- <para><literal>options IPFILTER</literal> aktiviert die Verwendung
- der <quote>IPFILTER</quote> Firewall.</para>
-
- <para><literal>options IPFILTER_LOG</literal> aktiviert den
- Logging-Mechanismus. Das bedeutet, dass jedes Paket geloggt wird,
- auf das eine Regel passt, die das Schlüsselwort
- <literal>log</literal> enthält. Dazu wird der
- Pseudo&mdash;Device <filename>ipl</filename> verwendet.</para>
-
- <para><literal>options IPFILTER_DEFAULT_BLOCK</literal> ändert
- das Verhalten der Firewall dahingehend, dass jedes Paket, dass nicht
- explizit von einer <literal>pass</literal> Regel Zugang erhält,
- abgewiesen, bzw. geblockt, wird.</para>
-
- <para>Diese Einstellungen werden erst aktiv, wenn der Kernel, in den sie
- eingebunden wurden, kompiliert, installiert und gebootet wurde.</para>
- </sect2>
-
- <sect2>
- <title>Optionen in rc.conf</title>
-
- <para>Um IPF während des Bootvorgangs einzubinden, braucht man
- lediglich die folgenden Zeilen der Datei
- <filename>/etc/rc.conf</filename> anzufügen:</para>
-
- <programlisting>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 &amp; port ausgeben
- </programlisting>
-
- <para>Falls sich hinter der Firewall ein lokales Netzwerk befindet,
- das den reservierten privaten Adressbereich verwendet, müssen
- die folgenden Zeilen zur Aktivierung von <acronym>NAT</acronym>
- ebenfalls in <filename>/etc/rc.conf</filename> eingetragen
- werden:</para>
-
- <programlisting>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
- </programlisting>
- </sect2>
-
- <sect2>
- <title>Der Befehl ipf</title>
-
- <indexterm><primary><command>ipf</command></primary></indexterm>
+ <para>Wenn Sie eine statische Unterstützung für
+ <application>IPFW</application> in den Kernel kompilieren
+ wollen, lesen Sie <xref linkend="kernelconfig"/>. Folgende
+ Optionen können in der Kernelkonfigurationsdatei verwendet
+ werden:</para>
- <para>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:</para>
+ <programlisting>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</programlisting>
- <screen>&prompt.root; <userinput>ipf -Fa -f /etc/ipf.rules</userinput></screen>
+ <para>Um <application>IPFW</application> beim Systemstart zu
+ aktivieren, fügen Sie folgende Zeile in
+ <filename>/etc/rc.conf</filename> ein:</para>
- <para><option>-Fa</option> bedeutet, dass alle intern gespeicherten
- Tabellen mit Regeln gelöscht werden.</para>
+ <programlisting>firewall_enable="YES"</programlisting>
- <para><option>-f</option> gibt die Datei an, aus der die neuen Regeln
- gelesen werden sollen.</para>
+ <para>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:</para>
- <para>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.</para>
-
- <para>Um mehr über diese und weitere Optionen von &man.ipf.8;
- zu erfahren, konsultieren Sie bitte die Manpage.</para>
-
- <para>&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.</para>
-
- <para>Es gibt allerdings doch einen Weg, IPF Regeln mit Hilfe von
- Skripten und Variablen zu erstellen. Weitere Informationen dazu
- finden Sie unter <xref linkend="firewalls-ipf-rules-script"/>.</para>
- </sect2>
+ <programlisting>firewall_type="open"</programlisting>
- <sect2>
- <title>IPFSTAT</title>
+ <para>Folgende Profile stehen zur Verfügung:</para>
- <indexterm><primary><command>ipfstat</command></primary></indexterm>
+ <itemizedlist>
+ <listitem>
+ <para><literal>open</literal>: gestattet jeglichen
+ Datenverkehr.</para>
+ </listitem>
- <indexterm>
- <primary>IPFILTER</primary>
+ <listitem>
+ <para><literal>client</literal>: schützt lediglich diesen
+ Rechner.</para>
+ </listitem>
- <secondary>statistics</secondary>
- </indexterm>
+ <listitem>
+ <para><literal>simple</literal>: schützt das gesamte
+ Netzwerk.</para>
+ </listitem>
- <para>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
- <command>ipf -Z</command> angesammelt wurden, abzurufen und
- anzuzeigen.</para>
+ <listitem>
+ <para><literal>closed</literal>: blockiert den gesamten
+ <acronym>IP</acronym>-Datenverkehr, mit Ausnahme des
+ Verkehrs über die Loopback-Schnittstelle.</para>
+ </listitem>
- <para>Für weiterführende Informationen schauen Sie bitte
- auf die Manpage von &man.ipfstat.8;!</para>
+ <listitem>
+ <para><literal>workstation</literal>: schützt lediglich
+ diesen Rechner und verwendet zustandsorientierte
+ Regeln.</para>
+ </listitem>
- <para>Die Ausgabe von &man.ipfstat.8;, wenn keine Parameter
- übergeben wurden, sieht etwa so aus:</para>
+ <listitem>
+ <para><literal>UNKNOWN</literal>: deaktiviert das Laden von
+ Firewallregeln.</para>
+ </listitem>
- <screen>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 <acronym>TCP</acronym> 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
-<acronym>TCP</acronym> cksum fails(in): 0 (out): 0
-Packet log flags set: (0)</screen>
+ <listitem>
+ <para><filename><replaceable>filename</replaceable></filename>:
+ absoluter Pfad zu einer Datei, in der die Firewallregeln
+ definiert sind.</para>
+ </listitem>
+ </itemizedlist>
- <para>Wenn die Option <option>-i</option> für
- <quote>eingehend</quote> oder <option>-o</option> für
- <quote>ausgehend</quote> übergeben wird, liefert das Kommando
- eine entsprechende Liste von Filter-Regeln, die gerade installiert
- sind und vom Kernel verwendet werden.</para>
+ <para>Wenn Sie <literal>firewall_type</literal> auf
+ <literal>client</literal> oder <literal>simple</literal>
+ setzen, müssen Sie die voreingestellten Regeln in
+ <filename>/etc/rc.firewall</filename> anpassen, damit sie
+ der Konfiguration des Systems entsprechen.</para>
- <para><command>ipfstat -in</command> zeigt alle aktive Regeln
- für eingehende Verbindungen zusammen mit ihren Nummern.</para>
+ <para>Beachten Sie, dass das Profil <literal>filename</literal>
+ verwendet wird, um ein benutzerdefiniertes Regelwerk zu
+ laden.</para>
- <para><command>ipfstat -on</command> erledigt dasselbe für die
- ausgehenden Verbindungen.</para>
+ <para>Eine alternative Möglichkeit, um ein benutzerdefiniertes
+ Regelwerk zu laden, bietet die Variable
+ <literal>firewall_script</literal>. Setzen Sie die Variable
+ auf den absoluten Pfad eines
+ <emphasis>ausführbaren Skripts</emphasis>, welches die Befehle
+ für <application>IPFW</application> enthält. Die Beispiele in
+ diesem Abschnitt gehen davon aus, dass
+ <literal>firewall_script</literal> auf
+ <filename>/etc/ipfw.rules</filename> gesetzt ist.</para>
- <para>Die Ausgabe sieht in etwa folgendermaßen aus:</para>
+ <programlisting>firewall_script="/etc/ipfw.rules"</programlisting>
- <screen>@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</screen>
+ <para>Die Protokollierung wird mit diesem Eintrag
+ aktiviert:</para>
- <para><command>ipfstat -ih</command> zeigt die Tabelle der aktiven
- Regeln für eingehende Verbindungen zusammen mit der Anzahl,
- wie oft jeder einzelnen Regel entsprochen wurde.</para>
+ <programlisting>firewall_logging="YES"</programlisting>
- <para><command>ipfstat -oh</command> zeigt das Gleiche für
- die ausgehenden Verbindungen.</para>
+ <para>Es existiert keine Variable für
+ <filename>/etc/rc.conf</filename>, um die Protokollierung zu
+ begrenzen. Um die Anzahl der Protokoll-Nachrichten pro
+ Verbindungsversuch zu begrenzen, legen Sie die Anzahl der
+ Einträge in <filename>/etc/sysctl.conf</filename> fest:</para>
- <para>Hier wird die Ausgabe so oder so ähnlich aussehen:</para>
+ <programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
- <screen>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</screen>
+ <para>Nachdem Sie die Änderungen gespeichert haben, können Sie
+ die Firewall starten. Um auch die Anzahl der
+ Protokoll-Nachrichten zu konfigurieren, setzen Sie mit
+ <command>sysctl</command> den gewünschten Wert:</para>
- <para>Einer der wichtigsten Funktionen von <command>ipfstat</command>
- wird über die Option <option>-t</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;.</para>
+ <screen>&prompt.root; <userinput>service firewall start</userinput>
+&prompt.root; <userinput>sysctl net.inet.ip.fw.verbose_limit=<replaceable>5</replaceable></userinput></screen>
</sect2>
- <sect2>
- <title>IPMON</title>
+ <sect2 xml:id="firewalls-ipfw-rules">
+ <title><application>IPFW</application> Regel-Syntax</title>
- <indexterm><primary><command>ipmon</command></primary></indexterm>
+ <para>Wenn ein Paket die Firewall <quote>betritt</quote>, 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 <quote>erster
+ Treffer gewinnt</quote> bezeichnet. Falls keine Regel auf
+ das betreffende Paket zutrifft, wird die obligatorische
+ <application>IPFW</application>-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 <literal>count</literal>,
+ <literal>skipto</literal> oder <literal>tee</literal>
+ 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;.</para>
<indexterm>
- <primary>IPFILTER</primary>
-
- <secondary>logging</secondary>
- </indexterm>
-
- <para>Damit der Befehl <command>ipmon</command> korrekt arbeiten kann,
- muss die Option <literal>IPFILTER_LOG</literal> in die
- Kernelkonfiguration eingearbeitet werden. Das Kommando selbst
- arbeitet in zwei verschiedenen Modi. Für den nativen Modus
- startet man <command>ipmon</command> auf der Kommandozeile ohne die
- Option <option>-D</option>.</para>
-
- <para>Der Hintergrundmodus (<literal>daemon mode</literal>) 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-<filename>rc.conf</filename>-Datei (im Ordner
- <filename>/etc/defaults/</filename>) wird dem Eintrag
- <literal>ipmon_flags</literal> die Option <option>-Ds</option>
- übergeben:</para>
-
- <programlisting>ipmon_flags="-Ds" # D = Als Da:mon starten
-# s = Protokollierung via syslog
-# v = Protokollierung von tcp window, ack, seq
-# n = Namen statt IP &amp; port ausgeben</programlisting>
-
- <para>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.</para>
-
- <para>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 <literal>log</literal> in
- dieser Regel angeben. Normalerweise werden nur Treffer auf abweisende
- Regeln protokolliert.</para>
-
- <para>Es ist üblich, als letzte Regel eine alles blockierende
- Regel mit dem Schlüsselwort <literal>log</literal> in den
- Regelsatz einzutragen. Dadurch erkennt man alle Pakete, die keiner
- Regel im Regelsatz entsprachen.</para>
- </sect2>
-
- <sect2>
- <title>IPMON Logging</title>
-
- <para><application>Syslogd</application> verwendet seine eigene Methode
- zum Sortieren der gesammtelten Protokolldaten - spezielle Gruppierungen
- namens <quote>facility</quote> und <quote>level</quote>. IPMON
- verwendet im <literal>daemon</literal>-Modus als
- <quote>facility</quote> den Wert <literal>security</literal>. Die
- folgenden <quote>level</quote> können für eine genauere
- Trennung der Protokolldaten verwendet werden:</para>
-
- <screen>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</screen>
-
- <para>Damit IPFILTER angewiesen werden kann, alle Protokolldaten in
- die Datei <filename>/var/log/ipfilter.log</filename> zu schreiben,
- muss diese erst erstellt werden. Folgendes Kommando
- übernimmt diese Aufgabe:</para>
-
- <screen>&prompt.root; <userinput>touch /var/log/ipfilter.log</userinput></screen>
-
- <para>Die Funktionen von &man.syslogd.8; werden durch Definition in
- der Datei <filename>/etc/syslog.conf</filename> gesteuert. In dieser
- Datei kann sehr weitläfig eingestellt werden, wie
- <application>syslog</application> mit den Systemnachrichten umgehen
- soll, die ihm von Anwendungen wie IPF übergeben werden.</para>
-
- <para>Fügen Sie folgende Definition in die Datei
- <filename>/etc/syslog.conf</filename> ein, um die Protokollierung
- für IPF via <filename>syslog</filename> zu aktivieren:</para>
-
- <programlisting>security.* /var/log/ipfilter.log</programlisting>
+ <primary><application>IPFW</application></primary>
+ <secondary>Regel-Syntax</secondary>
+ </indexterm>
- <para><literal>security.*</literal> bedeutet, dass alle Nachrichten
- der Klasse <literal>security.*</literal> am angegebenen Ort (hier
- eine Datei) geschrieben werden sollen.</para>
+ <para>Bei der Erstellung der
+ <application>IPFW</application>-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 <literal>#</literal> wird benutzt, um
+ einen Kommentar einzuleiten und kann am Ende einer Regel oder
+ in einer eigenen Zeile stehen. Leerzeilen werden
+ ignoriert.</para>
- <para>Um Änderungen an der Datei
- <filename>/etc/syslog.conf</filename> zu aktivieren müssen Sie
- den Rechner neu starten, oder den Befehl</para>
+ <para><replaceable>CMD RULE_NUMBER set SET_NUMBER ACTION log
+ LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT
+ OPTIONS</replaceable></para>
- <screen>&prompt.root; <userinput>/etc/rc.d/syslogd reload</userinput></screen>
+ <para>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
+ <application>IPFW</application>-Regeln zu erstellen, finden
+ Sie in &man.ipfw.8;.</para>
- <para>ausführen.</para>
+ <variablelist>
+ <varlistentry>
+ <term>CMD</term>
+ <listitem>
+ <para>Jede Regel muss mit <parameter>ipfw add</parameter>
+ beginnen.</para>
+ </listitem>
+ </varlistentry>
- <para>Vergessen Sie nicht, <filename>/etc/newsyslog.conf</filename>
- anzupassen, damit die neuen Protokolldateien, die eben konfiguriert
- wurden, auch in den Rotationsturnus eingefügt werden!</para>
- </sect2>
+ <varlistentry>
+ <term>RULE_NUMBER</term>
+ <listitem>
+ <para>Jede Regel gehört zu einer Nummer zwischen
+ <literal>1</literal> und <literal>65534</literal>. 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.</para>
+ </listitem>
+ </varlistentry>
- <sect2>
- <title>Die Formatierung der Logdatei</title>
+ <varlistentry>
+ <term>SET_NUMBER</term>
+ <listitem>
+ <para>Jede Regel ist einer <emphasis>Set</emphasis>-Nummer
+ zwischen <literal>0</literal> und <literal>31</literal>
+ 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
+ <literal>SET_NUMBER</literal> nicht angegeben ist, wird
+ die Regel zu Set <literal>0</literal>
+ hinzugefügt.</para>
+ </listitem>
+ </varlistentry>
- <para>Nachrichten, die durch <command>ipmon</command> erzeugt werden,
- bestehen aus durch Leerstellen getrennten Datenfeldern. Folgende
- Felder sind in allen Nachrichten enthalten:</para>
+ <varlistentry>
+ <term>ACTION</term>
+ <listitem>
+ <para>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.</para>
- <orderedlist>
- <listitem>
- <para>Das Datum der Paketerstellung.</para>
- </listitem>
-
- <listitem>
- <para>Die Uhrzeit der Paketerstellung in der Form
- <literal>HH:MM:SS.F</literal>, mit Stunden, Minuten, Sekunden
- und Sekundenbruchteilen, wobei letztere mehrere Stellen lang
- sein können.</para>
- </listitem>
-
- <listitem>
- <para>Der Name der Schnittstelle, die das Paket verarbeitet hat,
- bspw. <filename>dc0</filename>.</para>
- </listitem>
-
- <listitem>
- <para>Die Gruppe und die Nummer der angewandten Regel, bspw.
- <literal>@0:17</literal>.</para>
- </listitem>
-
- <listitem>
- <para>Die ausgeführte Aktion: p für
- <literal>passed</literal> (zugelassen), b für blockiert,
- S für <literal>short packet</literal> (unvollständiger
- Header), n für <literal>no match</literal> (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.</para>
- </listitem>
-
- <listitem>
- <para>Die Adressen. Diese bestehen aus drei Feldern: Der
- Quelladresse mit Port (getrennt durch ein Komma), dem Symbol
- <quote>-&gt;</quote> und der Zieladresse. Also bspw.
- <literal>209.53.15.22,80 -&gt; 198.64.221.18,1722</literal>.</para>
- </listitem>
-
- <listitem>
- <para><literal>PR</literal> gefolgt vom Namen eines
- Netzwerk-Protokolls oder dessen Nummer. Bspw.
- <literal>PR tcp</literal>.</para>
- </listitem>
-
- <listitem>
- <para><literal>len</literal> gefolgt von der Länge des Headers
- und der Gesamtlänge des Paketes, beispielsweise
- <literal>len 20 40</literal>.</para>
- </listitem>
- </orderedlist>
+ <para><parameter>allow | accept | pass |
+ permit</parameter>: All diese Aktionen sind
+ gleichbedeutend und erlauben Pakete, die mit der Regel
+ übereinstimmen.</para>
- <para>Wenn es sich um ein <acronym>TCP</acronym>-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.</para>
-
- <para>Falls das Paket ein ICMP-Paket ist, werden zwei Felder am Ende
- hinzugefügt - das erstere ist immer <quote>ICMP</quote>, das
- zweite enthält die ICMP-Nachricht und den Nachrichtentyp,
- getrennt durch einen Schrägstrich. <literal>ICMP 3/3</literal>
- steht beispielsweise für <quote>Port nicht
- erreichbar</quote>.</para>
- </sect2>
+ <para><parameter>check-state</parameter>: 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 <literal>check-state</literal> hat selbst kein
+ Selektionskriterium. Sollte keine
+ <literal>check-state</literal>-Regel im Regelwerk
+ vorhanden sein, wird die dynamische Zustandstabelle beim
+ ersten Vorkommen einer <literal>keep-state</literal>-
+ oder <literal>limit</literal>-Regel überprüft.</para>
- <sect2 xml:id="firewalls-ipf-rules-script">
- <title>Die Erstellung eines Regelsatzes mit Variablen</title>
+ <para><parameter>count</parameter>: Aktualisiert die
+ Zähler für alle Pakete, die mit dieser Regel
+ übereinstimmen. Die Prüfung wird mit der nächsten Regel
+ fortgesetzt.</para>
- <para>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.</para>
-
- <para>Die Syntax dieses Skriptes ist kompatibel mit den Shells
- &man.sh.1;, &man.csh.1; und &man.tcsh.1;.</para>
-
- <para>Variablen beginnen mit einem Dollar-Zeichen:
- <literal>&dollar;Variablenname</literal>. Im Beispiel unten steht
- <literal>&dollar;oif</literal> für die Variable, in der der Name
- der Schnittstelle abgelegt wird, über die der Verkehr nach
- außen erfolgt.</para>
-
- <para>In Variablenzuweisungen fehlt das beginnende &dollar;-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
- (<literal>""</literal>) stehen. Also folgt eine Zuweisung dem Schema
- <literal>Variablenname = "Wert"</literal>.</para>
-
- <programlisting>############# 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 &gt; /etc/ipf.rules &lt;&lt; EOF
-#
-# 2) Diese Zeile, wenn Sie direkt mit dem Skript arbeiten wollen
-/sbin/ipf -Fa -f - &lt;&lt; EOF
+ <para><parameter>deny | drop</parameter>: Diese Aktionen
+ sind gleichbedeutend und verwerfen Pakete, die mit
+ dieser Regel übereinstimmen.</para>
+
+ <para>Es stehen noch weitere Aktionen zur Verfügung.
+ Einzelheiten finden Sie in &man.ipfw.8;.</para>
+ </listitem>
+ </varlistentry>
-# Erlaubnis ausgehenden Verkehrs an den Nameserver des ISPs
-pass out quick on &dollar;oif proto tcp from any to &dollar;odns port = 53 &dollar;fks
-pass out quick on &dollar;oif proto udp from any to &dollar;odns port = 53 &dollar;ks
-
-# Erlaubnis ausgehenden unsicheren www-Verkehrs
-pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 80 &dollar;fks
-
-# Erlaubnis ausgehenden sicheren www-Verkehrs https via TLS SSL
-pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 443 &dollar;fks
-EOF
-################## End of IPF rules script ########################</programlisting>
-
- <para>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
- <filename>/etc/ipf.rules.script</filename> gespeichert wurde,
- können die Regeln mit folgenden Kommando neu geladen
- werden:</para>
-
- <screen>&prompt.root; <userinput>sh /etc/ipf.rules.script</userinput></screen>
-
- <para>Es gibt ein Problem mit Regelsatz-Dateien, die Variablen
- verwenden: IPF kann mit Variablen nichts anfangen - und kann derartige
- Skripte nicht direkt einlesen.</para>
+ <varlistentry>
+ <term>LOG_AMOUNT</term>
+ <listitem>
+ <para>Erfüllt ein Paket die Selektionskriterien mit dem
+ Schlüsselwort <literal>log</literal>, wird dies von
+ &man.syslogd.8; mit der Annotation
+ <literal>SECURITY</literal> protokolliert. Dies erfolgt
+ allerdings nur, wenn die Anzahl der protokollierten
+ Pakete der betreffenden Regel die definierte
+ <literal>LOG_AMOUNT</literal>-Grenze nicht übersteigt.
+ Wenn <literal>LOG_AMOUNT</literal> nicht definiert ist,
+ wird die Grenze aus dem Wert von
+ <varname>net.inet.ip.fw.verbose_limit</varname>
+ benutzt. Ein Wert von <literal>0</literal> 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 <command>ipfw resetlog</command>
+ zurücksetzen.</para>
- <para>Unser kleines Skript kann daher nur auf eine der beiden folgenden
- Weisen verwendet werden:</para>
+ <note>
+ <para>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.</para>
+ </note>
+ </listitem>
+ </varlistentry>
- <itemizedlist>
- <listitem>
- <para>Entfernen Sie das Kommentarzeichen der Zeile, die mit
- <literal>cat</literal> beginnt. Kommentieren Sie die Zeile aus,
- die mit <literal>/sbin/ipf</literal> beginnt. Schreiben Sie die
- Zeile <literal>ipfilter_enable="YES"</literal> in die Datei
- <filename>/etc/rc.conf</filename> und rufen Sie dann das Skript
- auf, um <filename>/etc/ipf.rules</filename> zu erstellen oder
- zu erneuern.</para>
- </listitem>
-
- <listitem>
- <para>Deaktivieren Sie IPFILTER in den Systemstart-Skripten, indem
- Sie die Zeile <literal>ipfilter_enable="NO"</literal> in die
- Datei <filename>/etc/rc.conf</filename> eintragen (was auch der
- Standard-Einstellung entspricht).</para>
-
- <para>Fügen Sie ein Skript ähnlich dem folgenden in Ihr
- Verzeichnis <filename>/usr/local/etc/rc.d/</filename>. Es
- sinnvoll, dem Skript einen offensichtlichen Namen zu geben, wie
- etwa <filename>ipf.loadrules.sh</filename>. Die Endung
- <filename>.sh</filename> ist dabei verbindlich.</para>
-
- <programlisting>#!/bin/sh
-sh /etc/ipf.rules.script</programlisting>
-
- <para>Die Zugriffsrechte für die Datei, die das Skript
- enthält, müssen für den Eigentümer
- <systemitem class="username">root</systemitem> auf Lesen, Schreiben und Ausführen
- gesetzt werden.</para>
+ <varlistentry>
+ <term>PROTO</term>
+ <listitem>
+ <para>Dieser optionale Wert wird verwendet, um einen
+ beliebigen Protokollnamen oder -nummer aus
+ <filename>/etc/protocols</filename> gegen das Paket zu
+ prüfen.</para>
+ </listitem>
+ </varlistentry>
- <screen>&prompt.root; <userinput>chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh</userinput></screen>
- </listitem>
- </itemizedlist>
+ <varlistentry>
+ <term>SRC</term>
+ <listitem>
+ <para>Nach dem Schlüsslwort<literal>from</literal> muss
+ die Quelladresse stehen, oder ein Schlüsselwort, das die
+ Quelladresse darstellt. Eine Adresse wird dargestellt
+ duch <literal>any</literal>, <literal>me</literal> (jede
+ Adresse dieses Systems), <literal>me6</literal> (jede
+ <acronym>IPv6</acronym>-Adresse dieses Systems), oder
+ <literal>table</literal> gefolgt von der Nummer der
+ Tabelle, welche die Adressen enthält.
+ <acronym>IP</acronym>-Adressen können in
+ <acronym>CIDR</acronym>-Notation geschrieben werden.
+ Beispielsweise <literal>1.2.3.4/25</literal> oder
+ <literal>1.2.3.4:255.255.255.128</literal>.</para>
+ </listitem>
+ </varlistentry>
- <para>Wenn nun Ihr System startet, werden Ihre IPF-Regeln geladen.</para>
- </sect2>
+ <varlistentry>
+ <term>SRC_PORT</term>
+ <listitem>
+ <para>Optional kann ein Quellport über eine Nummer oder
+ einen Namen aus <filename>/etc/services</filename>
+ spezifiziert werden.</para>
+ </listitem>
+ </varlistentry>
- <sect2>
- <title>IPF Regelsätze</title>
+ <varlistentry>
+ <term>DST</term>
+ <listitem>
+ <para>Nach dem Schlüsselwort <literal>to</literal> 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.</para>
+ </listitem>
+ </varlistentry>
- <para> 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
- <acronym>TCP/IP</acronym> arbeitet, zum Beispiel
- <literal>telnet</literal>, <literal>www</literal> oder
- <literal>mail</literal>, 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.</para>
+ <varlistentry>
+ <term>DST_PORT</term>
+ <listitem>
+ <para>Optional kann ein Zielport über eine Nummer oder
+ einen Namen aus <filename>/etc/services</filename>
+ spezifiziert werden.</para>
+ </listitem>
+ </varlistentry>
- <indexterm>
- <primary>IPFILTER</primary>
+ <varlistentry>
+ <term>OPTIONS</term>
+ <listitem>
+ <para>Nach der Quell- und Zieladresse können noch weitere
+ Optionen angegeben werden. Wie der Name bereits sagt,
+ sind <literal>OPTIONS</literal> optional. Häufig
+ verwendete Optionen sind <literal>in</literal> oder
+ <literal>out</literal>, mit denen die Richtug des
+ Pakets bestimmt wird, <literal>icmptypes</literal>
+ gefolgt vom Typ der <acronym>ICMP</acronym>-Nachricht,
+ sowie <literal>keep-state</literal>.</para>
- <secondary>rule processing order</secondary>
- </indexterm>
+ <para>Wenn ein Paket auf eine
+ <parameter>keep-state</parameter>-Regel zutrifft, wird
+ die Firewall eine dynamische Regel erstellen, die dem
+ bidirektionalen Datenverkehr zwischen den gleichen
+ Quell- und Zieladressen mit dem gleichen Protokoll
+ entspricht.</para>
+
+ <para>Dynamische Regeln sind für einen sogenannten
+ <foreignphrase>SYN-flood</foreignphrase>-Angriff
+ anfällig, bei dem eine riesige Anzahl an dynamischen
+ Regeln erzeugt wird. Verwenden Sie die Option
+ <literal>limit</literal>, 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 <literal>limit</literal>
+ definierten Wert, wird das Paket verworfen.</para>
- <para>IPF wurde ursprünglich mit einer Regel-Prozess-Logik
- geschrieben, die ausschließlich statusfreie Regeln zuließ
- und nach dem Prinzip <quote>die letzte Regel, die passt,
- entscheidet</quote> arbeitete. Mit der Zeit erhielt IPF eine
- <option>quick</option> Option sowie <option>keep-state</option> Option
- für die Anwendung von zustandsorientierten Regeln, was die
- Regel-Prozess-Logik signifikant modernisierte.</para>
-
- <para>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.</para>
-
- <warning>
- <para>Wenn Sie mit einer Firewall arbeiten, seien Sie
- <emphasis>sehr vorsichtig</emphasis>. Durch wenige Einstellungen
- können Sie sich aus Ihrem System
- <emphasis>aussperren</emphasis>. 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. <application>ssh</application>.</para>
- </warning>
+ <para>Es stehen noch viele weitere Optionen zur Verfügung.
+ &man.ipfw.8; enthält eine Beschreibung der einzelnen
+ Optionen.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
</sect2>
<sect2>
- <title>IPF Regel-Syntax</title>
+ <title>Beispiel für einen Regelsatz</title>
- <indexterm>
- <primary>IPFILTER</primary>
+ <para>Dieser Abschnitt die Erstellung eines Firewall-Skripts
+ namens <filename>/etc/ipfw.rules</filename> mit
+ zustandsorientierten (<foreignphrase>stateful</foreignphrase>
+ Regeln. Alle Regeln in diesem Beispiel verwenden die Optionen
+ <literal>in</literal> und <literal>out</literal>, um die
+ Richtung des Pakets zu verdeutlichen. Zusätzlich wird
+ <literal>via</literal>
+ <replaceable>interface-name</replaceable> benutzt, um die
+ Schnittstelle für das Paket zu prüfen.</para>
- <secondary>rule syntax</secondary>
- </indexterm>
+ <note>
+ <para>Bei den anfänglichen Tests mit dem Firewall-Regelsatz
+ sollten Sie vielleicht folgende Einstellung
+ vornehmen:</para>
- <para>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
- <quote>die erste Regel, die passt, gewinnt</quote>-Logik,
- zurückgreift. Um alles über die veraltete Syntax zu
- erfahren, lesen Sie bitte die Man-Page von &man.ipf.8;.</para>
+ <programlisting>net.inet.ip.fw.default_to_accept="1"</programlisting>
- <para>Ein <literal>#</literal>-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.</para>
+ <para>Dies legt die Standardregel von &man.ipfw.8; etwas
+ großzügiger fest, als das voreingestellte
+ <literal>default deny ip from any to any</literal>. Dadurch
+ sinkt die Gefahr, sich nach einem Neustart des Systems
+ auszusperren.</para>
+ </note>
- <para>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.</para>
+ <para>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 <literal>cmd</literal> erstellt, sodass
+ <literal>ipfw add</literal> nicht jedes mal von Hand
+ eingegeben werden muss. Die Variable <literal>pif</literal>
+ repräsentiert die mit dem Internet verbundene
+ Schnittstelle.</para>
- <!-- This section is probably wrong. See the OpenBSD flag -->
- <!-- What is the "OpenBSD flag"? Reference please -->
+ <programlisting>#!/bin/sh
+# Flush out the list before we begin.
+ipfw -q -f flush
- <para><replaceable>ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO
- SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG
- STATEFUL</replaceable></para>
+# Set rules command prefix
+cmd="ipfw -q add"
+pif="dc0" # interface name of NIC attached to Internet</programlisting>
- <para><replaceable>ACTION</replaceable> = block | pass</para>
+ <para>Jetzt folgen die eigentlichen Filterregeln. Diese ersten
+ beiden Regeln erlauben den Datenverkehr aus dem internen
+ Netzwerk und über die Loopback-Schnittstelle:</para>
- <para><replaceable>IN-OUT</replaceable> = in | out</para>
+ <programlisting># Change xl0 to LAN NIC interface name
+&dollar;cmd 00005 allow all from any to any via xl0
- <para><replaceable>OPTIONS</replaceable> = log | quick | on
- interface-name</para>
+# No restrictions on Loopback Interface
+&dollar;cmd 00010 allow all from any to any via lo0</programlisting>
- <para><replaceable>SELECTION</replaceable> = proto value |
- source/destination IP | port = number | flags flag-value</para>
+ <para>Die nächste Regel erlaubt Pakete, für die ein Eintrag
+ in der dynamischen Zustandstabelle existiert:</para>
- <para><replaceable>PROTO</replaceable> = tcp/udp | udp | tcp |
- icmp</para>
+ <programlisting>&dollar;cmd 00101 check-state</programlisting>
- <para><replaceable>SRC_ADD,DST_ADDR</replaceable> = all | from
- object to object</para>
+ <para>Die nächsten Regeln definieren, welche internen Rechner
+ Verbindungen zu anderen Rechnern im Internet aufbauen dürfen.
+ Hier werden wieder zustandsorientierte Regeln
+ verwendet:</para>
- <para><replaceable>OBJECT</replaceable> = IP address | any</para>
+ <programlisting># 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
+&dollar;cmd 00110 allow tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
+&dollar;cmd 00111 allow udp from any to x.x.x.x 53 out via &dollar;pif keep-state
- <para><replaceable>PORT_NUM</replaceable> = port number</para>
+# 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
+&dollar;cmd 00120 allow log udp from any to any 67 out via &dollar;pif keep-state
+#&dollar;cmd 00120 allow udp from any to x.x.x.x 67 out via &dollar;pif keep-state
- <para><replaceable>TCP_FLAG</replaceable> = S</para>
+# Allow outbound HTTP and HTTPS connections
+&dollar;cmd 00200 allow tcp from any to any 80 out via &dollar;pif setup keep-state
+&dollar;cmd 00220 allow tcp from any to any 443 out via &dollar;pif setup keep-state
- <para><replaceable>STATEFUL</replaceable> = keep state</para>
+# Allow outbound email connections
+&dollar;cmd 00230 allow tcp from any to any 25 out via &dollar;pif setup keep-state
+&dollar;cmd 00231 allow tcp from any to any 110 out via &dollar;pif setup keep-state
- <sect3>
- <title>ACTION</title>
+# Allow outbound ping
+&dollar;cmd 00250 allow icmp from any to any out via &dollar;pif keep-state
- <para>Die <quote>ACTION</quote> bestimmt, was mit dem Paket passieren
- soll, wenn der Rest der Regel zutrifft. Dieser Teil muss
- für jede Regel angegeben werden.</para>
-
- <para>Das Schlüsselwort <literal>block</literal> gibt an, dass
- das Paket verfallen soll, wenn die Auswahlparameter zutreffen.</para>
-
- <para>Das Schlüsselwort <literal>pass</literal> gibt an, dass
- das Paket durch die Firewall durchgelassen werden soll, wenn die
- Auswahlparameter zutreffen.</para>
- </sect3>
+# Allow outbound NTP
+&dollar;cmd 00260 allow tcp from any to any 37 out via &dollar;pif setup keep-state
- <sect3>
- <title>IN-OUT</title>
+# Allow outbound SSH
+&dollar;cmd 00280 allow tcp from any to any 22 out via &dollar;pif setup keep-state
- <para>Ebenfalls verbindlich ist die Angabe, welchen Teil der
- Verbindung, Ein- oder Ausgang, die Regel beeinflussen soll. Das
- nächste Schlüsselwort muss daher entweder
- <literal>in</literal>, für eingehend, oder
- <literal>out</literal>, für ausgehend, lauten - oder die Regel
- wird aufgrund eines Syntaxfehlers nicht umgesetzt.</para>
-
- <para><literal>in</literal> bedeutet, dass diese Regel auf eingehende
- Pakete angewendet wird, die gerade an der dem öffentlichen
- Internet zugewandten Schnittstelle empfangen wurden.</para>
-
- <para><literal>out</literal> bedeutet, das diese Regel auf ausgehende
- Pakete angewendet wird, also Pakete die gerade gesendet werden und
- deren Zieladresse im öffentlichen Internet liegt.</para>
- </sect3>
+# deny and log all other outbound connections
+&dollar;cmd 00299 deny log all from any to any out via &dollar;pif</programlisting>
- <sect3>
- <title>OPTIONS</title>
-
- <note>
- <para>Die Optionen müssen in der hier aufgeführten
- Reihenfolge verwendet werden.</para>
- </note>
-
- <para><literal>log</literal> bestimmt, dass die Kopfdaten des Paketes
- an die Systemschnittstelle &man.ipl.4; geschrieben werden sollen.
- Genaueres dazu weiter unten im Abschnitt LOGGING.</para>
-
- <para><literal>quick</literal> bestimmt, dass,
- <emphasis>wenn</emphasis> 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.</para>
-
- <para><literal>on</literal> 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 (<literal>in</literal>) oder gesendet
- (<literal>out</literal>) wurden. Für die modernisierte
- Regel-Prozess-Logik ist die Verwendung dieser Option
- verbindlich.</para>
-
- <para>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 <literal>log</literal> und in
- gleicher Reihenfolge stehen:</para>
-
- <para><literal>body</literal> bestimmt, dass die ersten 128 Bytes des
- Paketinhaltes zusätzlich zu den Kopfdaten protokolliert
- werden.</para>
-
- <para><literal>first</literal> trifft nur zu, wenn das
- Schlüsselwort <literal>log</literal> zusammen mit
- <literal>keep-state</literal> 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.</para>
- </sect3>
+ <para>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 <literal>limit</literal>, um
+ <foreignphrase>Flooding</foreignphrase> zu unterbinden.</para>
- <sect3>
- <title>SELECTION</title>
+ <programlisting># Deny all inbound traffic from non-routable reserved address spaces
+&dollar;cmd 00300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 00304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 00305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
+&dollar;cmd 00306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
+&dollar;cmd 00307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster interconnect
+&dollar;cmd 00308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
- <para>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:</para>
- </sect3>
+# Deny public pings$
+&dollar;cmd 00310 deny icmp from any to any in via &dollar;pif$
+$
+# Deny ident$
+&dollar;cmd 00315 deny tcp from any to any 113 in via &dollar;pif$
+$
+# Deny all Netbios services.$
+&dollar;cmd 00320 deny tcp from any to any 137 in via &dollar;pif$
+&dollar;cmd 00321 deny tcp from any to any 138 in via &dollar;pif$
+&dollar;cmd 00322 deny tcp from any to any 139 in via &dollar;pif$
+&dollar;cmd 00323 deny tcp from any to any 81 in via &dollar;pif$
- <sect3>
- <title>PROTO</title>
+# Deny fragments
+&dollar;cmd 00330 deny all from any to any frag in via &dollar;pif
- <para><literal>proto</literal> 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.</para>
-
- <para><literal>tcp/udp | udp | tcp | icmp</literal> oder irgendein
- Protokollname, der in der Datei <filename>/etc/protocols</filename>
- zu finden ist, kann übergeben werden. Außerdem kann das
- Schlüsselwort <literal>tcp/udp</literal> verwendet werden, wenn
- sowohl <acronym>TCP</acronym> als auch <acronym>UDP</acronym> von der
- Regel betroffen sein sollen. Dieses Schlüsselwort wurde
- eingeführt, um Duplikate sonst identischer Regeln zu
- vermeiden.</para>
- </sect3>
+# Deny ACK packets that did not match the dynamic rule table
+&dollar;cmd 00332 deny tcp from any to any established in via &dollar;pif
- <sect3>
- <title>SRC_ADDR/DST_ADDR</title>
+# Allow traffic from ISP's DHCP server.
+# Replace x.x.x.x with the same IP address used in rule 00120.
+#&dollar;cmd 00360 allow udp from any to x.x.x.x 67 in via &dollar;pif keep-state
- <para>Das Schlüsselwort <literal>all</literal> ist ein Synonym
- für <quote>from any to any</quote> ohne weitere
- Auswahlkriterien.</para>
-
- <para><literal>from src to dst</literal>: Die Schlüsselwörter
- <literal>from</literal> und <literal>to</literal> 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
- <literal>any</literal> übergeben werden, das für jede
- beliebige IP-Adresse steht. Zum Beispiel:
- <literal>from any to any</literal> oder
- <literal>from 0.0.0.0/0 to any</literal> oder
- <literal>from any to 0.0.0.0/0</literal> oder
- <literal>from 0.0.0.0 to any</literal> oder
- <literal>from any to 0.0.0.0</literal> bedeuten alle das
- Gleiche.</para>
-
- <para>IP-Bereiche können nur in der CIDR-Notation angegeben
- werden. Der Port <package>net-mgmt/ipcalc</package>
- hilft Ihnen bei der Berechnung der richtigen Angaben.
- Weiterführende Informationen zu CIDR finden Sie auf der Webseite
- von <link xlink:href="http://www.rfc-editor.org/rfc/rfc1519.txt"><literal>ipcalc</literal></link>.</para>
- </sect3>
+# Allow HTTP connections to internal web server
+&dollar;cmd 00400 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
- <sect3>
- <title>PORT</title>
+# Allow inbound SSH connections
+&dollar;cmd 00410 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
- <para>Wenn ein Port als Auswahlkriterium übergeben wurde, bei
- Quelle und/oder Ziel, wird er nur bei <acronym>TCP</acronym> und
- <acronym>UDP</acronym> Paketen verwendet. Angegeben werden kann
- entweder die Portnummer oder der Dienstname aus
- <filename>/etc/services</filename>. Die Verwendung der
- Portoption mit dem <literal>to</literal>-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 <literal>www</literal>-Port):
- <literal>from any to any port = 80</literal>.</para>
-
- <!-- XXX: Rewritten, but probably needs more changes -->
-
- <para>Einfache Portvergleiche können auf verschiedenen Wegen
- erfolgen. Mehrere Vergleichsoperatoren stehen dafür zur
- Verfügung. Genauso können Bereiche angegeben
- werden.</para>
-
- <para>port "=" | "!=" | "&lt;" | "&gt;" | "&lt;=" | "&gt;=" | "eq"
- | "ne" | "lt" | "gt" | "le" | "ge".</para>
-
- <para>Um einen Bereich anzugeben: port "&lt;&gt;" | "&gt;&lt;"</para>
-
- <warning>
- <para>Genau wie die Trefferspezifikation für Quelle und Ziel
- sind auch die beiden folgenden Parameter obligatorisch bei der
- Verwendung der modernen Regel-Prozess-Logik.</para>
- </warning>
- </sect3>
+# Reject and log all other incoming connections
+&dollar;cmd 00499 deny log all from any to any in via &dollar;pif</programlisting>
- <sect3>
- <title><acronym>TCP</acronym>_FLAG</title>
+ <para>Die letzte Regel protokolliert alle Pakete, die mit
+ keiner Regel im Regelsatz übereinstimmen:</para>
- <para>Flags spielen nur beim Filtern von <acronym>TCP</acronym> eine
- Rolle. Die Buchstaben entsprechen jeweils einem möglichen
- Flag, dass in den Kopfdaten der <acronym>TCP</acronym>-Pakete
- geprueft werden soll.</para>
-
- <para>Die moderne Regel-Prozess-Logik verwendet den Parameter
- <literal>flags S</literal> um eine Anfrage zum Start einer
- <acronym>TCP</acronym>-Session zu identifizieren.</para>
- </sect3>
+ <programlisting># Everything else is denied and logged
+&dollar;cmd 00999 deny log all from any to any</programlisting>
+ </sect2>
- <sect3>
- <title>STATEFUL</title>
+ <sect2 xml:id="network-natd">
+ <info>
+ <title><acronym>NAT</acronym> Konfiguration</title>
- <para><literal>keep state</literal> zeigt bei einer Passage-Regel an,
- dass für alle Pakete, die die Selektion erfolgreich durchlaufen,
- <literal>Stateful Filtering</literal> eingerichtet werden
- soll.</para>
-
- <note>
- <para>Diese Option ist obligatorisch für die Verwendung der
- modernen Prozess-Regel-Logik.</para>
- </note>
- </sect3>
- </sect2>
-<!-- xxxxxxxxxxx Benjamin bis hier xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //-->
- <sect2>
- <title>Stateful Filtering</title>
+ <authorgroup>
+ <author>
+ <personname>
+ <firstname>Chern</firstname>
+ <surname>Lee</surname>
+ </personname>
+ <contrib>Beigetragen von </contrib>
+ </author>
+ </authorgroup>
+ </info>
<indexterm>
- <primary>IPFILTER</primary>
-
- <secondary>stateful filtering</secondary>
+ <primary>NAT</primary>
+ <secondary>und <application>IPFW</application></secondary>
</indexterm>
- <!-- XXX: duplicated -->
+ <para>&os;s integrierter <acronym>NAT</acronym>-Daemon,
+ &man.natd.8;, arbeitet in Verbindung mit
+ <application>IPFW</application>, um
+ <foreignphrase>Network Address Translation</foreignphrase>
+ bereitzustellen. <acronym>NAT</acronym> wird verwendet, um
+ mehreren internen Rechnern, über eine einzige
+ <acronym>IP</acronym>-Adresse, eine gemeinsame Verbindung zum
+ Internet zu ermöglichen.</para>
- <para>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.</para>
-
- <para>Keep state will also allow <acronym>ICMP</acronym> packets related to a
- <acronym>TCP</acronym> or <acronym>UDP</acronym> session through. So if you get
- <acronym>ICMP</acronym> 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.</para>
-
- <para>What happens is:</para>
-
- <para>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.</para>
-
- <para>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.</para>
-
- <para>When the conversation completes it is removed from the
- dynamic state table.</para>
-
- <para>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.</para>
- </sect2>
+ <para>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 <link
+ xlink:href="ftp://ftp.isi.edu./in-notes/rfc1918.txt">RFC
+ 1918</link> konforme Adresse zugewiesen bekommen. Zudem
+ muss das Standard-Gateway der Rechner auf die interne
+ <acronym>IP</acronym>-Adresse des &man.natd.8;-Systems
+ gesetzt werden.</para>
- <sect2>
- <!-- XXX: This section needs a rewrite -->
+ <para>Es ist noch ein wenig Konfiguration nötig, um die
+ <acronym>NAT</acronym>-Funktion von
+ <application>IPFW</application> zu aktivieren. Wenn das
+ System einen angepassten Kernel hat, muss die
+ Kernelkonfigurationsdatei die Zeile
+ <literal>option IPDIVERT</literal> sowie weitere
+ <literal>IPFIREWALL</literal>-Optionen, die in <xref
+ linkend="firewalls-ipfw-enable"/> beschrieben sind,
+ enthalten.</para>
- <title>Inclusive Ruleset Example</title>
+ <para>Um die <acronym>NAT</acronym>-Unterstützung beim Booten
+ zu aktivieren, müssen folgende Einträge in
+ <filename>/etc/rc.conf</filename> vorhanden sein:</para>
- <para>The following ruleset is an example of how to code a very
- secure inclusive type of firewall. An inclusive firewall only
- allows services matching <literal>pass</literal> rules through, and blocks all
- others by default. Firewalls intended to protect other machines,
- also called <quote>network firewalls</quote>, should have at least
- two interfaces, which are generally configured to trust one side
- (the <acronym>LAN</acronym>) and not the other (the public Internet). Alternatively,
- a firewall might be configured to protect only the system it is
- running on&mdash;this is called a
- <quote>host based firewall</quote>, and is particularly appropriate
- for servers on an untrusted network.</para>
-
- <para>All &unix; flavored systems including &os; are designed to
- use interface <filename>lo0</filename> and IP address
- <systemitem class="ipaddress">127.0.0.1</systemitem> for internal
- communication within the operating system. The firewall rules
- must contain rules to allow free unmolested movement of these
- special internally used packets.</para>
-
- <para>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
- <filename>tun0</filename> interface or your NIC that is
- connected to your DSL or cable modem.</para>
-
- <para>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).</para>
-
- <para>The rules should be organized into three major
- sections: first trusted interfaces, then the public
- interface outbound, and last the public untrusted interface inbound.</para>
-
- <para>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.</para>
-
- <para>The Outbound section in the following ruleset only
- contains <literal>pass</literal> rules which contain selection values that
- uniquely identify the service that is authorized for public
- Internet access. All the rules have the <literal>quick</literal>, <literal>on</literal>,
- <literal>proto</literal>, <literal>port</literal>, and <literal>keep state</literal> options set. The <literal>proto
- tcp</literal> rules have the <literal>flag</literal> option included to identify the
- session start request as the triggering packet to activate the
- stateful facility.</para>
-
- <para>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 <literal>allow</literal> 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.</para>
-
- <para>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 <literal>log first</literal> option, will only
- log the event the first time they are triggered. This option is
- included in the sample <literal>nmap OS fingerprint</literal> rule.
- The <package>security/nmap</package> utility is
- commonly used by attackers who attempt to identify the operating
- system of your server.</para>
-
- <para>Any time there are logged messages on a rule with
- the <literal>log first</literal> option, an <command>ipfstat -hio</command>
- 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).</para>
-
- <para>The <filename>/etc/services</filename> file may be used to
- lookup unknown port numbers. Alternatively,
- visit <uri xlink:href="http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers">http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers</uri>
- and do a port number lookup to find the purpose of a particular
- port number.</para>
-
- <para>Check out this link for port numbers used by Trojans <uri xlink:href="http://www.sans.org/security-resources/idfaq/oddports.php">http://www.sans.org/security-resources/idfaq/oddports.php</uri>.</para>
-
- <para>The following ruleset creates a complete and very secure
- <literal>inclusive</literal> type of firewall ruleset that has been
- tested on production systems. It can be easily modified for your
- own system. Just comment out any <literal>pass</literal> rules for
- services that should not be authorized.</para>
-
- <para>To avoid logging unwanted messages,
- just add a <literal>block</literal> rule in the inbound section.</para>
-
- <para>The <filename>dc0</filename> 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 <filename>tun0</filename>.</para>
-
- <para>Add the following statements to
- <filename>/etc/ipf.rules</filename>:</para>
-
- <programlisting>#################################################################
-# No restrictions on Inside LAN Interface for private network
-# Not needed unless you have LAN
-#################################################################
+ <programlisting>gateway_enable="YES" # enables the gateway
+natd_enable="YES" # enables <acronym>NAT</acronym>
+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;</programlisting>
-#pass out quick on xl0 all
-#pass in quick on xl0 all
+ <note>
+ <para>Es ist auch möglich eine Konfigurationsdatei zu
+ verwenden, welche die Optionen enthält, die an
+ &man.natd.8; übergeben werden:</para>
-#################################################################
-# No restrictions on Loopback Interface
-#################################################################
-pass in quick on lo0 all
-pass out quick on lo0 all
+ <programlisting>natd_flags="-f /etc/natd.conf"</programlisting>
-#################################################################
-# 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
+ <para>Die angegebene Datei muss die Konfigurationsoptionen
+ enthalten, eine Option pro Zeile. Zum Beispiel:</para>
-# 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 &amp; 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
+ <programlisting>redirect_port tcp 192.168.0.2:6667 6667
+redirect_port tcp 192.168.0.3:80 80</programlisting>
+ <para>Weitere Informationen zu dieser Konfigurationsdatei
+ finden Sie in &man.natd.8;.</para>
+ </note>
-# Allow out non-secure standard www function
-pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
+ <para>Als nächstes werden die <acronym>NAT</acronym>-Regeln
+ hinzugefügt. Wenn die Regeln zustandsorientiert sind, ist die
+ Platzierung der <acronym>NAT</acronym>-Regeln sehr wichtig und
+ die <literal>skipto</literal>-Aktion wird verwendet. Dies
+ erfordert, dass jede Regel über eine eindeutige Nummer
+ verfügt, um eindeutige Sprungziele zu erhalten.</para>
-# 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
+ <para>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
+ <acronym>NAT</acronym> zu konfigurieren. Zunächst werden
+ einige Variablen hinzugefügt, darunter Regelnummern, die
+ <literal>keep-state</literal>-Option und eine Liste mit
+ <acronym>TCP</acronym>-Ports um die Anzahl der Regeln zu
+ reduzieren:</para>
-# Allow out send &amp; 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
+ <programlisting>#!/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"</programlisting>
-# Allow out Time
-pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
+ <para>Die <acronym>NAT</acronym>-Regel für eingehende Pakete
+ wird <emphasis>nach</emphasis> den beiden Regeln, die das
+ interne Netzwerk und die Loopback-Schnittstelle erlauben und
+ <emphasis>vor</emphasis> der
+ <literal>check-state</literal>-Regel eingefügt. Es ist
+ wichtig, dass die Nummer der <acronym>NAT</acronym>-Regel
+ (in diesem Beispiel <literal>100</literal>) höher ist, als
+ die beiden vorherigen Regeln und niedriger, als die
+ <literal>check-state</literal>-Regel:</para>
-# Allow out nntp news
-pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state
+ <programlisting>&dollar;cmd 005 allow all from any to any via xl0 # exclude LAN traffic
+&dollar;cmd 010 allow all from any to any via lo0 # exclude loopback traffic
+&dollar;cmd 100 divert natd ip from any to any in via &dollar;pif # NAT any inbound packets
+# Allow the packet through if it has an existing entry in the dynamic rules table
+&dollar;cmd 101 check-state</programlisting>
-# Allow out gateway &amp; LAN users' non-secure FTP ( both passive &amp; active modes)
-# This function uses the IP<acronym>NAT</acronym> 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
+ <para>Die Regeln für den ausgehenden Verkehr werden ebenfalls
+ modifiziert, um Aktionen mit der
+ <literal>&dollar;skipto</literal>-Variable zu erlauben und
+ anzuzeigen, dass die Prüfung mit der Regel
+ <literal>500</literal> fortgesetzt wird. Die sieben Regeln
+ für <acronym>TCP</acronym> wurden durch die Regel
+ <literal>125</literal> ersetzt, da die sieben erlaubten
+ ausgehenden Ports in der Variable
+ <literal>&dollar;good_tcp0</literal> enthalten sind.</para>
-# 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
+ <programlisting># Authorized outbound packets
+&dollar;cmd 120 &dollar;skip udp from any to x.x.x.x 53 out via &dollar;pif &dollar;ks
+&dollar;cmd 121 &dollar;skip udp from any to x.x.x.x 67 out via &dollar;pif &dollar;ks
+&dollar;cmd 125 &dollar;skip tcp from any to any &dollar;good_tcpo out via &dollar;pif setup &dollar;ks
+&dollar;cmd 130 &dollar;skip icmp from any to any out via &dollar;pif &dollar;ks</programlisting>
-# Allow out insecure Telnet
-pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state
+ <para>Die eingehenden Regeln bleiben unverändert, mit Ausnahme
+ der letzten Regel, in der das
+ <literal>via &dollar;pif</literal> entfert wird, um ein- und
+ ausgehende Pakete prüfen zu können. Nach der letzten Regel
+ für ausgehende Pakete muss die <acronym>NAT</acronym>-Regel
+ folgen. Die Regel muss eine höhere Nummer als die letzte
+ Regel haben und die Nummer muss über die
+ <literal>skipto</literal>-Aktion referenziert werden. In
+ diesem Regelsatz leitet die Regel mit der Nummer
+ <literal>500</literal> alle ausgehenden Pakete zur
+ Weiterverarbeitung an &man.natd.8; weiter. Die darauf
+ folgende Regel lässt alle von <acronym>NAT</acronym>
+ verarbeiteten Pakete passieren.</para>
-# Allow out FreeBSD CVSup
-pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state
+ <programlisting>&dollar;cmd 499 deny log all from any to any
+&dollar;cmd 500 divert natd ip from any to any out via &dollar;pif # skipto location for outbound stateful rules
+&dollar;cmd 510 allow ip from any to any</programlisting>
-# Allow out ping to public Internet
-pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
+ <para>In diesem Beispiel steuern die Regeln
+ <literal>100</literal>, <literal>101</literal>,
+ <literal>125</literal>, <literal>500</literal> und
+ <literal>510</literal> die Adressübersetzung der ein- und
+ ausgehende Pakete, so dass immer die private
+ <acronym>LAN</acronym> <acronym>IP</acronym>-Adresse in der
+ dynamische Zustandstabelle registriert werden.</para>
-# 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
+ <para>Nehmen wir beispielsweise einen Web-Browser, der neue
+ <acronym>HTTP</acronym>-Sitzungen über Port 80 aufbaut. Wenn
+ nun das erste ausgehende Paket von der Firewall geprüft wird,
+ trifft es nicht auf Regel <literal>100</literal> zu, da das
+ Paket nach außen geleitet wird und nicht nach innen. Das
+ Paket trifft auch nicht auf Regel <literal>101</literal> zu,
+ da es das erste ist und somit noch nicht in der dynamischen
+ Zustandstabelle enthalten ist. Das Paket entspricht
+ schließlich Regel <literal>125</literal>, da es ausgehend auf
+ einem erlaubten Port gesendet wird und von einer
+ <acronym>IP</acronym>-Adresse aus dem internen
+ <acronym>LAN</acronym> stammt. Für Pakete, die auf diese
+ Regel zutreffen, werden zwei Aktionen ausgeführt. Zuerst
+ wird durch die Aktion <literal>keep-state</literal> ein
+ dynamischer Eintrag in der Statustabelle erstellt und die
+ angegebene Aktion <literal>skipto 500</literal> ausgeführt.
+ Als nächstes durchläuft das Paket <acronym>NAT</acronym> 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
+ <literal>100</literal> auf das Paket zu und die Zieladresse
+ wird auf die zugehörige (lokale)
+ <acronym>LAN</acronym>-Adresse abgebildet. Danach wird das
+ Paket von der Regel <literal>check-state</literal>
+ verarbeitet. Die Zustandstabelle erkennt, dass eine
+ zugehörige aktive Sitzung vorliegt und das Paket wird
+ freigegeben und in das <acronym>LAN</acronym> geleitet.</para>
-# 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.
-#################################################################
+ <para>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
+ <acronym>LAN</acronym> freigegeben. Das Antwortpaket wird
+ von der Regel <literal>check-state</literal> als Paket einer
+ aktiven Sitzung erkannt. Das Paket wird dann von Regel
+ <literal>500</literal> per <acronym>NAT</acronym>
+ verarbeitet, bevor es über die externe Schnittstelle versendet
+ wird.</para>
-# 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 &amp; 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
+ <sect3>
+ <title>Weiterleitung von Ports</title>
-# 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
+ <para>Der Nachteil von &man.natd.8; ist, dass die Rechner im
+ <acronym>LAN</acronym> 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 <acronym>LAN</acronym> 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
+ <acronym>LAN</acronym> weiterleiten.</para>
-# 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 #####################################</programlisting>
- </sect2>
+ <para>Angenommen es gibt einen <acronym>IRC</acronym>-Server
+ auf Rechner <systemitem>A</systemitem> und einen Webserver
+ auf Rechner <systemitem>B</systemitem>. Damit dies
+ funktioniert, müssen die Verbindungen auf den Ports 6667
+ (<acronym>IRC</acronym>) und 80 (<acronym>HTTP</acronym>)
+ an die jeweiligen Rechner weitergeleitet werden.</para>
- <sect2>
- <title><acronym>NAT</acronym></title>
+ <para>Die Syntax für <option>-redirect_port</option>
+ lautet:</para>
- <indexterm><primary>NAT</primary></indexterm>
+ <programlisting>-redirect_port proto targetIP:targetPORT[-targetPORT]
+ [aliasIP:]aliasPORT[-aliasPORT]
+ [remoteIP[:remotePORT[-remotePORT]]]</programlisting>
- <indexterm>
- <primary>IP masquerading</primary>
+ <para>Für das obige Beispiel sollten die Argumente wie folgt
+ aussehen:</para>
- <see>NAT</see>
- </indexterm>
+ <programlisting>-redirect_port tcp 192.168.0.2:6667 6667
+ -redirect_port tcp 192.168.0.3:80 80</programlisting>
- <indexterm>
- <primary>network address translation</primary>
+ <para>Damit werden die entsprechenden
+ <acronym>TCP</acronym>-Ports an die Rechner im
+ <acronym>LAN</acronym> weitergeleitet.</para>
- <see>NAT</see>
- </indexterm>
+ <para>Portbereiche können über <option>-redirect_port</option>
+ festgelegt werden. Zum Beispiel würde
+ <replaceable>tcp 192.168.0.2:2000-3000
+ 2000-3000</replaceable> alle Verbindungen auf die Ports
+ 2000 bis 3000 an die Ports 2000 bis 3000 an
+ Rechner <systemitem>A</systemitem> weiterleiten.</para>
- <para><acronym>NAT</acronym> stands for <emphasis>Network Address
- Translation</emphasis>. To those familiar with &linux;, this concept is
- called IP Masquerading; <acronym>NAT</acronym> and IP
- Masquerading are the same thing. One of the many things the
- IPF <acronym>NAT</acronym> 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.</para>
-
- <para>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.</para>
-
- <para>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.</para>
-
- <para>With <acronym>NAT</acronym> 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. <acronym>NAT</acronym> 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.</para>
-
- <para>There is a special range of IP addresses reserved for
- <acronym>NAT</acronym>ed 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:</para>
-
- <informaltable frame="none" pgwide="1">
- <tgroup cols="3">
- <colspec colwidth="1*"/>
+ <para>Diese Optionen können über
+ <literal>natd_flags=""</literal> in
+ <filename>/etc/rc.conf</filename> direkt beim Start an
+ &man.natd.8; übergeben werden. Alternativ können die
+ Optionen in eine Konfigurationsdatei eingetragen
+ werden.</para>
- <colspec colwidth="1*"/>
+ <para>Weitere Konfigurationsmöglichkeiten sind in
+ &man.natd.8; beschrieben.</para>
+ </sect3>
- <colspec colwidth="1*"/>
+ <sect3>
+ <title>Weiterleiten von Adressen</title>
- <tbody>
- <row>
- <entry>Start IP <systemitem class="ipaddress">10.0.0.0</systemitem></entry>
+ <para>Das Weiterleiten von Adressen ist nützlich, wenn
+ mehr als eine <acronym>IP</acronym>-Adresse zur Verfügung
+ steht. Jeder Rechner im <acronym>LAN</acronym> kann über
+ &man.natd.8; seine eigene externe
+ <acronym>IP</acronym>-Adresse zugewiesen bekommen.
+ &man.natd.8; wird dann den ausgehenden Datenverkehr der
+ Rechner aus dem <acronym>LAN</acronym> mit der
+ entsprechenden externen <acronym>IP</acronym>-Adresse
+ umschreiben. Auch der eingehenden Datenverkehr über die
+ externe <acronym>IP</acronym>-Adresse wird an die
+ entsprechenden Rechner im <acronym>LAN</acronym>
+ weitergeleitet. Diese Methode ist auch als
+ statisches <acronym>NAT</acronym> bekannt. Wenn Ihnen
+ beispielsweise die <acronym>IP</acronym>-Adressen
+ <systemitem class="ipaddress">128.1.1.1</systemitem>,
+ <systemitem class="ipaddress">128.1.1.2</systemitem> und
+ <systemitem class="ipaddress">128.1.1.3</systemitem> zur
+ Verfügung stehen, kann <systemitem
+ class="ipaddress">128.1.1.1</systemitem> als externe
+ Adresse der &man.natd.8;-Maschine verwendet werden, während
+ <systemitem class="ipaddress">128.1.1.2</systemitem> und
+ <systemitem class="ipaddress">128.1.1.3</systemitem> an
+ Rechner <systemitem>A</systemitem> und
+ Rechner <systemitem>B</systemitem> im <acronym>LAN</acronym>
+ weitergeleitet werden.</para>
- <entry>-</entry>
+ <para>Die Syntax für <option>-redirect_address</option>
+ lautet:</para>
- <entry>Ending IP <systemitem class="ipaddress">10.255.255.255</systemitem></entry>
- </row>
+ <programlisting>-redirect_address localIP publicIP</programlisting>
- <row>
- <entry>Start IP <systemitem class="ipaddress">172.16.0.0</systemitem></entry>
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>localIP</entry>
+ <entry>Die interne <acronym>IP</acronym>-Adresse des
+ Rechners im <acronym>LAN</acronym>.</entry>
+ </row>
- <entry>-</entry>
+ <row>
+ <entry>publicIP</entry>
+ <entry>Die externe <acronym>IP</acronym>-Adresse für
+ den entsprechenden Rechner im
+ <acronym>LAN</acronym>.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
- <entry>Ending IP <systemitem class="ipaddress">172.31.255.255</systemitem></entry>
- </row>
+ <para>Für das obige Beispiel sollten die Argumente wie
+ folgt aussehen:</para>
- <row>
- <entry>Start IP <systemitem class="ipaddress">192.168.0.0</systemitem></entry>
+ <programlisting>-redirect_address 192.168.0.2 128.1.1.2
+-redirect_address 192.168.0.3 128.1.1.3</programlisting>
- <entry>-</entry>
+ <para>Genau wie bei <option>-redirect_port</option>, werden
+ diese Argumente innerhalb der
+ <filename>/etc/rc.conf</filename>-Option
+ <literal>natd_flags=""</literal> angegeben, oder alternativ
+ über eine Konfigurationsdatei. Allerdings müssen beim
+ Weiterleiten von Adressen keine Ports umgeleitet werden, da
+ der gesamte eingehende Datenverkehr einer bestimmte
+ <acronym>IP</acronym>-Adresse weitergeleitet wird.</para>
- <entry>Ending IP <systemitem class="ipaddress">192.168.255.255</systemitem></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
+ <para>Die externe <acronym>IP</acronym>-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.</para>
+ </sect3>
</sect2>
- <sect2>
- <title>IP<acronym>NAT</acronym></title>
+ <sect2 xml:id="firewalls-ipfw-cmd">
+ <title>Das <application>IPFW</application> Kommando</title>
<indexterm>
- <primary>NAT</primary>
-
- <secondary>and IPFILTER</secondary>
+ <primary><command>ipfw</command></primary>
</indexterm>
- <indexterm><primary><command>ipnat</command></primary></indexterm>
-
- <para><acronym>NAT</acronym> rules are loaded by using the
- <command>ipnat</command> command. Typically the
- <acronym>NAT</acronym> rules are stored in
- <filename>/etc/ipnat.rules</filename>. See &man.ipnat.8; for
- details.</para>
-
- <para>When changing the <acronym>NAT</acronym> rules after
- <acronym>NAT</acronym> has been started, make your changes to
- the file containing the NAT rules, then run the <command>ipnat</command> command with
- the <option>-CF</option> flags to delete the internal in use
- <acronym>NAT</acronym> rules and flush the contents of the
- translation table of all active entries.</para>
-
- <para>To reload the <acronym>NAT</acronym> rules issue a command
- like this:</para>
-
- <screen>&prompt.root; <userinput>ipnat -CF -f /etc/ipnat.rules</userinput></screen>
+ <para><command>ipfw</command> 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.</para>
- <para>To display some statistics about your
- <acronym>NAT</acronym>, use this command:</para>
+ <para><command>ipfw</command> ist auch hilfreich, um die
+ geladenen Regeln der auf der Konsole auszugeben.
+ <application>IPFW</application> 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.</para>
- <screen>&prompt.root; <userinput>ipnat -s</userinput></screen>
+ <para>Eine Auflistung aller geladenen Regeln erhalten Sie
+ mit:</para>
- <para>To list the <acronym>NAT</acronym> table's current
- mappings, use this command:</para>
+ <screen>&prompt.root; <userinput>ipfw list</userinput></screen>
- <screen>&prompt.root; <userinput>ipnat -l</userinput></screen>
+ <para>Eine Auflistung aller Regeln inklusive des letzten
+ Treffers erhalten Sie mit:</para>
- <para>To turn verbose mode on, and display information relating
- to rule processing and active rules/table entries:</para>
+ <screen>&prompt.root; <userinput>ipfw -t list</userinput></screen>
- <screen>&prompt.root; <userinput>ipnat -v</userinput></screen>
- </sect2>
+ <para>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:</para>
- <sect2>
- <title>IP<acronym>NAT</acronym> Rules</title>
+ <screen>&prompt.root; <userinput>ipfw -a list</userinput></screen>
- <para><acronym>NAT</acronym> rules are very flexible and can
- accomplish many different things to fit the needs of commercial
- and home users.</para>
-
- <para>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.</para>
+ <para>Das folgende Kommando zeigt zusätzlich alle dynamischen
+ Regeln an:</para>
- <para>The syntax for a <acronym>NAT</acronym> rule looks
- something like this:</para>
+ <screen>&prompt.root; <userinput>ipfw -d list</userinput></screen>
- <programlisting>map <replaceable>IF</replaceable> <replaceable>LAN_IP_RANGE</replaceable> -&gt; <replaceable>PUBLIC_ADDRESS</replaceable></programlisting>
+ <para>Um diese Auflistung um die <quote>abgelaufenen</quote>
+ Regeln zu erweitern, geben Sie folgendes Kommando ein:</para>
- <para>The keyword <literal>map</literal> starts the rule.</para>
+ <screen>&prompt.root; <userinput>ipfw -d -e list</userinput></screen>
- <para>Replace <replaceable>IF</replaceable> with the external
- interface.</para>
+ <para>Hiermit werden alle Zähler auf Null zurückgesetzt:</para>
- <para>The <replaceable>LAN_IP_RANGE</replaceable> is what your
- internal clients use for IP Addressing, usually this is
- something like <systemitem class="ipaddress">192.168.1.0/24</systemitem>.</para>
-
- <para>The <replaceable>PUBLIC_ADDRESS</replaceable> can either
- be the external IP address or the special keyword
- <literal>0/32</literal>, which means to use the IP address
- assigned to <replaceable>IF</replaceable>.</para>
- </sect2>
+ <screen>&prompt.root; <userinput>ipfw zero</userinput></screen>
- <sect2>
- <title>How <acronym>NAT</acronym> works</title>
+ <para>Es ist auch möglich, einen spezifischen Zähler
+ zurückzusetzen:</para>
- <para>A packet arrives at the firewall from the LAN with a public
- destination. It passes through the outbound filter rules,
- <acronym>NAT</acronym> gets its turn at the packet and applies
- its rules top down, first matching rule wins.
- <acronym>NAT</acronym> tests each of its rules against the
- packet's interface name and source IP address. When a packet's
- interface name matches a <acronym>NAT</acronym> 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
- <acronym>NAT</acronym> rule. On a match the packet has its
- source IP address rewritten with the public IP address
- obtained by the <literal>0/32</literal> keyword.
- <acronym>NAT</acronym> posts an entry in its internal
- <acronym>NAT</acronym> 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.</para>
- </sect2>
+ <screen>&prompt.root; <userinput>ipfw zero NUM</userinput></screen>
- <sect2>
- <title>Enabling IP<acronym>NAT</acronym></title>
+ <sect3>
+ <title>Protokollierung von Firewall-Nachrichten</title>
- <para>To enable IP<acronym>NAT</acronym> add these statements to
- <filename>/etc/rc.conf</filename>.</para>
+ <para>Auch bei aktivierter Protokollierung wird
+ <application>IPFW</application> 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
+ <literal>log</literal> hinzugefügt werden. Normalerweise
+ werden nur geblockte Pakete protokolliert. Es ist üblich,
+ die <quote>ipfw default deny everything</quote>-Regel am
+ Ende des Regelwerks mit dem Schlüsselwort
+ <literal>log</literal> zu duplizieren. Dadurch ist es
+ möglich, alle Pakete zu sehen, auf die keine Regel
+ zutraf.</para>
- <para>To enable your machine to route traffic between
- interfaces:</para>
+ <para>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.</para>
- <programlisting>gateway_enable="YES"</programlisting>
+ <para>Die Kerneloption
+ <literal>IPFIREWALL_VERBOSE_LIMIT=5</literal> 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:</para>
- <para>To start IP<acronym>NAT</acronym> automatically each
- time:</para>
+ <programlisting>Last message repeated 45 times</programlisting>
- <programlisting>ipnat_enable="YES"</programlisting>
+ <para>Alle protokollierten Pakete werden in der Voreinstellung
+ in <filename>/var/log/security</filename> gespeichert. Dies
+ wird in <filename>/etc/syslog.conf</filename>
+ definiert.</para>
+ </sect3>
- <para>To specify where to load the IP<acronym>NAT</acronym> rules
- from:</para>
+ <sect3 xml:id="firewalls-ipfw-rules-script">
+ <title>Ein Firewall-Regelwerk erstellen</title>
- <programlisting>ipnat_rules="/etc/ipnat.rules"</programlisting>
- </sect2>
-
- <sect2>
- <title><acronym>NAT</acronym> for a very large LAN</title>
-
- <para>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
- <acronym>NAT</acronym>ed LAN PC's, causing collisions. There
- are two ways to relieve this resource problem.</para>
-
- <sect3>
- <title>Assigning Ports to Use</title>
-
- <!-- What does it mean ? Is there something missing ?-->
- <!-- XXXBLAH <- Apparently you can't start a sect
- with a <programlisting> tag ?-->
-
- <para>A normal NAT rule would look like:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 0/32</programlisting>
-
- <para>In the above rule the packet's source port is unchanged
- as the packet passes through IP<acronym>NAT</acronym>. By
- adding the <literal>portmap</literal> keyword,
- IP<acronym>NAT</acronym> can be directed to only use source ports in the specified range.
- For example the following rule will tell
- IP<acronym>NAT</acronym> to modify the source port to be
- within the range shown:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 0/32 portmap tcp/udp 20000:60000</programlisting>
-
- <para>Additionally we can make things even easier by using the
- <literal>auto</literal> keyword to tell
- IP<acronym>NAT</acronym> to determine by itself which ports
- are available to use:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 0/32 portmap tcp/udp auto</programlisting>
- </sect3>
-
- <sect3>
- <title>Using a Pool of Public Addresses</title>
-
- <para>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 <quote>pool</quote>, and IP<acronym>NAT</acronym> may pick one of
- the public IP addresses as packet-addresses are mapped on their way
- out.</para>
-
- <para>For example, instead of mapping all packets through a single
- public IP address, as in:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 204.134.75.1</programlisting>
-
- <para>A range of public IP addresses can be specified either with a
- netmask:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 204.134.75.0/255.255.255.0</programlisting>
-
- <para>or using CIDR notation:</para>
-
- <programlisting>map dc0 192.168.1.0/24 -&gt; 204.134.75.0/24</programlisting>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Port Redirection</title>
-
- <para>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 <acronym>NAT</acronym>ed, but there
- has to be some way to direct the inbound traffic to the
- correct LAN PCs. IP<acronym>NAT</acronym> has the redirection
- facilities of <acronym>NAT</acronym> to solve this problem.
- For example, assuming a web server operating on LAN address <systemitem class="ipaddress">10.0.10.25</systemitem> and using a single public IP
- address of <systemitem class="ipaddress">20.20.20.5</systemitem> the rule would
- be coded as follows:</para>
-
- <programlisting>rdr dc0 20.20.20.5/32 port 80 -&gt; 10.0.10.25 port 80</programlisting>
-
- <para>or:</para>
-
- <programlisting>rdr dc0 0.0.0.0/0 port 80 -&gt; 10.0.10.25 port 80</programlisting>
-
- <para>or for a LAN DNS Server on LAN address of <systemitem class="ipaddress">10.0.10.33</systemitem> that needs to receive
- public DNS requests:</para>
-
- <programlisting>rdr dc0 20.20.20.5/32 port 53 -&gt; 10.0.10.33 port 53 udp</programlisting>
- </sect2>
-
- <sect2>
- <title>FTP and <acronym>NAT</acronym></title>
+ <para>Die meisten fortgeschrittenen
+ <application>IPFW</application>-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.</para>
- <para>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 <uri xlink:href="http://www.slacksite.com/other/ftp.html">http://www.slacksite.com/other/ftp.html</uri>.</para>
+ <para>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 &dollar;
+ (Dollarzeichen). Symbolische Felder haben das
+ &dollar;-Präfix nicht. Der Wert, mit dem das symbolische
+ Feld belegt wird, muss in doppelten Anführungszeichen
+ ("") stehen.</para>
- <sect3>
- <title>IP<acronym>NAT</acronym> Rules</title>
+ <para>Die Datei mit den Regeln könnte wie folgt aufgebaut
+ sein:</para>
- <para>IP<acronym>NAT</acronym> has a special built in FTP proxy
- option which can be specified on the <acronym>NAT</acronym>
- 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.</para>
-
- <para>This rule will handle all the traffic for the internal
- LAN:</para>
-
- <programlisting>map dc0 10.0.10.0/29 -&gt; 0/32 proxy port 21 ftp/tcp</programlisting>
-
- <para>This rule handles the FTP traffic from the
- gateway:</para>
-
- <programlisting>map dc0 0.0.0.0/0 -&gt; 0/32 proxy port 21 ftp/tcp</programlisting>
-
- <para>This rule handles all non-FTP traffic from the internal
- LAN:</para>
-
- <programlisting>map dc0 10.0.10.0/29 -&gt; 0/32</programlisting>
-
- <para>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
- <acronym>NAT</acronym>ing 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
- <acronym>NAT</acronym>ed.</para>
- </sect3>
+ <programlisting>############### 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
+&dollar;cmd 00500 check-state
+&dollar;cmd 00502 deny all from any to any frag
+&dollar;cmd 00501 deny tcp from any to any established
+&dollar;cmd 00600 allow tcp from any to any 80 out via &dollar;oif setup &dollar;ks
+&dollar;cmd 00610 allow tcp from any to &dollar;odns 53 out via &dollar;oif setup &dollar;ks
+&dollar;cmd 00611 allow udp from any to &dollar;odns 53 out via &dollar;oif &dollar;ks
+################### End of example ipfw rules script ############</programlisting>
- <sect3>
- <title>IP<acronym>NAT</acronym> FTP Filter Rules</title>
+ <para>Die Regeln in diesem Beispiel sind nicht wichtig.
+ Wichtig ist es, zu zeigen, wie die symbolische Substitution
+ innerhalb der Regeln verwendet wird.</para>
- <para>Only one filter rule is needed for FTP if the
- <acronym>NAT</acronym> FTP proxy is used.</para>
+ <para>Wenn dieses Beispiel in
+ <filename>etc/ipfw.rules</filename> gespeichert wurde, so
+ könnten alle Regeln durch die Ausführung des folgenden
+ Kommandos neu geladen werden:</para>
- <para>Without the FTP Proxy, the following three rules will be
- needed:</para>
+ <screen>&prompt.root; <userinput>sh /etc/ipfw.rules</userinput></screen>
- <programlisting># 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
+ <para>Anstelle von <filename>/etc/ipfw.rules</filename> kann
+ ein beliebig anderer Name oder Speicherort verwendet
+ werden.</para>
-# Allow out passive mode data channel high order port numbers
-pass out quick on rl0 proto tcp from any to any port &gt; 1024 flags S keep state
+ <para>Alternativ können die einzelnen Befehle dieses Skripts
+ auch von Hand eingegeben werden:</para>
-# 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</programlisting>
+ <screen>&prompt.root; <userinput>ipfw -q -f flush</userinput>
+&prompt.root; <userinput>ipfw -q add check-state</userinput>
+&prompt.root; <userinput>ipfw -q add deny all from any to any frag</userinput>
+&prompt.root; <userinput>ipfw -q add deny tcp from any to any established</userinput>
+&prompt.root; <userinput>ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state</userinput>
+&prompt.root; <userinput>ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state</userinput>
+&prompt.root; <userinput>ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state</userinput></screen>
</sect3>
</sect2>
</sect1>
- <sect1 xml:id="firewalls-ipfw">
- <title>IPFW</title>
+ <sect1 xml:id="firewalls-ipf">
+ <title>IPFILTER (IPF)</title>
<indexterm>
<primary>Firewall</primary>
-
- <secondary>IPFW</secondary>
+ <secondary><application>IPFILTER</application></secondary>
</indexterm>
- <para><application>IPFW</application> ist eine
- <foreignphrase>Stateful-Firewall</foreignphrase>
- für &os;, die sowohl <acronym>IPv4</acronym> als auch
- <acronym>IPv6</acronym> unterstützt. Die Firewall setzt sich
- aus mehreren Komponenten zusammen: dem Kernel Firewall
- Filter-Prozessor mit integriertem Paket-Accounting,
- Protokollfunktionen, <acronym>NAT</acronym>, dem
- &man.dummynet.4; <foreignphrase>Traffic-Shaper</foreignphrase>,
- sowie Weiterleitungs-, Bridge- und ipstealth-Funktionen.</para>
-
- <para>&os; enthält mit <filename>/etc/rc.firewall</filename> ein
- Beispielregelwerk, welches mehrere Firewall-Typen für
- gebräuchliche Szenarien definiert und unerfahrene Anwender
- dabei unterstützen soll, ein geeignetes Regelwerk zu erstellen.
- <application>IPFW</application> besitzt eine leistungsstarke
- Syntax, mit der erfahrene Benutzer ihre eigenen Regeln
- anfertigen können, um den Sicherheitsanforderungen der
- jeweiligen Umgebung gerecht zu werden.</para>
-
- <para>Diser Abschnitt beschreibt, wie
- <application>IPFW</application> aktiviert wird und bietet einen
- Überblick über die Regelsyntax. Zudem werden mehrere Regelsätze
- für gebräuchliche Konfigurationsszenarien vorgestellt.</para>
+ <para><application>IPFILTER</application>, auch als
+ <application>IPF</application> bekannt, ist eine
+ plattformübergreifende Open Source Firewall, die auf
+ mehrere Betriebssysteme portiert wurde, einschließlich
+ &os;, NetBSD, OpenBSD und &solaris;.</para>
+
+ <para><application>IPFILTER</application> basiert auf einer
+ kernelseitigen Firewall und einem
+ <acronym>NAT</acronym>-Mechanismus, der durch Anwenderprogramme
+ gesteuert und überwacht werden kann. Firewallregeln werden mit
+ <application>ipf</application> gesetzt oder gelöscht. Für die
+ Manipulation der <acronym>NAT</acronym>-Regeln wird
+ <application>ipnat</application> benutzt. Mit
+ <application>ipfstat</application> werden Laufzeitstatistiken
+ der kernelseitigen Anteile von
+ <application>IPFILTER</application> aufgelistet. Mit
+ <application>ipmon</application> können die Aktionen von
+ <application>IPFILTER</application> in Protokolldateien
+ gespeichert werden.</para>
+
+ <para><application>IPF</application> wurde ursprünglich mit der
+ Verarbeitungslogik <quote>die letzte passende Regel
+ gewinnt</quote> geschrieben und verwendete ausschließlich
+ Regeln ohne feste Zustände. Inzwischen wurde
+ <application>IPF</application> modernisiert und unterstützt nun
+ auch die Optionen <literal>quick</literal> und
+ <literal>keep state</literal>.</para>
+
+ <para>Antworten auf häufige Fragen finden Sie unter <uri
+ xlink:href="http://www.phildev.net/ipf/index.html">
+ http://www.phildev.net/ipf/index.html</uri>. Ein Archiv
+ der <application>IPFILTER</application> Mailingliste steht unter
+ <uri xlink:href="http://marc.info/?l=ipfilter">
+ http://marc.info/?l=ipfilter</uri> zur Verfügung.</para>
+
+ <para>Dieser Abschnitt des Handbuchs konzentriert sich auf
+ <application>IPF</application> unter &os;. Es werden auch
+ Firewallregeln mit den Optionen <literal>quick</literal> und
+ <literal>keep state</literal> vorgestellt.</para>
- <sect2 xml:id="firewalls-ipfw-enable">
- <title><application>IPFW</application> aktivieren</title>
+ <sect2>
+ <title><application>IPF</application> aktivieren</title>
<indexterm>
- <primary><application>IPFW</application></primary>
+ <primary><application>IPFILTER</application></primary>
<secondary>aktivieren</secondary>
</indexterm>
- <para>Das &os; Basissystem enthält für
- <application>IPFW</application> ein ladbares Kernelmodul, was
- bedeutet, dass kein angepasster Kernel benötigt wird, um
- <application>IPFW</application> zu benutzen.</para>
+ <para><application>IPF</application> ist in &os; als ladbares
+ Kernelmodul enthalten. Das bedeutet, dass Sie keinen
+ angepassten Kernel erzeugen müssen um
+ <application>IPF</application> zu aktivieren.</para>
<indexterm>
<primary>Kerneloptionen</primary>
- <secondary>IPFIREWALL</secondary>
+ <secondary><application>IPFILTER</application></secondary>
</indexterm>
<indexterm>
<primary>Kerneloptionen</primary>
- <secondary>IPFIREWALL_VERBOSE</secondary>
+ <secondary>IPFILTER_LOG</secondary>
</indexterm>
<indexterm>
<primary>Kerneloptionen</primary>
- <secondary>IPFIREWALL_VERBOSE_LIMIT</secondary>
+ <secondary>IPFILTER_DEFAULT_BLOCK</secondary>
</indexterm>
<indexterm>
- <primary><application>IPFW</application></primary>
+ <primary><application>IPFILTER</application></primary>
<secondary>Kerneloptionen</secondary>
</indexterm>
- <para>Wenn Sie eine statische Unterstützung für
- <application>IPFW</application> in den Kernel kompilieren
- wollen, lesen Sie <xref linkend="kernelconfig"/>. Folgende
- Optionen können in der Kernelkonfigurationsdatei verwendet
- werden:</para>
+ <para>Benutzer, die <application>IPF</application> lieber
+ statisch in den Kernel kompilieren, sollten den Anweisungen in
+ <xref linkend="kernelconfig"/> folgen. Die folgenden
+ Kerneloptionen stehen zur Verfügung:</para>
- <programlisting>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</programlisting>
+ <programlisting>options IPFILTER
+options IPFILTER_LOG
+options IPFILTER_LOOKUP
+options IPFILTER_DEFAULT_BLOCK</programlisting>
- <para>Um <application>IPFW</application> beim Systemstart zu
- aktivieren, fügen Sie folgende Zeile in
- <filename>/etc/rc.conf</filename> ein:</para>
+ <para><literal>options IPFILTER</literal> aktiviert die
+ Unterstützung für <application>IPFILTER</application>.
+ <literal>options IPFILTER_LOG</literal> aktiviert die
+ Protokollierung über die Pseudo-Schnittstelle
+ <filename>ipl</filename> für Firewallrelgen, die das
+ Schlüsselwort <literal>log</literal> enthalten.
+ <literal>IPFILTER_LOOKUP</literal> aktiviert
+ <acronym>IP</acronym>-Pools, um die Suche nach
+ <acronym>IP</acronym>-Adressen zu beschleunigen.
+ <literal>IPFILTER_DEFAULT_BLOCK</literal> ändert das
+ Verhalten der Firewall dahingehend, dass jedes Paket, das
+ nicht explizit von einer <literal>pass</literal>-Regel
+ Zugang erhält, geblockt wird.</para>
+
+ <para>Um <application>IPF</application> während des Bootens zu
+ aktivieren, müssen folgende Einträge in
+ <filename>/etc/rc.conf</filename> hinzugefügt werden. Diese
+ Einträge aktivieren ebenfalls die Protokollierung und die
+ Regel <literal>default pass all</literal>. Um diese
+ Voreinstellung zu ändern, ohne einen neuen Kernel zu
+ übersetzen, müssen Sie am Ende der Firewallregeln eine
+ <literal>block all</literal> Regel hinzufügen.</para>
+
+ <programlisting>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 &amp; port to names</programlisting>
+
+ <para>Wenn die <acronym>NAT</acronym>-Funktionalität benötigt
+ wird, müssen auch diese Zeilen hinzugefügt werden:</para>
+
+ <programlisting>gateway_enable="YES" # Enable as LAN gateway
+ipnat_enable="YES" # Start ipnat function
+ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat</programlisting>
+
+ <para>Jetzt können Sie <application>IPF</application>
+ starten:</para>
+
+ <screen>&prompt.root; <userinput>service ipfilter start</userinput></screen>
+
+ <para>Um die Firewallregeln zu laden, übergeben Sie den Namen
+ des Regelwerks an <command>ipf</command>. Mit dem folgenden
+ Kommando ersetzen Sie alle aktuell geladenen Regeln:</para>
- <programlisting>firewall_enable="YES"</programlisting>
+ <screen>&prompt.root; <userinput>ipf -Fa -f /etc/ipf.rules</userinput></screen>
- <para>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:</para>
+ <para><literal>-Fa</literal> löscht zunächst alle internen
+ Regeln und mit <literal>-f</literal> wird die Datei angegeben,
+ welche die zu ladenen Regeln enthält.</para>
- <programlisting>firewall_type="open"</programlisting>
+ <para>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.</para>
- <para>Folgende Profile stehen zur Verfügung:</para>
+ <para>Diese und weitere Optionen sind in &man.ipf.8;
+ beschrieben.</para>
+ </sect2>
- <itemizedlist>
- <listitem>
- <para><literal>open</literal>: gestattet jeglichen
- Datenverkehr.</para>
- </listitem>
+ <sect2>
+ <title><application>IPF</application> Regel-Syntax</title>
- <listitem>
- <para><literal>client</literal>: schützt lediglich diesen
- Rechner.</para>
- </listitem>
+ <indexterm>
+ <primary><application>IPFILTER</application></primary>
+ <secondary>Regel-Syntax</secondary>
+ </indexterm>
- <listitem>
- <para><literal>simple</literal>: schützt das gesamte
- Netzwerk.</para>
- </listitem>
+ <para>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
+ <literal>quick</literal> der Reihe nach geprüft werden und
+ <quote>die letzte zutreffende Regel</quote> angewendet wird.
+ Das bedeutet, dass selbst dann, wenn die erste zutreffende
+ Regel eine <literal>pass</literal>-Regel ist, das Paket
+ dennoch geblockt wird, falls später eine
+ <literal>block</literal>-Regel zutrifft. Beispielregelsätze
+ finden Sie in
+ <filename>/usr/share/examples/ipfilter</filename>.</para>
+
+ <para>Beim Erstellen von Regeln wird das Zeichen
+ <literal>#</literal> verwendet, um einen Kommentar bis zum
+ Ende der Zeile einzuleiten. Leere Zeilen werden
+ ignoriert.</para>
- <listitem>
- <para><literal>closed</literal>: blockiert den gesamten
- <acronym>IP</acronym>-Datenverkehr, mit Ausnahme des
- Verkehrs über die Loopback-Schnittstelle.</para>
- </listitem>
+ <para>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:</para>
+
+ <para><replaceable>ACTION DIRECTION OPTIONS proto PROTO_TYPE
+ from SRC_ADDR SRC_PORT to DST_ADDR DST_PORT
+ TCP_FLAG|ICMP_TYPE keep state STATE</replaceable></para>
+
+ <para>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
+ <application>IPF</application>-Regeln.</para>
- <listitem>
- <para><literal>workstation</literal>: schützt lediglich
- diesen Rechner und verwendet zustandsorientierte
- Regeln.</para>
- </listitem>
+ <variablelist>
+ <varlistentry>
+ <term>ACTION</term>
- <listitem>
- <para><literal>UNKNOWN</literal>: deaktiviert das Laden von
- Firewallregeln.</para>
- </listitem>
+ <listitem>
+ <para>Dieses Schlüsselwort bestimmt, was mit dem Paket zu
+ tun ist, wenn es auf eine Regel zutrifft. Jede Regel
+ <emphasis>muss</emphasis> dieses Schlüsselwort
+ enthalten. Die folgenden Aktionen werden
+ erkannt:</para>
+
+ <para><literal>block</literal>: Das Paket wird
+ verworfen.</para>
+
+ <para><literal>pass</literal>: Das Paket wird
+ durchgelassen.</para>
+
+ <para><literal>log</literal>: Das Paket wird
+ protokolliert.</para>
+
+ <para><literal>count</literal>: Zählt die Anzahl der
+ Pakete und die Bytes. Die kann einen Hinweis darauf
+ geben, wie oft Pakete auf diese Regel zutreffen.</para>
+
+ <para><literal>auth</literal>: Das Paket geht in eine
+ Warteschlange zur Weiterverarbeitung durch ein anderes
+ Programm.</para>
+
+ <para><literal>call</literal>: Ermöglicht den Zugriff auf
+ eingebaute <application>IPF</application>-Funktionen,
+ die komplexere Aktionen ermöglichen.</para>
- <listitem>
- <para><filename><replaceable>filename</replaceable></filename>:
- absoluter Pfad zu einer Datei, in der die Firewallregeln
- definiert sind.</para>
- </listitem>
- </itemizedlist>
+ <para><literal>decapsulate</literal>: Entfernt alle
+ Header, um den Inhalt des Pakets zu verarbeiten.</para>
+ </listitem>
+ </varlistentry>
- <para>Wenn Sie <literal>firewall_type</literal> auf
- <literal>client</literal> oder <literal>simple</literal>
- setzen, müssen Sie die voreingestellten Regeln in
- <filename>/etc/rc.firewall</filename> anpassen, damit sie
- der Konfiguration des Systems entsprechen.</para>
+ <varlistentry>
+ <term>DIRECTION</term>
- <para>Beachten Sie, dass das Profil <literal>filename</literal>
- verwendet wird, um ein benutzerdefiniertes Regelwerk zu
- laden.</para>
+ <listitem>
+ <para>Als nächstes muss für jede Regel explizit die
+ Richtung mit einem der folgenden Schlüsselwörter
+ angegeben werden:</para>
+
+ <para><literal>in</literal>: Die Regel wird auf ein
+ eingehendes Paket angewendet.</para>
+
+ <para><literal>out</literal>: Die Regel wird auf ein
+ ausgehendes Paket angewendet.</para>
+
+ <para><literal>all</literal>: Die Regel gilt für beide
+ Richtungen.</para>
+
+ <para>Wenn das System mehrere Schnittstellen ausweist,
+ kann die Schnittstelle zusammen mit der Richtung
+ angegeben werden. Ein Beispiel wäre
+ <literal>in on fxp0</literal>.</para>
+ </listitem>
+ </varlistentry>
- <para>Eine alternative Möglichkeit, um ein benutzerdefiniertes
- Regelwerk zu laden, bietet die Variable
- <literal>firewall_script</literal>. Setzen Sie die Variable
- auf den absoluten Pfad eines
- <emphasis>ausführbaren Skripts</emphasis>, welches die Befehle
- für <application>IPFW</application> enthält. Die Beispiele in
- diesem Abschnitt gehen davon aus, dass
- <literal>firewall_script</literal> auf
- <filename>/etc/ipfw.rules</filename> gesetzt ist.</para>
+ <varlistentry>
+ <term>OPTIONS</term>
- <programlisting>firewall_script="/etc/ipfw.rules"</programlisting>
+ <listitem>
+ <para>Optionen müssen nicht zwingend angegeben werden.
+ Falls jedoch mehrere Optionen angegeben werden, müssen
+ sie in der hier gezeigten Reihenfolge verwendet
+ werden.</para>
+
+ <para><literal>log</literal>: Wenn die Firewall die
+ angegebene Aktion durchführt, werden die Kopfdaten des
+ Pakets auf der Pseudo-Schnittstelle &man.ipl.4;
+ protokolliert.</para>
+
+ <para><literal>quick</literal>: Wenn ein Paket mit dieser
+ Regel übereinstimmt, wird die Aktion für diese Regel
+ ausgeführt und die Regelprüfung stoppt an dieser
+ Stelle.</para>
+
+ <para><literal>on</literal>: 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.</para>
+
+ <para>Wenn das Schlüsselwort <literal>log</literal>
+ verwendet wird, können die folgenden Ausdrücke in
+ dieser Reihenfolge benutzt werden:</para>
+
+ <para><literal>body</literal>: die ersten 128 Bytes des
+ Paketinhaltes werden zusätzlich zu den Kopfdaten
+ protokolliert.</para>
+
+ <para><literal>first</literal>: trifft nur zu, wenn das
+ Schlüsselwort <literal>log</literal> zusammen mit
+ <literal>keep-state</literal> 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.</para>
+
+ <para>Es stehen noch weitere Optionen zur Rückmeldung
+ von Fehlern verfügbar. Ausführliche Details finden Sie
+ in &man.ipf.5;.</para>
+ </listitem>
+ </varlistentry>
- <para>Die Protokollierung wird mit diesem Eintrag
- aktiviert:</para>
+ <varlistentry>
+ <term>PROTO_TYPE</term>
- <programlisting>firewall_logging="YES"</programlisting>
+ <listitem>
+ <para>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
+ <literal>proto</literal>, gefolgt von der
+ Protokollnummer oder dem Namen aus
+ <filename>/etc/protocols</filename>. Zum Beispiel
+ <literal>tcp</literal>, <literal>udp</literal>, oder
+ <literal>icmp</literal>. Wenn PROTO_TYPE angegeben
+ wird und SCR_PORT oder DST_PORT ausgelassen werden,
+ stimmen alle Portnummern für dieses Protokoll mit dieser
+ Regel überein.</para>
+ </listitem>
+ </varlistentry>
- <para>Es existiert keine Variable für
- <filename>/etc/rc.conf</filename>, um die Protokollierung zu
- begrenzen. Um die Anzahl der Protokoll-Nachrichten pro
- Verbindungsversuch zu begrenzen, legen Sie die Anzahl der
- Einträge in <filename>/etc/sysctl.conf</filename> fest:</para>
+ <varlistentry>
+ <term><literal>SRC_ADDR</literal></term>
- <programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
+ <listitem>
+ <para>Das Schlüsselwort <literal>from</literal> ist
+ verpflichtend und darauf folgt das Schlüsselwort, das
+ die Quelle des Pakets darstellt. Die Quelle kann ein
+ Rechnername, eine <acronym>IP</acronym>-Adresse gefolgt
+ von der <acronym>CIDR</acronym>-Maske, ein Adresspool
+ oder das Schlüsselwort <literal>all</literal> sein.
+ &man.ipf.5; enthält einige Beispiele.</para>
+
+ <para><acronym>IP</acronym>-Bereiche können nur in der
+ <acronym>CIDR</acronym>-Notation angegeben werden. Der
+ Port oder das Paket <package>net-mgmt/ipcalc</package>
+ hilft bei der Berechnung der richtigen
+ <acronym>CIDR</acronym>-Maske. Weiterführende
+ Informationen finden Sie auf der Webseite <uri
+ xlink:href="http://jodies.de/ipcalc">
+ http://jodies.de/ipcalc</uri>.</para>
+ </listitem>
+ </varlistentry>
- <para>Nachdem Sie die Änderungen gespeichert haben, können Sie
- die Firewall starten. Um auch die Anzahl der
- Protokoll-Nachrichten zu konfigurieren, setzen Sie mit
- <command>sysctl</command> den gewünschten Wert:</para>
+ <varlistentry>
+ <term><literal>SCR_PORT</literal></term>
- <screen>&prompt.root; <userinput>service firewall start</userinput>
-&prompt.root; <userinput>sysctl net.inet.ip.fw.verbose_limit=<replaceable>5</replaceable></userinput></screen>
- </sect2>
-
- <sect2 xml:id="firewalls-ipfw-rules">
- <title><application>IPFW</application> Regel-Syntax</title>
-
- <para>Wenn ein Paket die Firewall <quote>betritt</quote>, 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 <quote>erster
- Treffer gewinnt</quote> bezeichnet. Falls keine Regel auf
- das betreffende Paket zutrifft, wird die obligatorische
- <application>IPFW</application>-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 <literal>count</literal>,
- <literal>skipto</literal> oder <literal>tee</literal>
- 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;.</para>
-
- <indexterm>
- <primary><application>IPFW</application></primary>
- <secondary>Regel-Syntax</secondary>
- </indexterm>
-
- <para>Bei der Erstellung der
- <application>IPFW</application>-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 <literal>#</literal> wird benutzt, um
- einen Kommentar einzuleiten und kann am Ende einer Regel oder
- in einer eigenen Zeile stehen. Leerzeilen werden
- ignoriert.</para>
-
- <para><replaceable>CMD RULE_NUMBER set SET_NUMBER ACTION log
- LOG_AMOUNT PROTO from SRC SRC_PORT to DST DST_PORT
- OPTIONS</replaceable></para>
-
- <para>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
- <application>IPFW</application>-Regeln zu erstellen, finden
- Sie in &man.ipfw.8;.</para>
-
- <variablelist>
- <varlistentry>
- <term>CMD</term>
<listitem>
- <para>Jede Regel muss mit <parameter>ipfw add</parameter>
- beginnen.</para>
+ <para>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 <literal>proto</literal>
+ folgen.</para>
+
+ <para>Es werden verschiedene Vergleichsoperatoren
+ unterstützt: <literal>=</literal> (gleich),
+ <literal>!=</literal> (nicht gleich),
+ <literal>&lt;</literal> (kleiner als),
+ <literal>&gt;</literal> (größer als),
+ <literal>&lt;=</literal> (kleiner als oder gleich)
+ <literal>&gt;=</literal> (größer als oder
+ gleich).</para>
+
+ <para>Um Portbereiche anzugeben, schreiben Sie zwei
+ Portnummern zwischen <literal>&lt;&gt;</literal>
+ (kleiner als und größer als),
+ <literal>&gt;&lt;</literal> (größer als und kleiner
+ als), oder <literal>:</literal> (größer als oder gleich
+ und kleiner als oder gleich).</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>RULE_NUMBER</term>
- <listitem>
- <para>Jede Regel gehört zu einer Nummer zwischen
- <literal>1</literal> und <literal>65534</literal>. 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.</para>
- </listitem>
- </varlistentry>
+ <term>DST_ADDR</term>
- <varlistentry>
- <term>SET_NUMBER</term>
<listitem>
- <para>Jede Regel ist einer <emphasis>Set</emphasis>-Nummer
- zwischen <literal>0</literal> und <literal>31</literal>
- 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
- <literal>SET_NUMBER</literal> nicht angegeben ist, wird
- die Regel zu Set <literal>0</literal>
- hinzugefügt.</para>
+ <para>Das Schlüsselwort <literal>to</literal> ist
+ verpflichtend und darauf folgt das Schlüsselwort,
+ welches das Ziel des Pakets darstellt. Dieses Ziel kann
+ ein Rechnername, eine <acronym>IP</acronym>-Adresse
+ gefolgt von der <acronym>CIDR</acronym>-Maske, ein
+ Adresspool oder das Schlüsselwort <literal>all</literal>
+ sein.</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>ACTION</term>
- <listitem>
- <para>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.</para>
-
- <para><parameter>allow | accept | pass |
- permit</parameter>: All diese Aktionen sind
- gleichbedeutend und erlauben Pakete, die mit der Regel
- übereinstimmen.</para>
-
- <para><parameter>check-state</parameter>: 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 <literal>check-state</literal> hat selbst kein
- Selektionskriterium. Sollte keine
- <literal>check-state</literal>-Regel im Regelwerk
- vorhanden sein, wird die dynamische Zustandstabelle beim
- ersten Vorkommen einer <literal>keep-state</literal>-
- oder <literal>limit</literal>-Regel überprüft.</para>
-
- <para><parameter>count</parameter>: Aktualisiert die
- Zähler für alle Pakete, die mit dieser Regel
- übereinstimmen. Die Prüfung wird mit der nächsten Regel
- fortgesetzt.</para>
-
- <para><parameter>deny | drop</parameter>: Diese Aktionen
- sind gleichbedeutend und verwerfen Pakete, die mit
- dieser Regel übereinstimmen.</para>
-
- <para>Es stehen noch weitere Aktionen zur Verfügung.
- Einzelheiten finden Sie in &man.ipfw.8;.</para>
- </listitem>
- </varlistentry>
+ <term>DST_PORT</term>
- <varlistentry>
- <term>LOG_AMOUNT</term>
<listitem>
- <para>Erfüllt ein Paket die Selektionskriterien mit dem
- Schlüsselwort <literal>log</literal>, wird dies von
- &man.syslogd.8; mit der Annotation
- <literal>SECURITY</literal> protokolliert. Dies erfolgt
- allerdings nur, wenn die Anzahl der protokollierten
- Pakete der betreffenden Regel die definierte
- <literal>LOG_AMOUNT</literal>-Grenze nicht übersteigt.
- Wenn <literal>LOG_AMOUNT</literal> nicht definiert ist,
- wird die Grenze aus dem Wert von
- <varname>net.inet.ip.fw.verbose_limit</varname>
- benutzt. Ein Wert von <literal>0</literal> 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 <command>ipfw resetlog</command>
- zurücksetzen.</para>
-
- <note>
- <para>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.</para>
- </note>
+ <para>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 <literal>proto</literal>
+ folgen.</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>PROTO</term>
- <listitem>
- <para>Dieser optionale Wert wird verwendet, um einen
- beliebigen Protokollnamen oder -nummer aus
- <filename>/etc/protocols</filename> gegen das Paket zu
- prüfen.</para>
- </listitem>
- </varlistentry>
+ <term>TCP_FLAG|ICMP_TYPE</term>
- <varlistentry>
- <term>SRC</term>
<listitem>
- <para>Nach dem Schlüsslwort<literal>from</literal> muss
- die Quelladresse stehen, oder ein Schlüsselwort, das die
- Quelladresse darstellt. Eine Adresse wird dargestellt
- duch <literal>any</literal>, <literal>me</literal> (jede
- Adresse dieses Systems), <literal>me6</literal> (jede
- <acronym>IPv6</acronym>-Adresse dieses Systems), oder
- <literal>table</literal> gefolgt von der Nummer der
- Tabelle, welche die Adressen enthält.
- <acronym>IP</acronym>-Adressen können in
- <acronym>CIDR</acronym>-Notation geschrieben werden.
- Beispielsweise <literal>1.2.3.4/25</literal> oder
- <literal>1.2.3.4:255.255.255.128</literal>.</para>
+ <para>Wenn <literal>tcp</literal> als PROTO_TYPE verwendet
+ wird, können bestimmte <acronym>TCP</acronym>-Flags
+ angegeben werden, die den Zustand einer Verbindung
+ bestimmen. Mögliche Flags sind:
+ <literal>S</literal> (SYN),
+ <literal>A</literal> (ACK),
+ <literal>P</literal> (PSH),
+ <literal>F</literal> (FIN),
+ <literal>U</literal> (URG),
+ <literal>R</literal> (RST),
+ <literal>C</literal> (CWN) und
+ <literal>E</literal> (ECN).</para>
+
+ <para>Wenn <literal>icmp</literal> als PROTO_TYPE
+ verwendet wird, kann der <acronym>ICMP</acronym>-Typ mit
+ angegeben werden. &man.ipf.5; enthält eine Auflistung
+ der zulässigen Typen.</para>
</listitem>
</varlistentry>
<varlistentry>
- <term>SRC_PORT</term>
- <listitem>
- <para>Optional kann ein Quellport über eine Nummer oder
- einen Namen aus <filename>/etc/services</filename>
- spezifiziert werden.</para>
- </listitem>
- </varlistentry>
+ <term>STATE</term>
- <varlistentry>
- <term>DST</term>
<listitem>
- <para>Nach dem Schlüsselwort <literal>to</literal> 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.</para>
+ <para>Wenn eine <literal>pass</literal>-Regel das
+ Schlüsselwort <literal>keep state</literal> enthält,
+ wird <application>IPF</application> einen Eintrag in
+ der dynamischen Zustandstabelle hinzufügen, damit
+ nachfolgende Pakete dieser Verbindung ebenfalls
+ durchgelassen werden. <application>IPF</application>
+ kann den Zustand für <acronym>TCP</acronym>,
+ <acronym>UDP</acronym> und
+ <acronym>ICMP</acronym>-Sitzungen verfolgen.
+ <application>IPF</application> wird jedes Paket, das
+ zu einer aktiven Sitzung gehört, durchlassen, auch
+ wenn ein anderes Protokoll verwendet wird.</para>
+
+ <para>Pakete, die über die Schnittstelle zum öffentlichen
+ Internet raus gehen, werden von
+ <application>IPF</application> 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.</para>
+
+ <para>Mehrere Schlüsselwörter können an
+ <literal>keep state</literal> 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.</para>
</listitem>
</varlistentry>
+ </variablelist>
+ </sect2>
- <varlistentry>
- <term>DST_PORT</term>
- <listitem>
- <para>Optional kann ein Zielport über eine Nummer oder
- einen Namen aus <filename>/etc/services</filename>
- spezifiziert werden.</para>
- </listitem>
- </varlistentry>
+ <sect2>
+ <title>Beispielregelsatz</title>
- <varlistentry>
- <term>OPTIONS</term>
- <listitem>
- <para>Nach der Quell- und Zieladresse können noch weitere
- Optionen angegeben werden. Wie der Name bereits sagt,
- sind <literal>OPTIONS</literal> optional. Häufig
- verwendete Optionen sind <literal>in</literal> oder
- <literal>out</literal>, mit denen die Richtug des
- Pakets bestimmt wird, <literal>icmptypes</literal>
- gefolgt vom Typ der <acronym>ICMP</acronym>-Nachricht,
- sowie <literal>keep-state</literal>.</para>
+ <para>Dieser Abschnitt beschreibt die Erstellung eines
+ Regelsatzes, welcher nur entsprechende Dienste erlaubt und
+ alle anderen Verbindungen blockiert.</para>
+
+ <para>&os; verwendet die Loopback-Schnittstelle
+ (<filename>lo0</filename>) und die
+ <acronym>IP</acronym>-Adresse <systemitem
+ class="ipaddress">127.0.0.1</systemitem> zur internen
+ Kommunikation. Der Regelsatz muss Regeln enthalten, die
+ Pakete für diesen internen Verkehr ermöglichen:</para>
- <para>Wenn ein Paket auf eine
- <parameter>keep-state</parameter>-Regel zutrifft, wird
- die Firewall eine dynamische Regel erstellen, die dem
- bidirektionalen Datenverkehr zwischen den gleichen
- Quell- und Zieladressen mit dem gleichen Protokoll
- entspricht.</para>
+ <programlisting># no restrictions on the loopback interface
+pass in quick on lo0 all
+pass out quick on lo0 all</programlisting>
- <para>Dynamische Regeln sind für einen sogenannten
- <foreignphrase>SYN-flood</foreignphrase>-Angriff
- anfällig, bei dem eine riesige Anzahl an dynamischen
- Regeln erzeugt wird. Verwenden Sie die Option
- <literal>limit</literal>, 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 <literal>limit</literal>
- definierten Wert, wird das Paket verworfen.</para>
+ <para>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
+ <acronym>LAN</acronym> 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.</para>
- <para>Es stehen noch viele weitere Optionen zur Verfügung.
- &man.ipfw.8; enthält eine Beschreibung der einzelnen
- Optionen.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
+ <para>Diese beiden Regeln erlauben den gesamten Datenverkehr
+ über eine vertrauenswürdige
+ <acronym>LAN</acronym>-Schnittstelle namens
+ <filename>xl0</filename>:</para>
+
+ <programlisting># no restrictions on inside LAN interface for private network
+pass out quick on xl0 all
+pass in quick on xl0 all</programlisting>
+
+ <para>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.</para>
+
+ <para>Der folgende Regelsatz definiert die ausgehenden Regeln
+ der öffentlichen Schnittstelle <filename>dc0</filename>.
+ Die Regeln prüfen den Zustand und identifizieren bestimmte
+ Dienste, auf die die internen Systeme zugreifen dürfen. Alle
+ Regeln verwenden das Schlüsselwort <literal>quick</literal>
+ und geben die passenden Portnummern und ggf. auch die
+ Zieladressen an.</para>
+
+ <programlisting># 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
- <sect2>
- <title>Beispiel für einen Regelsatz</title>
+# 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
- <para>Dieser Abschnitt die Erstellung eines Firewall-Skripts
- namens <filename>/etc/ipfw.rules</filename> mit
- zustandsorientierten (<foreignphrase>stateful</foreignphrase>
- Regeln. Alle Regeln in diesem Beispiel verwenden die Optionen
- <literal>in</literal> und <literal>out</literal>, um die
- Richtung des Pakets zu verdeutlichen. Zusätzlich wird
- <literal>via</literal>
- <replaceable>interface-name</replaceable> benutzt, um die
- Schnittstelle für das Paket zu prüfen.</para>
+# 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
- <note>
- <para>Bei den anfänglichen Tests mit dem Firewall-Regelsatz
- sollten Sie vielleicht folgende Einstellung
- vornehmen:</para>
+# 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
- <programlisting>net.inet.ip.fw.default_to_accept="1"</programlisting>
+# Allow NTP
+pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
- <para>Dies legt die Standardregel von &man.ipfw.8; etwas
- großzügiger fest, als das voreingestellte
- <literal>default deny ip from any to any</literal>. Dadurch
- sinkt die Gefahr, sich nach einem Neustart des Systems
- auszusperren.</para>
- </note>
-
- <para>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 <literal>cmd</literal> erstellt, sodass
- <literal>ipfw add</literal> nicht jedes mal von Hand
- eingegeben werden muss. Die Variable <literal>pif</literal>
- repräsentiert die mit dem Internet verbundene
- Schnittstelle.</para>
-
- <programlisting>#!/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</programlisting>
-
- <para>Jetzt folgen die eigentlichen Filterregeln. Diese ersten
- beiden Regeln erlauben den Datenverkehr aus dem internen
- Netzwerk und über die Loopback-Schnittstelle:</para>
-
- <programlisting># Change xl0 to LAN NIC interface name
-&dollar;cmd 00005 allow all from any to any via xl0
-
-# No restrictions on Loopback Interface
-&dollar;cmd 00010 allow all from any to any via lo0</programlisting>
-
- <para>Die nächste Regel erlaubt Pakete, für die ein Eintrag
- in der dynamischen Zustandstabelle existiert:</para>
-
- <programlisting>&dollar;cmd 00101 check-state</programlisting>
-
- <para>Die nächsten Regeln definieren, welche internen Rechner
- Verbindungen zu anderen Rechnern im Internet aufbauen dürfen.
- Hier werden wieder zustandsorientierte Regeln
- verwendet:</para>
-
- <programlisting># 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
-&dollar;cmd 00110 allow tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
-&dollar;cmd 00111 allow udp from any to x.x.x.x 53 out via &dollar;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
-&dollar;cmd 00120 allow log udp from any to any 67 out via &dollar;pif keep-state
-#&dollar;cmd 00120 allow udp from any to x.x.x.x 67 out via &dollar;pif keep-state
-
-# Allow outbound HTTP and HTTPS connections
-&dollar;cmd 00200 allow tcp from any to any 80 out via &dollar;pif setup keep-state
-&dollar;cmd 00220 allow tcp from any to any 443 out via &dollar;pif setup keep-state
-
-# Allow outbound email connections
-&dollar;cmd 00230 allow tcp from any to any 25 out via &dollar;pif setup keep-state
-&dollar;cmd 00231 allow tcp from any to any 110 out via &dollar;pif setup keep-state
-
-# Allow outbound ping
-&dollar;cmd 00250 allow icmp from any to any out via &dollar;pif keep-state
-
-# Allow outbound NTP
-&dollar;cmd 00260 allow tcp from any to any 37 out via &dollar;pif setup keep-state
-
-# Allow outbound SSH
-&dollar;cmd 00280 allow tcp from any to any 22 out via &dollar;pif setup keep-state
-
-# deny and log all other outbound connections
-&dollar;cmd 00299 deny log all from any to any out via &dollar;pif</programlisting>
-
- <para>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 <literal>limit</literal>, um
- <foreignphrase>Flooding</foreignphrase> zu unterbinden.</para>
-
- <programlisting># Deny all inbound traffic from non-routable reserved address spaces
-&dollar;cmd 00300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
-&dollar;cmd 00301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
-&dollar;cmd 00302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
-&dollar;cmd 00303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
-&dollar;cmd 00304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
-&dollar;cmd 00305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
-&dollar;cmd 00306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
-&dollar;cmd 00307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster interconnect
-&dollar;cmd 00308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
-
-# Deny public pings$
-&dollar;cmd 00310 deny icmp from any to any in via &dollar;pif$
-$
-# Deny ident$
-&dollar;cmd 00315 deny tcp from any to any 113 in via &dollar;pif$
-$
-# Deny all Netbios services.$
-&dollar;cmd 00320 deny tcp from any to any 137 in via &dollar;pif$
-&dollar;cmd 00321 deny tcp from any to any 138 in via &dollar;pif$
-&dollar;cmd 00322 deny tcp from any to any 139 in via &dollar;pif$
-&dollar;cmd 00323 deny tcp from any to any 81 in via &dollar;pif$
-
-# Deny fragments
-&dollar;cmd 00330 deny all from any to any frag in via &dollar;pif
-
-# Deny ACK packets that did not match the dynamic rule table
-&dollar;cmd 00332 deny tcp from any to any established in via &dollar;pif
-
-# Allow traffic from ISP's DHCP server.
-# Replace x.x.x.x with the same IP address used in rule 00120.
-#&dollar;cmd 00360 allow udp from any to x.x.x.x 67 in via &dollar;pif keep-state
-
-# Allow HTTP connections to internal web server
-&dollar;cmd 00400 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
-
-# Allow inbound SSH connections
-&dollar;cmd 00410 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
-
-# Reject and log all other incoming connections
-&dollar;cmd 00499 deny log all from any to any in via &dollar;pif</programlisting>
-
- <para>Die letzte Regel protokolliert alle Pakete, die mit
- keiner Regel im Regelsatz übereinstimmen:</para>
-
- <programlisting># Everything else is denied and logged
-&dollar;cmd 00999 deny log all from any to any</programlisting>
- </sect2>
-
- <sect2 xml:id="network-natd">
- <info>
- <title><acronym>NAT</acronym> Konfiguration</title>
-
- <authorgroup>
- <author>
- <personname>
- <firstname>Chern</firstname>
- <surname>Lee</surname>
- </personname>
- <contrib>Beigetragen von </contrib>
- </author>
- </authorgroup>
- </info>
-
- <indexterm>
- <primary>NAT</primary>
- <secondary>und <application>IPFW</application></secondary>
- </indexterm>
-
- <para>&os;s integrierter <acronym>NAT</acronym>-Daemon,
- &man.natd.8;, arbeitet in Verbindung mit
- <application>IPFW</application>, um
- <foreignphrase>Network Address Translation</foreignphrase>
- bereitzustellen. <acronym>NAT</acronym> wird verwendet, um
- mehreren internen Rechnern, über eine einzige
- <acronym>IP</acronym>-Adresse, eine gemeinsame Verbindung zum
- Internet zu ermöglichen.</para>
-
- <para>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 <link
- xlink:href="ftp://ftp.isi.edu./in-notes/rfc1918.txt">RFC
- 1918</link> konforme Adresse zugewiesen bekommen. Zudem
- muss das Standard-Gateway der Rechner auf die interne
- <acronym>IP</acronym>-Adresse des &man.natd.8;-Systems
- gesetzt werden.</para>
-
- <para>Es ist noch ein wenig Konfiguration nötig, um die
- <acronym>NAT</acronym>-Funktion von
- <application>IPFW</application> zu aktivieren. Wenn das
- System einen angepassten Kernel hat, muss die
- Kernelkonfigurationsdatei die Zeile
- <literal>option IPDIVERT</literal> sowie weitere
- <literal>IPFIREWALL</literal>-Optionen, die in <xref
- linkend="firewalls-ipfw-enable"/> beschrieben sind,
- enthalten.</para>
-
- <para>Um die <acronym>NAT</acronym>-Unterstützung beim Booten
- zu aktivieren, müssen folgende Einträge in
- <filename>/etc/rc.conf</filename> vorhanden sein:</para>
-
- <programlisting>gateway_enable="YES" # enables the gateway
-natd_enable="YES" # enables <acronym>NAT</acronym>
-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;</programlisting>
-
- <note>
- <para>Es ist auch möglich eine Konfigurationsdatei zu
- verwenden, welche die Optionen enthält, die an
- &man.natd.8; übergeben werden:</para>
-
- <programlisting>natd_flags="-f /etc/natd.conf"</programlisting>
-
- <para>Die angegebene Datei muss die Konfigurationsoptionen
- enthalten, eine Option pro Zeile. Zum Beispiel:</para>
-
- <programlisting>redirect_port tcp 192.168.0.2:6667 6667
-redirect_port tcp 192.168.0.3:80 80</programlisting>
-
- <para>Weitere Informationen zu dieser Konfigurationsdatei
- finden Sie in &man.natd.8;.</para>
- </note>
-
- <para>Als nächstes werden die <acronym>NAT</acronym>-Regeln
- hinzugefügt. Wenn die Regeln zustandsorientiert sind, ist die
- Platzierung der <acronym>NAT</acronym>-Regeln sehr wichtig und
- die <literal>skipto</literal>-Aktion wird verwendet. Dies
- erfordert, dass jede Regel über eine eindeutige Nummer
- verfügt, um eindeutige Sprungziele zu erhalten.</para>
-
- <para>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
- <acronym>NAT</acronym> zu konfigurieren. Zunächst werden
- einige Variablen hinzugefügt, darunter Regelnummern, die
- <literal>keep-state</literal>-Option und eine Liste mit
- <acronym>TCP</acronym>-Ports um die Anzahl der Regeln zu
- reduzieren:</para>
-
- <programlisting>#!/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"</programlisting>
-
- <para>Die <acronym>NAT</acronym>-Regel für eingehende Pakete
- wird <emphasis>nach</emphasis> den beiden Regeln, die das
- interne Netzwerk und die Loopback-Schnittstelle erlauben und
- <emphasis>vor</emphasis> der
- <literal>check-state</literal>-Regel eingefügt. Es ist
- wichtig, dass die Nummer der <acronym>NAT</acronym>-Regel
- (in diesem Beispiel <literal>100</literal>) höher ist, als
- die beiden vorherigen Regeln und niedriger, als die
- <literal>check-state</literal>-Regel:</para>
-
- <programlisting>&dollar;cmd 005 allow all from any to any via xl0 # exclude LAN traffic
-&dollar;cmd 010 allow all from any to any via lo0 # exclude loopback traffic
-&dollar;cmd 100 divert natd ip from any to any in via &dollar;pif # NAT any inbound packets
-# Allow the packet through if it has an existing entry in the dynamic rules table
-&dollar;cmd 101 check-state</programlisting>
-
- <para>Die Regeln für den ausgehenden Verkehr werden ebenfalls
- modifiziert, um Aktionen mit der
- <literal>&dollar;skipto</literal>-Variable zu erlauben und
- anzuzeigen, dass die Prüfung mit der Regel
- <literal>500</literal> fortgesetzt wird. Die sieben Regeln
- für <acronym>TCP</acronym> wurden durch die Regel
- <literal>125</literal> ersetzt, da die sieben erlaubten
- ausgehenden Ports in der Variable
- <literal>&dollar;good_tcp0</literal> enthalten sind.</para>
-
- <programlisting># Authorized outbound packets
-&dollar;cmd 120 &dollar;skip udp from any to x.x.x.x 53 out via &dollar;pif &dollar;ks
-&dollar;cmd 121 &dollar;skip udp from any to x.x.x.x 67 out via &dollar;pif &dollar;ks
-&dollar;cmd 125 &dollar;skip tcp from any to any &dollar;good_tcpo out via &dollar;pif setup &dollar;ks
-&dollar;cmd 130 &dollar;skip icmp from any to any out via &dollar;pif &dollar;ks</programlisting>
-
- <para>Die eingehenden Regeln bleiben unverändert, mit Ausnahme
- der letzten Regel, in der das
- <literal>via &dollar;pif</literal> entfert wird, um ein- und
- ausgehende Pakete prüfen zu können. Nach der letzten Regel
- für ausgehende Pakete muss die <acronym>NAT</acronym>-Regel
- folgen. Die Regel muss eine höhere Nummer als die letzte
- Regel haben und die Nummer muss über die
- <literal>skipto</literal>-Aktion referenziert werden. In
- diesem Regelsatz leitet die Regel mit der Nummer
- <literal>500</literal> alle ausgehenden Pakete zur
- Weiterverarbeitung an &man.natd.8; weiter. Die darauf
- folgende Regel lässt alle von <acronym>NAT</acronym>
- verarbeiteten Pakete passieren.</para>
-
- <programlisting>&dollar;cmd 499 deny log all from any to any
-&dollar;cmd 500 divert natd ip from any to any out via &dollar;pif # skipto location for outbound stateful rules
-&dollar;cmd 510 allow ip from any to any</programlisting>
-
- <para>In diesem Beispiel steuern die Regeln
- <literal>100</literal>, <literal>101</literal>,
- <literal>125</literal>, <literal>500</literal> und
- <literal>510</literal> die Adressübersetzung der ein- und
- ausgehende Pakete, so dass immer die private
- <acronym>LAN</acronym> <acronym>IP</acronym>-Adresse in der
- dynamische Zustandstabelle registriert werden.</para>
-
- <para>Nehmen wir beispielsweise einen Web-Browser, der neue
- <acronym>HTTP</acronym>-Sitzungen über Port 80 aufbaut. Wenn
- nun das erste ausgehende Paket von der Firewall geprüft wird,
- trifft es nicht auf Regel <literal>100</literal> zu, da das
- Paket nach außen geleitet wird und nicht nach innen. Das
- Paket trifft auch nicht auf Regel <literal>101</literal> zu,
- da es das erste ist und somit noch nicht in der dynamischen
- Zustandstabelle enthalten ist. Das Paket entspricht
- schließlich Regel <literal>125</literal>, da es ausgehend auf
- einem erlaubten Port gesendet wird und von einer
- <acronym>IP</acronym>-Adresse aus dem internen
- <acronym>LAN</acronym> stammt. Für Pakete, die auf diese
- Regel zutreffen, werden zwei Aktionen ausgeführt. Zuerst
- wird durch die Aktion <literal>keep-state</literal> ein
- dynamischer Eintrag in der Statustabelle erstellt und die
- angegebene Aktion <literal>skipto 500</literal> ausgeführt.
- Als nächstes durchläuft das Paket <acronym>NAT</acronym> 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
- <literal>100</literal> auf das Paket zu und die Zieladresse
- wird auf die zugehörige (lokale)
- <acronym>LAN</acronym>-Adresse abgebildet. Danach wird das
- Paket von der Regel <literal>check-state</literal>
- verarbeitet. Die Zustandstabelle erkennt, dass eine
- zugehörige aktive Sitzung vorliegt und das Paket wird
- freigegeben und in das <acronym>LAN</acronym> geleitet.</para>
-
- <para>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
- <acronym>LAN</acronym> freigegeben. Das Antwortpaket wird
- von der Regel <literal>check-state</literal> als Paket einer
- aktiven Sitzung erkannt. Das Paket wird dann von Regel
- <literal>500</literal> per <acronym>NAT</acronym>
- verarbeitet, bevor es über die externe Schnittstelle versendet
- wird.</para>
-
- <sect3>
- <title>Weiterleitung von Ports</title>
-
- <para>Der Nachteil von &man.natd.8; ist, dass die Rechner im
- <acronym>LAN</acronym> 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 <acronym>LAN</acronym> 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
- <acronym>LAN</acronym> weiterleiten.</para>
-
- <para>Angenommen es gibt einen <acronym>IRC</acronym>-Server
- auf Rechner <systemitem>A</systemitem> und einen Webserver
- auf Rechner <systemitem>B</systemitem>. Damit dies
- funktioniert, müssen die Verbindungen auf den Ports 6667
- (<acronym>IRC</acronym>) und 80 (<acronym>HTTP</acronym>)
- an die jeweiligen Rechner weitergeleitet werden.</para>
-
- <para>Die Syntax für <option>-redirect_port</option>
- lautet:</para>
-
- <programlisting>-redirect_port proto targetIP:targetPORT[-targetPORT]
- [aliasIP:]aliasPORT[-aliasPORT]
- [remoteIP[:remotePORT[-remotePORT]]]</programlisting>
-
- <para>Für das obige Beispiel sollten die Argumente wie folgt
- aussehen:</para>
-
- <programlisting>-redirect_port tcp 192.168.0.2:6667 6667
- -redirect_port tcp 192.168.0.3:80 80</programlisting>
-
- <para>Damit werden die entsprechenden
- <acronym>TCP</acronym>-Ports an die Rechner im
- <acronym>LAN</acronym> weitergeleitet.</para>
+# Allow FTP
+pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state
- <para>Portbereiche können über <option>-redirect_port</option>
- festgelegt werden. Zum Beispiel würde
- <replaceable>tcp 192.168.0.2:2000-3000
- 2000-3000</replaceable> alle Verbindungen auf die Ports
- 2000 bis 3000 an die Ports 2000 bis 3000 an
- Rechner <systemitem>A</systemitem> weiterleiten.</para>
+# Allow SSH
+pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state
- <para>Diese Optionen können über
- <literal>natd_flags=""</literal> in
- <filename>/etc/rc.conf</filename> direkt beim Start an
- &man.natd.8; übergeben werden. Alternativ können die
- Optionen in eine Konfigurationsdatei eingetragen
- werden.</para>
+# Allow ping
+pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
- <para>Weitere Konfigurationsmöglichkeiten sind in
- &man.natd.8; beschrieben.</para>
- </sect3>
+# Block and log everything else
+block out log first quick on dc0 all</programlisting>
- <sect3>
- <title>Weiterleiten von Adressen</title>
+ <para>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.</para>
- <para>Das Weiterleiten von Adressen ist nützlich, wenn
- mehr als eine <acronym>IP</acronym>-Adresse zur Verfügung
- steht. Jeder Rechner im <acronym>LAN</acronym> kann über
- &man.natd.8; seine eigene externe
- <acronym>IP</acronym>-Adresse zugewiesen bekommen.
- &man.natd.8; wird dann den ausgehenden Datenverkehr der
- Rechner aus dem <acronym>LAN</acronym> mit der
- entsprechenden externen <acronym>IP</acronym>-Adresse
- umschreiben. Auch der eingehenden Datenverkehr über die
- externe <acronym>IP</acronym>-Adresse wird an die
- entsprechenden Rechner im <acronym>LAN</acronym>
- weitergeleitet. Diese Methode ist auch als
- statisches <acronym>NAT</acronym> bekannt. Wenn Ihnen
- beispielsweise die <acronym>IP</acronym>-Adressen
- <systemitem class="ipaddress">128.1.1.1</systemitem>,
- <systemitem class="ipaddress">128.1.1.2</systemitem> und
- <systemitem class="ipaddress">128.1.1.3</systemitem> zur
- Verfügung stehen, kann <systemitem
- class="ipaddress">128.1.1.1</systemitem> als externe
- Adresse der &man.natd.8;-Maschine verwendet werden, während
- <systemitem class="ipaddress">128.1.1.2</systemitem> und
- <systemitem class="ipaddress">128.1.1.3</systemitem> an
- Rechner <systemitem>A</systemitem> und
- Rechner <systemitem>B</systemitem> im <acronym>LAN</acronym>
- weitergeleitet werden.</para>
+ <programlisting># 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 &amp; E multicast
- <para>Die Syntax für <option>-redirect_address</option>
- lautet:</para>
+# 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
- <programlisting>-redirect_address localIP publicIP</programlisting>
+# block source routed packets
+block in quick on dc0 all with opt lsrr
+block in quick on dc0 all with opt ssrr
- <informaltable frame="none" pgwide="1">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>localIP</entry>
- <entry>Die interne <acronym>IP</acronym>-Adresse des
- Rechners im <acronym>LAN</acronym>.</entry>
- </row>
+# Block OS fingerprint attempts and log first occurrence
+block in log first quick on dc0 proto tcp from any to any flags FUP
- <row>
- <entry>publicIP</entry>
- <entry>Die externe <acronym>IP</acronym>-Adresse für
- den entsprechenden Rechner im
- <acronym>LAN</acronym>.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
+# Block anything with special options
+block in quick on dc0 all with ipopts
- <para>Für das obige Beispiel sollten die Argumente wie
- folgt aussehen:</para>
+# 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
- <programlisting>-redirect_address 192.168.0.2 128.1.1.2
--redirect_address 192.168.0.3 128.1.1.3</programlisting>
+# 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</programlisting>
- <para>Genau wie bei <option>-redirect_port</option>, werden
- diese Argumente innerhalb der
- <filename>/etc/rc.conf</filename>-Option
- <literal>natd_flags=""</literal> angegeben, oder alternativ
- über eine Konfigurationsdatei. Allerdings müssen beim
- Weiterleiten von Adressen keine Ports umgeleitet werden, da
- der gesamte eingehende Datenverkehr einer bestimmte
- <acronym>IP</acronym>-Adresse weitergeleitet wird.</para>
+ <para>Wenn eine Regel mit der Option
+ <literal>log first</literal> protokolliert wird, können Sie
+ mit <command>ipfstat -hio</command> 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.</para>
+
+ <para>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.</para>
- <para>Die externe <acronym>IP</acronym>-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.</para>
- </sect3>
+ <programlisting># 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</programlisting>
</sect2>
- <sect2 xml:id="firewalls-ipfw-cmd">
- <title>Das <application>IPFW</application> Kommando</title>
+ <sect2>
+ <title><acronym>NAT</acronym> Konfiguration</title>
- <indexterm>
- <primary><command>ipfw</command></primary>
- </indexterm>
+ <para>Um <acronym>NAT</acronym> zu aktivieren, fügen Sie
+ folgende Zeilen in <filename>/etc/rc.conf</filename> hinzu.
+ Geben Sie den Namen der Datei an, welche die
+ <acronym>NAT</acronym>-Regeln enthält:</para>
- <para><command>ipfw</command> 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.</para>
+ <programlisting>gateway_enable="YES"
+ipnat_enable="YES"
+ipnat_rules="/etc/ipnat.rules"</programlisting>
- <para><command>ipfw</command> ist auch hilfreich, um die
- geladenen Regeln der auf der Konsole auszugeben.
- <application>IPFW</application> 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.</para>
+ <para><acronym>NAT</acronym>-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;.</para>
- <para>Eine Auflistung aller geladenen Regeln erhalten Sie
- mit:</para>
+ <para>Die grundlegende Syntax für eine
+ <acronym>NAT</acronym>-Regel ist wie folgt.
+ <literal>map</literal> leitet die Regel ein und
+ <literal>IF</literal> sollte durch den Namen der externen
+ Schnittstelle ersetzt werden:</para>
- <screen>&prompt.root; <userinput>ipfw list</userinput></screen>
+ <programlisting>map <replaceable>IF</replaceable> <replaceable>LAN_IP_RANGE</replaceable> -&gt; <replaceable>PUBLIC_ADDRESS</replaceable></programlisting>
- <para>Eine Auflistung aller Regeln inklusive des letzten
- Treffers erhalten Sie mit:</para>
+ <para><replaceable>LAN_IP_RANGE</replaceable> ist ein Bereich
+ von <acronym>IP</acronym>-Adressen, der von den internen
+ Rechnern verwendet wird. In der Regel ist dies ein privater
+ Bereich, beispielsweise <systemitem
+ class="ipaddress">192.168.1.0/24</systemitem>.
+ <replaceable>PUBLIC_ADDRESS</replaceable> kann entweder eine
+ statische externe <acronym>IP</acronym>-Adresse sein, oder das
+ Schlüsselwort <literal>0/32</literal>, welches der
+ zugewiesenen <acronym>IP</acronym>-Adresse für
+ <replaceable>IF</replaceable> entspricht.</para>
+
+ <para>Wenn ein Paket aus dem <acronym>LAN</acronym> mit einem
+ öffentlichen Ziel an der <application>IPF</application>
+ Firewall ankommt, werden zunächst die Regeln für den
+ ausgehenden Verkehr geprüft. Danach wird das Paket an das
+ <acronym>NAT</acronym>-Regelwerk geleitet, wo es von oben nach
+ unten gelesen und geprüft wird, wobei die erste
+ übereinstimmende Regel gewinnt.
+ <application>IPF</application> testet jede
+ <acronym>NAT</acronym>-Regel gegen die Schnittstelle und die
+ Quell-<acronym>IP</acronym>-Adresse des Pakets. Wenn der
+ Schnittstellenname des Pakets mit einer
+ <acronym>NAT</acronym>-Regel übereinstimmt, wird geprüft, ob
+ die Quell-<acronym>IP</acronym>-Adresse des Pakets auf den
+ Bereich in <replaceable>LAN_IP_RANGE</replaceable> passt.
+ Wenn dies der Fall ist, wird die
+ Quell-<acronym>IP</acronym>-Adresse des Pakets mit der Adresse
+ aus <replaceable>PUBLIC_ADDRESS</replaceable>
+ überschrieben. <application>IPF</application> speichert die
+ Einträge in seiner internen <acronym>NAT</acronym>-Tabelle, so
+ dass wenn das Paket aus dem Internet zurückkehrt, es der
+ ursprünglichen privaten <acronym>IP</acronym>-Adresse
+ zugeordnet werden kann, bevor es von den weiteren
+ Firewallregeln geprüft wird.</para>
+
+ <para>Bei Netzwerken mit einer großen Anzahl von Systemen oder
+ mehreren Subnetzen, steigert sich der Ressourcenverbrauch
+ für das Umschreiben der <acronym>IP</acronym>-Adressen. Es
+ existieren zwei Methoden, um dieses Problem zu umgehen.</para>
+
+ <para>Bei der ersten Methode wird ein Portbereich definiert, der
+ für die Quell-Ports verwendet wird. Durch das Hinzufügen des
+ Schlüsselworts <literal>portmap</literal> kann
+ <acronym>NAT</acronym> angewiesen werden, nur Quell-Ports aus
+ dem angegebenen Bereich zu benutzen:</para>
+
+ <programlisting>map dc0 192.168.1.0/24 -&gt; 0/32 portmap tcp/udp 20000:60000</programlisting>
+
+ <para>Alternativ kann das Schlüsselwort <literal>auto</literal>
+ verwendet werden. Dadurch ermittelt <acronym>NAT</acronym>
+ selbstständig die zur Verfügung stehenden Ports:</para>
+
+ <programlisting>map dc0 192.168.1.0/24 -&gt; 0/32 portmap tcp/udp auto</programlisting>
+
+ <para>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
+ <acronym>IP</acronym>-Adressen verfügbar ist. Aus diesem Pool
+ kann <acronym>NAT</acronym> dann
+ <acronym>IP</acronym>-Adressen für die ausgehenden Pakete
+ auswählen.</para>
+
+ <para>Der Bereich der öffentlichen
+ <acronym>IP</acronym>-Adressen kann mit einer Netzmaske oder
+ der <acronym>CIDR</acronym>-Notation festgelegt werden. Die
+ folgenden Regeln sind identisch:</para>
+
+ <programlisting>map dc0 192.168.1.0/24 -&gt; 204.134.75.0/255.255.255.0
+map dc0 192.168.1.0/24 -&gt; 204.134.75.0/24</programlisting>
+
+ <para>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
+ <acronym>NAT</acronym> 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 <acronym>IP</acronym>-Adresse <systemitem
+ class="ipaddress">20.20.20.5</systemitem> dem internen
+ Server mit der Adresse <systemitem
+ class="ipaddress">10.0.10.25</systemitem> zuzuordnen:</para>
+
+ <programlisting>rdr dc0 20.20.20.5/32 port 80 -&gt; 10.0.10.25 port 80</programlisting>
+
+ <para>Wenn dies der einzige Webserver im Netz ist, würde auch
+ folgende Regel funktionieren, die alle
+ <acronym>HTTP</acronym>-Anfragen an <systemitem
+ class="ipaddress">10.0.10.25</systemitem> umleitet:</para>
+
+ <programlisting>rdr dc0 0.0.0.0/0 port 80 -&gt; 10.0.10.25 port 80</programlisting>
+
+ <para><application>IPF</application> enthält einen
+ <acronym>FTP</acronym>-Proxy, der zusammen mit
+ <acronym>NAT</acronym> benutzt werden kann. Dieser Proxy
+ überwacht den ausgehenden Datenverkehr für aktive und passive
+ Verbindungsanfragen und erstellt dynamische Filterregeln,
+ welche die Portnummern des jeweiligen
+ <acronym>FTP</acronym>-Datenkanal enthalten. Dadurch entfällt
+ die Notwendigkeit, viele Ports für
+ <acronym>FTP</acronym>-Verbindungen zu öffnen.</para>
+
+ <para>In diesem Beispiel verwendet die erste Regel den Proxy
+ für ausgehende <acronym>FTP</acronym>-Verbindungen aus dem
+ internen <acronym>LAN</acronym>. Die zweite Regel übergibt
+ den <acronym>FTP</acronym>-Datenverkehr von der Firewall an
+ das Internet und die dritte Regel handhabt den restlichen
+ Datenverkehr aus dem internen <acronym>LAN</acronym>:</para>
+
+ <programlisting>map dc0 10.0.10.0/29 -&gt; 0/32 proxy port 21 ftp/tcp
+map dc0 0.0.0.0/0 -&gt; 0/32 proxy port 21 ftp/tcp
+map dc0 10.0.10.0/29 -&gt; 0/32</programlisting>
+
+ <para><acronym>FTP</acronym> <literal>map</literal>-Regeln
+ stehen vor den <acronym>NAT</acronym>-Regeln. Wenn ein Paket
+ mit der <acronym>FTP</acronym>-Regel übereinstimmt, erstellt
+ der <acronym>FTP</acronym>-Proxy eine temporäre Filterregel,
+ damit die Pakete durchgelassen und von <acronym>NAT</acronym>
+ verarbeitet werden können. Alle Pakte aus dem
+ <acronym>LAN</acronym>, die nicht für <acronym>FTP</acronym>
+ bestimmt sind, werden von <acronym>NAT</acronym> verarbeitet,
+ wenn sie mit der dritten Regel übereinstimmen.</para>
+
+ <para>Ohne den <acronym>FTP</acronym>-Proxy würden stattdessen
+ folgende Regeln benötigt. Beachten Sie, dass ohne den Proxy
+ alle Ports oberhalb von <literal>1024</literal> freigegeben
+ werden müssen:</para>
- <screen>&prompt.root; <userinput>ipfw -t list</userinput></screen>
+ <programlisting># 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
- <para>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:</para>
+# Allow out passive mode data channel high order port numbers
+pass out quick on rl0 proto tcp from any to any port &gt; 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</programlisting>
- <screen>&prompt.root; <userinput>ipfw -a list</userinput></screen>
+ <para>Nachdem die Datei mit den <acronym>NAT</acronym>-Regeln
+ bearbeitet wurde, führen Sie <command>ipnat</command> mit
+ <option>-CF</option> aus, um die aktuellen
+ <acronym>NAT</acronym>-Regeln und den Inhalt der dynamischen
+ Zuordnungstabelle zu löschen. Geben Sie
+ <option>-f</option> zusammen mit dem
+ <acronym>NAT</acronym>-Regelsatz an:</para>
- <para>Das folgende Kommando zeigt zusätzlich alle dynamischen
- Regeln an:</para>
+ <screen>&prompt.root; <userinput>ipnat -CF -f /etc/ipnat.rules</userinput></screen>
- <screen>&prompt.root; <userinput>ipfw -d list</userinput></screen>
+ <para>Statistiken zu <acronym>NAT</acronym> lassen sich wie
+ folgt anzeigen:</para>
- <para>Um diese Auflistung um die <quote>abgelaufenen</quote>
- Regeln zu erweitern, geben Sie folgendes Kommando ein:</para>
+ <screen>&prompt.root; <userinput>ipnat -s</userinput></screen>
- <screen>&prompt.root; <userinput>ipfw -d -e list</userinput></screen>
+ <para>Die aktuellen Zuordnungen der
+ <acronym>NAT</acronym>-Tabelle geben Sie mit diesem Kommando
+ aus:</para>
- <para>Hiermit werden alle Zähler auf Null zurückgesetzt:</para>
+ <screen>&prompt.root; <userinput>ipnat -l</userinput></screen>
- <screen>&prompt.root; <userinput>ipfw zero</userinput></screen>
+ <para>Ausführliche Informationen erhalten Sie mit:</para>
- <para>Es ist auch möglich, einen spezifischen Zähler
- zurückzusetzen:</para>
+ <screen>&prompt.root; <userinput>ipnat -v</userinput></screen>
+ </sect2>
- <screen>&prompt.root; <userinput>ipfw zero NUM</userinput></screen>
+ <sect2>
+ <title><application>IPF</application> Statistiken</title>
- <sect3>
- <title>Protokollierung von Firewall-Nachrichten</title>
+ <indexterm><primary>ipfstat</primary></indexterm>
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>Statistiken</secondary>
+ </indexterm>
- <para>Auch bei aktivierter Protokollierung wird
- <application>IPFW</application> 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
- <literal>log</literal> hinzugefügt werden. Normalerweise
- werden nur geblockte Pakete protokolliert. Es ist üblich,
- die <quote>ipfw default deny everything</quote>-Regel am
- Ende des Regelwerks mit dem Schlüsselwort
- <literal>log</literal> zu duplizieren. Dadurch ist es
- möglich, alle Pakete zu sehen, auf die keine Regel
- zutraf.</para>
+ <para><application>IPF</application> 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 <command>ipf -Z</command> zurückgesetzt
+ wurde.</para>
- <para>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.</para>
+ <para>Die Ausgabe von <command>ifstat</command> sieht in etwa
+ wie folgt aus:</para>
- <para>Die Kerneloption
- <literal>IPFIREWALL_VERBOSE_LIMIT=5</literal> 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:</para>
+ <screen>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)</screen>
- <programlisting>Last message repeated 45 times</programlisting>
+ <para>Es stehen viele Optionen zur Verfügung. Wird entweder
+ <option>-i</option> (eingehend) oder <option>-o</option>
+ (ausgehend) angegeben, wird der Befehl die entsprechende
+ Liste mit den derzeit vom Kernel benutzten Filterregeln
+ anzeigen. Um auch die Regelnummern zu sehen, muss
+ <option>-n</option> angegeben werden. Zum Beispiel zeigt
+ <command>ipfstat -on</command> die Tabelle für ausgehende
+ Regeln und die Regelnummer an:</para>
- <para>Alle protokollierten Pakete werden in der Voreinstellung
- in <filename>/var/log/security</filename> gespeichert. Dies
- wird in <filename>/etc/syslog.conf</filename>
- definiert.</para>
- </sect3>
+ <screen>@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</screen>
- <sect3 xml:id="firewalls-ipfw-rules-script">
- <title>Ein Firewall-Regelwerk erstellen</title>
+ <para>Wenn Sie der Regel ein <option>-h</option> voranstellen,
+ wird der Zähler für die jeweilige Regel ausgegeben. Zum
+ Beispiel gibt <command>ipfstat -oh</command> die ausgehenden
+ Regeln inklusive der Zähler aus:</para>
- <para>Die meisten fortgeschrittenen
- <application>IPFW</application>-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.</para>
+ <screen>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</screen>
- <para>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 &dollar;
- (Dollarzeichen). Symbolische Felder haben das
- &dollar;-Präfix nicht. Der Wert, mit dem das symbolische
- Feld belegt wird, muss in doppelten Anführungszeichen
- ("") stehen.</para>
+ <para>Benutzen Sie <command>ipfstat -t</command> 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
+ <acronym>IP</acronym>-Adressen, Ports oder Protokolle in
+ Echtzeit überwacht werden. Lesen Sie &man.ipfstat.8; für
+ weitere Informationen.</para>
+ </sect2>
+
+ <sect2>
+ <title><application>IPF</application> Protokollierung</title>
+
+ <indexterm>
+ <primary><command>ipmon</command></primary>
+ </indexterm>
+
+ <indexterm>
+ <primary><application>IPFILTER</application></primary>
+ <secondary>Protokollierung</secondary>
+ </indexterm>
+
+ <para><application>IPF</application> enthält mit
+ <command>ipmon</command> ein Werkzeug, mit dem die
+ Protokolle der Firewall in menschenlesbarer Form gespeichert
+ werden können. Dies erfordert jedoch, dass
+ <literal>options IPFILTER_LOG</literal> in die
+ Kernelkonfigurationsdatei hinzugefügt wird. Folgen Sie dazu
+ den Anweisungen in <xref linkend="kernelconfig"/>.</para>
+
+ <para>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
+ <literal>ipmon_flags</literal> <literal>-Ds</literal> in
+ <filename>rc.conf</filename> verwendet:</para>
+
+ <programlisting>ipmon_flags="-Ds" # D = start as daemon
+ # s = log to syslog
+ # v = log tcp window, ack, seq
+ # n = map IP &amp; port to names</programlisting>
+
+ <para>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.</para>
+
+ <para>Nachdem die Protokollierung in
+ <filename>/etc/rc.conf</filename> aktiviert und mit
+ <command>service ipmon start</command> gestartet wurde, wird
+ <application>IPF</application> Regeln aufzeichnen, welche das
+ Schlüsselwort <literal>log</literal> enthalten. Der
+ Firewalladministrator entscheidet, welche Regeln protokolliert
+ werden. In der Regel werden nur geblockte Pakete
+ protokolliert. Es ist üblich, das Schlüsselwort
+ <literal>log</literal> in der letzten Regel des Regelsatzes
+ mit aufzunehmen. Dies macht es möglich, alle Pakete zu sehen,
+ die mit keiner Regel des Regelsatzes übereinstimmten.</para>
+
+ <para>In der Voreinstellung verwendet
+ <command>ipmon -Ds</command> <literal>local0</literal> als
+ Protokoll-Facility. Die folgenden Level können verwendet
+ werden, um die erfassten Daten weiter aufzuspalten:</para>
+
+ <screen>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</screen>
+
+ <para>Damit <application>IPF</application> alle Daten
+ protokolliert, legen Sie zunächst eine neue Datei
+ <filename>/var/log/ipfilter.log</filename> an:</para>
- <para>Die Datei mit den Regeln könnte wie folgt aufgebaut
- sein:</para>
+ <screen>&prompt.root; <userinput>touch /var/log/ipfilter.log</userinput></screen>
- <programlisting>############### 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
-&dollar;cmd 00500 check-state
-&dollar;cmd 00502 deny all from any to any frag
-&dollar;cmd 00501 deny tcp from any to any established
-&dollar;cmd 00600 allow tcp from any to any 80 out via &dollar;oif setup &dollar;ks
-&dollar;cmd 00610 allow tcp from any to &dollar;odns 53 out via &dollar;oif setup &dollar;ks
-&dollar;cmd 00611 allow udp from any to &dollar;odns 53 out via &dollar;oif &dollar;ks
-################### End of example ipfw rules script ############</programlisting>
+ <para>Um alle Nachrichten in der angegebenen Datei zu
+ protokollieren, fügen Sie den folgenden Eintrag in
+ <filename>/etc/syslog.conf</filename> ein:</para>
+
+ <programlisting>local0.* /var/log/ipfilter.log</programlisting>
+
+ <para>Führen Sie <command>service syslogd reload</command> aus,
+ damit &man.syslogd.8; <filename>/etc/syslog.conf</filename>
+ neu einliest, um die Änderungen zu aktivieren.</para>
+
+ <para>Denken Sie daran, auch
+ <filename>/etc/newsyslog.conf</filename> anzupassen, damit das
+ neue Protokoll rotiert wird.</para>
+
+ <para>Die von <command>ipmon</command> generierten Nachrichten
+ bestehen aus Daten, welche durch Leerzeichen getrennt sind.
+ Alle Nachrichten enthalten die folgenden Felder:</para>
- <para>Die Regeln in diesem Beispiel sind nicht wichtig.
- Wichtig ist es, zu zeigen, wie die symbolische Substitution
- innerhalb der Regeln verwendet wird.</para>
+ <orderedlist>
+ <listitem>
+ <para>Das Datum, an dem das Paket empfangen wurde.</para>
+ </listitem>
- <para>Wenn dieses Beispiel in
- <filename>etc/ipfw.rules</filename> gespeichert wurde, so
- könnten alle Regeln durch die Ausführung des folgenden
- Kommandos neu geladen werden:</para>
+ <listitem>
+ <para>Die Uhrzeit, wann das Paket empfangen wurde. Das
+ Format ist HH:MM:SS.F (Stunden, Minuten, Sekunden und
+ Sekundenbruchteile).</para>
+ </listitem>
- <screen>&prompt.root; <userinput>sh /etc/ipfw.rules</userinput></screen>
+ <listitem>
+ <para>Der Name der Schnittstelle, die das Paket
+ verarbeitet hat.</para>
+ </listitem>
- <para>Anstelle von <filename>/etc/ipfw.rules</filename> kann
- ein beliebig anderer Name oder Speicherort verwendet
- werden.</para>
+ <listitem>
+ <para>Die Gruppen- und Regelnummer im Format
+ <literal>@0:17</literal>.</para>
+ </listitem>
- <para>Alternativ können die einzelnen Befehle dieses Skripts
- auch von Hand eingegeben werden:</para>
+ <listitem>
+ <para>Die Aktion: <literal>p</literal> für durchgelassene
+ Pakete, <literal>b</literal> für blockierte Pakete,
+ <literal>S</literal> für kurze Pakete,
+ <literal>n</literal> für Pakete auf die keine Regel zutraf
+ und <literal>L</literal> für Pakete die protokolliert
+ wurden.</para>
+ </listitem>
- <screen>&prompt.root; <userinput>ipfw -q -f flush</userinput>
-&prompt.root; <userinput>ipfw -q add check-state</userinput>
-&prompt.root; <userinput>ipfw -q add deny all from any to any frag</userinput>
-&prompt.root; <userinput>ipfw -q add deny tcp from any to any established</userinput>
-&prompt.root; <userinput>ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state</userinput>
-&prompt.root; <userinput>ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state</userinput>
-&prompt.root; <userinput>ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state</userinput></screen>
- </sect3>
+ <listitem>
+ <para>Die Adressen werden in drei Felder unterteilt: die
+ Quelladresse und der Port getrennt durch Komma, das
+ Zeichen -&gt;, sowie die Zieladresse und Port. Zum
+ Beispiel <literal>209.53.17.22,80 -&gt;
+ 198.72.220.17,1722</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>PR</literal>, gefolgt vom Namen oder Nummer
+ des Protokolls. Zum Beispiel
+ <literal>PR tcp</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>len</literal>, gefolgt von der Größe des
+ Headers und der Gesamtgröße des Pakets. Zum Beispiel
+ <literal>len 20 40</literal>.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Wenn es sich beim dem Paket um ein
+ <acronym>TCP</acronym>-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;.</para>
+
+ <para>Wenn es sich beim dem Paket um ein
+ <acronym>ICMP</acronym>-Paket handelt, gibt es zwei
+ zusätzliche Felder: das erste Feld ist immer
+ <quote>icmp</quote> und das zweite Feld enthält die
+ <acronym>ICMP</acronym>-Nachricht und den Nachrichten-Code,
+ getrennt durch einen Schrägstrich. Beispielswiese
+ <literal>icmp 3/3</literal> für die Nachricht
+ <foreignphrase>Port unreachable</foreignphrase>.</para>
</sect2>
</sect1>
</chapter>

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 16, 8:12 AM (3 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29761462
Default Alt Text
D8026.diff (204 KB)

Event Timeline