Date: Tue, 7 Jun 2016 11:22:54 +0000 (UTC) From: Bjoern Heidotting <bhd@FreeBSD.org> To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r48900 - head/de_DE.ISO8859-1/books/handbook/firewalls Message-ID: <201606071122.u57BMst3033802@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bhd Date: Tue Jun 7 11:22:53 2016 New Revision: 48900 URL: https://svnweb.freebsd.org/changeset/doc/48900 Log: Update of the firewall chapter part 2/4 -> PF Reviewed by: bcr Differential Revision: https://reviews.freebsd.org/D6738 Modified: head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml Modified: head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml ============================================================================== --- head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml Sun Jun 5 15:47:50 2016 (r48899) +++ head/de_DE.ISO8859-1/books/handbook/firewalls/chapter.xml Tue Jun 7 11:22:53 2016 (r48900) @@ -293,306 +293,1384 @@ </sect1> <sect1 xml:id="firewalls-pf"> - <info><title>Paket Filter (PF) von OpenBSD und - <acronym>ALTQ</acronym></title> + <info> + <title>PF</title> + <authorgroup> - <author><personname><firstname>John</firstname><surname>Ferrell</surname></personname><contrib>Revised and updated by </contrib></author> + <author> + <personname> + <firstname>John</firstname> + <surname>Ferrell</surname> + </personname> + <contrib>Überarbeitet und aktualisiert von </contrib> + </author> </authorgroup> </info> - - <indexterm> <primary>firewall</primary> <secondary>PF</secondary> </indexterm> - <para>Im Juli 2003 wurde <acronym>PF</acronym>, die - Standard-Firewall von OpenBSD, nach &os; portiert und in die - &os;-Ports-Sammlung aufgenommen. 2004 war <acronym>PF</acronym> in - &os; 5.3 Teil des Basissystems. Bei <acronym>PF</acronym> - handelt es sich um eine komplette, vollausgestattete Firewall, - die optional auch <acronym>ALTQ</acronym> (Alternatives - Queuing) unterstützt. <acronym>ALTQ</acronym> bietet Ihnen + <para>In &os; 5.3 wurde <application>PF</application> von + OpenBSD in das Basissystem integriert. Bei + <application>PF</application> handelt es sich um eine komplette, + voll ausgestattete Firewall, die optional auch + <application>ALTQ</application> (Alternatives Queuing) + unterstützt. <application>ALTQ</application> stellt <foreignphrase>Quality of Service</foreignphrase> - (<acronym>QoS</acronym>)-Bandbreitenformung.</para> + (<acronym>QoS</acronym>) zur Verfügung.</para> - <para>Das OpenBSD-Projekt leistet bereits hervorragende - Dokumentationsarbeit mit der <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>. Aus diesem Grund - konzentriert sich dieser Handbuchabschnitt nur auf diejenigen - Besonderheiten von <acronym>PF</acronym>, die &os; betreffen, sowie ein - paar allgemeine Informationen hinsichtlich der Verwendung. Genauere - Informationen zum Einsatz erhalten Sie in der <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>.</para> - - <para>Weitere Informationen zu <acronym>PF</acronym> für &os; finden - Sie unter <uri xlink:href="http://pf4freebsd.love2party.net/">http://pf4freebsd.love2party.net/</uri>.</para> + <para>Das OpenBSD-Projekt pflegt die maßgebliche Referenz von + <application>PF</application> in der <link + xlink:href="http://www.openbsd.org/faq/pf">PF FAQ</link>. + Peter Hansteen betreut ein sehr ausführliches + <application>PF</application>-Tutorial unter <link + xlink:href="http://home.nuug.no/~peter/pf/"> + http://home.nuug.no/~peter/pf/</link>.</para> + + <warning> + <para>Bedenken Sie beim Studium der <link + xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>, + dass &os; die <application>PF</application>-Version aus + OpenBSD 4.5 enthält.</para> + </warning> + + <para>Die &a.pf; ist ein guter Anlaufpunkt für Fragen zur + Konfiguration und dem Einsatz der + <application>PF</application>-Firewall. Überprüfen Sie + aber zunächst die Archive der Mailingliste, bevor Sie eine + Frage stellen. Vielleicht wurde die Frage dort schon + beantwortet.</para> + + <para>Weitere Informationen über die Portierung von + <application>PF</application> nach &os; finden Sie unter <link + xlink:href="http://pf4freebsd.love2party.net/"> + http://pf4freebsd.love2party.net/</link>.</para> + + <para>Dieser Abschnitt konzentriert sich auf + <application>PF</application> in &os;. Es wird beschrieben, wie + <application>PF</application> und + <application>ALTQ</application> aktiviert werden. Anschließend + wird demonstriert, wie Regelsätze auf einem &os;-System erstellt + werden.</para> <sect2> - <title>Verwendung der PF-Kernelmodule</title> + <title><application>PF</application> aktivieren</title> + + <para>Damit <application>PF</application> benutzt werden kann, + muss zunächst das Kernelmodul geladen werden. Dieser + Abschnitt beschreibt die Einträge für + <filename>/etc/rc.conf</filename>, die verwendet werden können + um <application>PF</application> zu aktivieren.</para> - <para>Um die PF Kernel Module zu laden, fügen Sie folgende - Zeile in ihre <filename>/etc/rc.conf</filename> ein:</para> + <para>Beginnen Sie mit folgender Zeile in + <filename>/etc/rc.conf</filename>:</para> <programlisting>pf_enable="YES"</programlisting> - <para>Danach starten Sie das Startup Script um die Module - zu laden:</para> + <para>&man.pfctl.8; beschreibt zusätzliche Optionen, die beim + Start an <application>PF</application> übergeben werden + können. Fügen Sie diesen Eintrag in + <filename>/etc/rc.conf</filename> hinzu und schreiben Sie die + benötigten Optionen zwischen die Anführungszeichen:</para> + + <programlisting>pf_flags="" # additional flags for pfctl startup</programlisting> + + <para><application>PF</application> kann nicht gestartet werden, + wenn es seine Konfigurationsdatei nicht findet. In der + Voreinstellung existiert bereits ein Regelsatz namens + <filename>/etc/pf.conf</filename>. Wenn bereits ein Regelsatz + an anderer Stelle gespeichert wurde, fügen Sie in + <filename>/etc/rc.conf</filename> einen Eintrag mit dem + vollständigen Pfad zur Datei ein:</para> - <screen>&prompt.root; <userinput>/etc/rc.d/pf start</userinput></screen> + <programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting> - <para>Das PF Modul wird nicht geladen, falls es die Ruleset - Konfigurationsdatei nicht findet. Standardmässig befindet - sich diese Datei in <filename>/etc/pf.conf</filename>. Falls das - PF Ruleset sich an einem anderen Platz befindet, können Sie das - durch Hinzufügen einer Zeile ähnlich der folgenden, in - ihrer <filename>/etc/rc.conf</filename> ändern:</para> + <para>Protokollierungsfunktionen für + <application>PF</application> werden von &man.pflog.4; zur + Verfügung gestellt. Fügen Sie folgende Zeile in + <filename>/etc/rc.conf</filename> ein, um diese Funktion zu + aktivieren:</para> - <programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting> + <programlisting>pflog_enable="YES"</programlisting> + + <para>Die folgenden Zeilen können ebenfalls hinzugefügt werden, + um den Speicherort der Protokolldatei zu bestimmen und weitere + Optionen beim Start an &man.pflog.4; zu übergeben:</para> + + <programlisting>pflog_logfile="/var/log/pflog" # where pflogd should store the logfile +pflog_flags="" # additional flags for pflogd startup</programlisting> + + <para>Falls ein <acronym>LAN</acronym> hinter der Firewall + existiert und die Pakete an die Rechner im + <acronym>LAN</acronym> weitergeleitet werden müssen, oder + wenn <acronym>NAT</acronym> benötigt wird, fügen Sie die + folgende Option hinzu:</para> + + <programlisting>gateway_enable="YES" # Enable as LAN gateway</programlisting> + + <para>Nachdem die Änderungen gespeichert wurden, kann + <application>PF</application> mit Unterstützung für + Protokollierung gestartet werden:</para> + + <screen>&prompt.root; <userinput>service pf start</userinput> +&prompt.root; <userinput>service pflog start</userinput></screen> + +<!-- +This is no longer true as of 9.x. It also references the CARP section +which doesn't explain how to use it...At some point it should. + <indexterm>$ + <primary>kernel options</primary> + <secondary>device pf</secondary> + </indexterm> + + <indexterm> + <primary>kernel options</primary> + <secondary>device pflog</secondary> + </indexterm> + + <indexterm> + <primary>kernel options</primary> + <secondary>device pfsync</secondary> + </indexterm> <note> - <para>Ein Beispiel für die Datei <filename>pf.conf</filename> - finden Sie im Verzeichnis <filename>/usr/share/examples/pf/</filename>.</para> + <para>While it is not necessary to compile + <application>PF</application> support into the &os; kernel, + some advanced features are not included, namely &man.pfsync.4;, which is a + pseudo-device that exposes certain changes to the state table + used by <application>PF</application>. It can be paired with + &man.carp.4; to create failover firewalls using + <application>PF</application>. More information on + <acronym>CARP</acronym> can be found in <xref linkend="carp"/>.</para> + + <para>The following <application>PF</application> kernel options + are available:</para> + + <programlisting>device pf +device pflog +device pfsync</programlisting> + + <para>where:</para> + + <para><literal>device pf</literal> enables PF support.</para> + + <para><literal>device pflog</literal> enables the optional + &man.pflog.4; pseudo network device which can be used to log +>>>>>>>> traffic to a &man.bpf.4; descriptor. The &man.pflogd.8; +>>>>>>>> daemon can then be used to store the logging information to +>>>>>>>> disk.</para> + + <para><literal>device pfsync</literal> enables the optional + &man.pfsync.4; pseudo-network device that is used to monitor + <quote>state changes</quote>.</para> </note> +--> - <para>Das <acronym>PF</acronym>-Modul kann auch manuell über die - Kommandozeile geladen werden:</para> + <para>In der Voreinstellung liest <application>PF</application> + seine Konfiguration aus <filename>/etc/pf.conf</filename> und + modifiziert, verwirft oder akzeptiert Pakete anhand der + Definitionen in dieser Datei. &os; enthält mehrere + Beispieldateien unter + <filename>/usr/share/examples/pf/</filename>. Auch die + <link xlink:href="http://www.openbsd.org/faq/pf/">PF + FAQ</link> enthält sehr ausführliche Beispiele für + <application>PF</application>-Regeln.</para> + + <para>Zur Steuerung von <application>PF</application> wird + <command>pfctl</command> verwendet. <xref linkend="pfctl"/> + fasst einige nützliche Optionen für diesen Befehl zusammen. + Eine Beschreibung aller verfügbaren Optionen finden Sie in + &man.pfctl.8;.</para> - <screen>&prompt.root; <userinput>kldload pf.ko</userinput></screen> + <table xml:id="pfctl" frame="none" pgwide="1"> + <title>Nützliche <command>pfctl</command> Optionen</title> - <para>Protokollierungsfunktionen für PF werden durch das Modul - <literal>pflog.ko</literal> zur Verfügung gestellt und - können durch folgenden Eintrag in der - <filename>/etc/rc.conf</filename> aktiviert werden:</para> + <tgroup cols="2"> + <thead> + <row> + <entry>Kommando</entry> + <entry>Aufgabe</entry> + </row> + </thead> - <programlisting>pflog_enable="YES"</programlisting> + <tbody> + <row> + <entry><command>pfctl -e</command></entry> + <entry><application>PF</application> aktivieren</entry> + </row> - <para>Danach starten Sie das Startup Script, um das Modul - zu laden:</para> + <row> + <entry><command>pfctl -d</command></entry> + <entry><application>PF</application> + deaktivieren</entry> + </row> - <screen>&prompt.root; <userinput>/etc/rc.d/pflog start</userinput></screen> + <row> + <entry><command>pfctl -F all -f + /etc/pf.conf</command></entry> + <entry>Alle Filterregeln zurücksetzen + (<acronym>NAT</acronym>, Filter, Zustandstabelle) und + <filename>/etc/pf.conf</filename> erneut + einlesen.</entry> + </row> - <para>Falls Sie noch weitere Features für - <acronym>PF</acronym> benötigen, müssen Sie diese in den - Kernel einbauen.</para> + <row> + <entry><command>pfctl -s [ rules | nat | + states ]</command></entry> + <entry>Zusammenfassung der Filterregeln, + <application>NAT</application>-Regeln, oder der + Zustandstabelle.</entry> + </row> + + <row> + <entry><command>pfctl -vnf + /etc/pf.conf</command></entry> + <entry>Überprüft <filename>/etc/pf.conf</filename> auf + Fehler, lädt aber die Filterregeln nicht neu.</entry> + </row> + </tbody> + </tgroup> + </table> + + <tip> + <para><package>security/sudo</package> ist nützlich um + Kommandos mit erhöhten Berechtigungen auszuführen, wie + beispielsweise <command>pfctl</command>. Das Programm kann + aus der Ports-Sammlung installiert werden.</para> + </tip> + + <para>Um den ein- und ausgehenden Verkehr im Auge zu behalten, + können Sie ein Werkzeug wie <package>sysutils/pftop</package> + benutzen. Sobald das Programm installiert ist, können Sie + <application>pftop</application> ausführen, um einen Snapshot + des Datenverkehrs zu sehen. Das Format der Ausgabe ist der + von &man.top.1; sehr ähnlich.</para> </sect2> <sect2> - <title>PF Kernel-Optionen</title> + <title><application>ALTQ</application> aktivieren</title> - <indexterm> - <primary>Kerneloptionen</primary> + <para>Unter &os; kann <application>ALTQ</application> zusammen + mit <application>PF</application> benutzt werden, um Quality + of Service (<acronym>QoS</acronym>) bereitzustellen. Sobald + <application>ALTQ</application> aktiviert ist, können + Warteschlangen definiert werden, mit denen Sie die Priorität + für ausgehende Pakete festlegen können.</para> + + <para>Bevor Sie <application>ALTQ</application> aktivieren, + sollten Sie &man.altq.4; lesen und sicherstellen, das der + Treiber der Netzwerkkarte diese Funktion unterstützt.</para> + + <para><application>ALTQ</application> steht nicht als ladbares + Kernelmodul zur Verfügung. Wenn die Netzwerkkarte des Systems + <application>ALTQ</application> unterstützt, erstellen Sie + nach den Anweisungen in <xref linkend="kernelconfig"/> einen + angepassten Kernel. Als erstes muss + <application>ALTQ</application> aktiviert werden. Zudem ist + mindestens eine weitere Option nötig, um den Algorithmus für + die Warteschlange zu bestimmen:</para> - <secondary>device pf</secondary> - </indexterm> + <programlisting>options ALTQ +options ALTQ_CBQ # Class Based Queuing (CBQ) +options ALTQ_RED # Random Early Detection (RED) +options ALTQ_RIO # RED In/Out +options ALTQ_HFSC # Hierarchical Packet Schedule (HFSC) +options ALTQ_PRIQ # Priority Queuing (PRIQ)</programlisting> - <indexterm> - <primary>Kerneloptionen</primary> + <para>Die folgenden Algorithmen stehen zur Verfügung:</para> - <secondary>device pflog</secondary> - </indexterm> + <variablelist> + <varlistentry> + <term>CBQ</term> + <listitem> + <para>Class Based Queuing (<acronym>CBQ</acronym>) erlaubt + es, die Bandbreite einer Verbindung in verschiedene + Klassen oder Warteschlangen zu unterteilen, um die + Priorität von Datenpaketen basierend auf Filterregeln zu + beeinflussen.</para> + </listitem> + </varlistentry> - <indexterm> - <primary>Kerneloptionen</primary> + <varlistentry> + <term>RED</term> + <listitem> + <para>Random Early Detection (<acronym>RED</acronym>) wird + eingesetzt, um eine Überlastung des Netzwerks zu + vermeiden. Dazu ermittelt <acronym>RED</acronym> die + Größe der Warteschlange und vergleicht diesen Wert mit + den minimalen und maximalen Grenzwerten der + Warteschlange. Ist die Warteschlange größer als das + erlaubte Maximum, werden alle neuen Pakete nach dem + Zufallsprinzip verworfen.</para> + </listitem> + </varlistentry> - <secondary>device pfsync</secondary> - </indexterm> + <varlistentry> + <term>RIO</term> + <listitem> + <para>Random Early Detection In and Out + (<acronym>RIO</acronym>). Dieser Modus verwaltet + mehrere Warteschlangen durchschnittlicher Größe mit + mehreren Schwellwerten, eine für jedes + <acronym>QoS</acronym>-Level.</para> + </listitem> + </varlistentry> - <para>Es ist nicht zwingend nötig, dass Sie - <acronym>PF</acronym>-Unterstützung in den &os;-Kernel - kompilieren. Sie werden dies tun müssen, um eine von PFs - fortgeschritteneren Eigenschaften nutzen zu können, die nicht als - Kernelmodul verfügbar ist. Genauer handelt es sich dabei um - &man.pfsync.4;, ein Pseudo-Gerät, welches bestimmte - Änderungen der <acronym>PF</acronym>-Zustandstabelle offenlegt. - Es kann mit &man.carp.4; kombiniert werden, um ausfallsichere - Firewalls mit <acronym>PF</acronym> zu realisieren. Weitere - Informationen zu <acronym>CARP</acronym> erhalten Sie in - <xref linkend="carp"/> des Handbuchs.</para> - - <para>Die Kernelkonfigurationsoptionen von <acronym>PF</acronym> befinden - sich in <filename>/usr/src/sys/conf/NOTES</filename> und sind im - Folgenden wiedergegeben:</para> + <varlistentry> + <term>HFSC</term> + <listitem> + <para>Hierachical Fair Service Curve Packet Scheduler + (<acronym>HFSC</acronym>) wird in <link + xlink:href="http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html"> + http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html</link> + beschrieben.</para> + </listitem> + </varlistentry> - <programlisting>device pf -device pflog -device pfsync</programlisting> + <varlistentry> + <term>PRIQ</term> + <listitem> + <para>Priority Queuing (<acronym>PRIQ</acronym>) lässt den + Verkehr einer Warteschlange mit höherer Priorität zuerst + durch.</para> + </listitem> + </varlistentry> + </variablelist> - <para>Die Option <literal>device pf</literal> aktiviert die - Unterstützung für die <quote>Packet - Filter</quote>-Firewall (&man.pf.4;).</para> + <para>Weitere Informationen über diese Algorithmen und Beispiele + für Regelsätze finden Sie unter <link + xlink:href="http://www.openbsd.org/faq/pf/queueing.html"> + http://www.openbsd.org/faq/pf/queueing.html</link>.</para> + </sect2> - <para>Die Option <literal>device pflog</literal> aktiviert das optionale - &man.pflog.4;-Pseudonetzwerkgerät, das zum Protokollieren - des Datenverkehrs über einen &man.bpf.4;-Deskriptor - dient. &man.pflogd.8; ist in der Lage, diese Protokolldateien - auf Ihre Platte zu speichern.</para> + <sect2 xml:id="pf-tutorial"> + <info> + <title><application>PF</application> Regelsätze</title> + + <authorgroup> + <author> + <personname> + <firstname>Peter</firstname> + <surname>Hansteen</surname> + <othername>N. M.</othername> + </personname> + <contrib>Beigetragen von </contrib> + </author> + </authorgroup> + </info> + + <para>Dieser Abschnitt beschreibt die Erstellung von angepassten + Regelsätzen. Es wird mit dem einfachsten Regelsatz begonnen + auf dem dann weitere aufgebaut werden, um die + Konzepte und Funktionen von <application>PF</application> an + einigen konkreten Beispielen zu verdeutlichen.</para> + + <para>Der einfachste Regelsatz gilt für einen Rechner, der + keine Dienste anbietet und Zugriff auf das Internet haben + soll. Für diesen minimalen Regelsatz wird + <filename>/etc/pf.conf</filename> wie folgt + konfiguriert:</para> + + <programlisting>block in all +pass out all keep state</programlisting> + + <para>Die erste Regel blockiert jeglichen eingehenden + Datenverkehr. Die zweite Regel erlaubt ausgehende + Verbindungen von diesem Rechner, während die + Zustandsinformationen dieser Verbindungen gespeichert werden. + Diese Zustandsinformationen machen es möglich, den + Antwortverkehr für diese Verbindungen zu erlauben. Der + Regelsatz wird mit dem folgenden Befehl geladen:</para> + + <screen>&prompt.root; <userinput>pfctl -e ; pfctl -f /etc/pf.conf</userinput></screen> + + <para>Neben den Zustandsinformationen verfügt + <application>PF</application> über + <firstterm>Listen</firstterm> und + <firstterm>Makros</firstterm>. Diese können bei der + Erstellung der Regeln definiert werden. Makros können Listen + enthalten und sie müssen vor ihrer ersten Benutzung definiert + sein. Fügen Sie beispielsweise folgende Zeilen an den Anfang + des Regelsatzes:</para> + + <programlisting>tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }" +udp_services = "{ domain }"</programlisting> + + <para><application>PF</application> versteht sowohl Portnamen + als auch Portnummern, solange die Namen in + <filename>/etc/services</filename> aufgeführt sind. Dieses + Beispiel erstellt zwei Makros. Das erste ist eine Liste mit + sieben <acronym>TCP</acronym>-Portnamen, die zweite Liste + enthält einen <acronym>UDP</acronym>-Portnamen. Sobald ein + Makro definiert ist, kann es in den Regeln verwendet werden. + In diesem Beispiel wird der gesamte Datenverkehr geblockt, mit + Ausnahme der Verbindungen die von diesem Rechner initiiert + wurden und sich auf einen der angegebenen + <acronym>TCP</acronym>-Dienste oder den + <acronym>UDP</acronym>-Dienst beziehen:</para> + + <programlisting>tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }" +udp_services = "{ domain }" +block all +pass out proto tcp to any port $tcp_services keep state +pass proto udp to any port $udp_services keep state</programlisting> + + <para>Obwohl <acronym>UDP</acronym> als zustandsloses Protokoll + betrachtet wird, ist <application>PF</application> in der Lage + einige Zustandsinformationen zu verfolgen. Wenn + beispielsweise eine <acronym>UDP</acronym>-Abfrage für einen + Nameserver das System verlässt, wird + <application>PF</application> nach der Antwort Ausschau halten + und das Antwortpaket durch lassen.</para> + + <para>Nachdem der Regelsatz verändert wurde, muss er neu geladen + werden:</para> + + <screen>&prompt.root; <userinput>pfctl -f /etc/pf.conf</userinput></screen> + + <para>Wenn keine Syntaxfehler festgestellt werden, wird + <command>pfctl</command> keine Ausgabe erzeugen. Die Syntax + kann auch getestet werden, bevor der Regelsatz geladen + wird:</para> + + <screen>&prompt.root; <userinput>pfctl -nf /etc/pf.conf</userinput></screen> + + <para>Die Option <option>-n</option> bewirkt, dass die Regeln + nur interpretiert, jedoch nicht geladen werden. Dies bietet + die Möglichkeit, alle Fehler zu korrigieren. Es wird immer + der letzte gültige Regelsatz geladen, bis + <application>PF</application> entweder deaktiviert, oder ein + neuer Regelsatz geladen wird.</para> + + <tip> + <para>Wenn Sie beim Laden oder Prüfen des Regelsatzes noch die + Option <option>-v</option> hinzufügen, wird + <command>pfctl</command> den komplett interpretierten + Regelsatz anzeigen. Dies ist äußerst nützlich, wenn Sie + versuchen Fehler im Regelsatz zu finden.</para> + </tip> + + <sect3 xml:id="pftut-gateway"> + <title>Einfaches Gateway mit <acronym>NAT</acronym></title> + + <para>Dieser Abschnitt zeigt wie ein &os;-System mit + <application>PF</application> als Gateway konfiguriert wird. + Das Gateway muss über mindestens zwei Netzwerkkarten + verfügen, die jeweils mit einem separaten Netzwerk verbunden + sind. In diesem Beispiel ist <filename>xl1</filename> mit + dem Internet verbunden und <filename>xl0</filename> ist mit + dem internen Netzwerk verbunden.</para> + + <para>Aktivieren Sie zunächst das Gateway, damit der Rechner + den Netzwerkverkehr von einer Schnittstelle zur nächsten + weiterleiten kann. Diese + <application>sysctl</application>-Einstellung sorgt dafür, + dass <acronym>IPv4</acronym>-Pakete weitergeleitet + werden:</para> + + <screen>&prompt.root; <userinput>sysctl net.inet.ip.forwarding=1</userinput></screen> + + <para>So leiten Sie <acronym>IPv6</acronym>-Datenverkehr + weiter:</para> + + <screen>&prompt.root; <userinput>sysctl net.inet6.ip6.forwarding=1</userinput></screen> + + <para>Um diese Einstellungen beim Systemstart zu aktivieren, + fügen Sie folgende Zeilen in + <filename>/etc/rc.conf</filename> ein:</para> + + <programlisting>gateway_enable="YES" #für ipv4 +ipv6_gateway_enable="YES" #für ipv6</programlisting> + + <para>Prüfen Sie mit <command>ifconfig</command>, dass beide + Schnittstellen vorhanden und aktiv sind.</para> + + <para>Als nächstes erstellen Sie die nötigen + <application>PF</application>-Regeln, damit das Gateway den + Datenverkehr weiterleiten kann. Die folgende Regel erlaubt + den zustandsorientierten Verkehr aus dem Internet zu den + Rechnern im Netzwerk:</para> + + <programlisting>pass in on xl1 from xl1:network to xl0:network port $ports keep state</programlisting> + + <para>Diese Regel erlaubt lediglich den Datenverkehr über das + Gateway auf der internen Schnittstelle. Damit die Pakete + noch weiter gehen, wird eine passende Regel benötigt:</para> + + <programlisting>pass out on xl0 from xl1:network to xl0:network port $ports keep state</programlisting> + + <para>Obwohl diese beiden Regeln funktionieren, werden sie + in der Praxis so spezifisch selten benötigt. Ein lesbarer + Regelsatz ist oft ein sicherer Regelsatz. Der Rest dieses + Abschnitts zeigt, wie Sie die Regeln so einfach und lesbar + wie möglich halten. Zum Beispiel könnten die beiden Regeln + zu einer Regel zusammengefasst werden:</para> + + <programlisting>pass from xl1:network to any port $ports keep state</programlisting> + + <para>Die Notation <literal>interface:network</literal> kann + durch ein Makro ersetzt werden, um den Regelsatz besser + lesbar zu machen. Zum Beispiel könnte für das Netzwerk an + der internen Schnittstelle (<literal>xl0:network</literal>) + ein Makro namens <literal>$localnet</literal> definiert + werden. Alternativ könnte für die Definition von + <literal>$localnet</literal> auch eine + <emphasis>IP-Adresse/Netzmaske</emphasis> Notation verwendet + werden, um ein Netzwerk zu bezeichnen, beispielsweise + <literal>192.168.100.1/24</literal> für ein privates + Subnetz.</para> + + <para>Bei Bedarf kann für <literal>$localnet</literal> auch + eine Liste von Netzwerken definiert werden. Abhängig von + den Bedürfnissen kann <literal>$localnet</literal> auch für + eine typische Regel wie folgt verwendet werden:</para> + + <programlisting>pass from $localnet to any port $ports keep state</programlisting> + + <para>Der folgende Regelsatz erlaubt sämtlichen Verkehr, der + von den Rechnern im internen Netzwerk initiiert wird. + Zunächst werden zwei Makros definiert, die die externen und + internen 3COM-Schnittstellen repräsentieren.</para> + + <note> + <para>Bei Einwählverbindungen wird <filename>tun0</filename> + für die externe Schnittstelle verwendet. Bei + <acronym>ADSL</acronym>-Verbindungen, insbesondere denen + die <acronym>PPP</acronym> over Ethernet + (<acronym>PPPoE</acronym>) verwenden, ist die richtige + externe Schnittstelle <filename>tun0</filename> und nicht + die physische Ethernet-Schnittstelle.</para> + </note> + + <programlisting>ext_if = "xl0" # macro for external interface - use tun0 for PPPoE +int_if = "xl1" # macro for internal interface +localnet = $int_if:network +# ext_if IP address could be dynamic, hence ($ext_if) +nat on $ext_if from $localnet to any -> ($ext_if) +block all +pass from { lo0, $localnet } to any keep state</programlisting> + + <para>Dieser Regelsatz führt die <acronym>NAT</acronym>-Regel + ein, die verwendet wird, um die Übersetzung der + Netzwerkadressen von den nicht-routebaren Adressen im + internen Netzwerk auf die <acronym>IP</acronym>-Adresse der + externen Schnittstelle zu handhaben. Die Klammern im + letzten Teil der <acronym>NAT</acronym>-Regel + <literal>($ext_if)</literal> werden angegeben, wenn die + <acronym>IP</acronym>-Adresse der externen Schnittstelle + dynamisch zugewiesen wird. Damit wird sichergestellt, dass + der Netzwerkverkehr ohne schwerwiegende Unterbrechungen + weiterläuft, auch wenn sich die externe + <acronym>IP</acronym>-Adresse ändert.</para> + + <para>Beachten Sie, dass dieser Regelsatz wahrscheinlich mehr + Verkehr aus dem Netzwerk zulässt, als eigentlich nötig ist. + Bei einem angemessenen Aufbau könnte folgendes Makro + erstellt werden:</para> + + <programlisting>client_out = "{ ftp-data, ftp, ssh, domain, pop3, auth, nntp, http, \ + https, cvspserver, 2628, 5999, 8000, 8080 }"</programlisting> + + <para>Dieses Makro wird dann in der Filterregel + benutzt:</para> + + <programlisting>pass inet proto tcp from $localnet to any port $client_out \ + flags S/SA keep state</programlisting> + + <para>Weitere <literal>pass</literal> Regeln werden + vielleicht noch benötigt. Diese Regel aktiviert + <acronym>SSH</acronym> auf der externen + Schnittstelle:</para> + + <programlisting>pass in inet proto tcp to $ext_if port ssh</programlisting> + + <para>Dieses Makrodefinition und Regel erlaubt + <acronym>DNS</acronym> und <acronym>NTP</acronym> für + interne Clients:</para> + + <programlisting>udp_services = "{ domain, ntp }" +pass quick inet proto { tcp, udp } to any port $udp_services keep state</programlisting> + + <para>Beachten Sie das Schlüsselwort <literal>quick</literal> + in dieser Regel. Da der Regelsatz aus mehreren Regeln + besteht, ist es wichtig, die Beziehungen zwischen den + einzelnen Regeln zu verstehen. Die Regeln werden von oben + nach unten ausgewertet, in der Reihenfolge wie sie + geschrieben sind. Für jedes Paket oder jede Verbindung, das + <application>PF</application> ausgewertet, wird die letzte + übereinstimmende Regel im Regelsatz angewendet. Wenn jedoch + ein Paket auf eine Regel passt, welche das Schlüsselwort + <literal>quick</literal> enthält, wird das Paket + entsprechend dieser Regel behandelt und die + Regelverarbeitung wird gestoppt. Diese Vorgehensweise ist + sehr nützlich, wenn eine Ausnahme von den allgemeinen Regeln + erforderlich ist.</para> + </sect3> - <para>Die Option <literal>device pfsync</literal> aktiviert das optionale - &man.pfsync.4;-Pseudonetzwerkgerät für die - Überwachung von <quote>Statusänderungen</quote>.</para> - </sect2> + <sect3 xml:id="pftut-ftp"> + <title>Einen <acronym>FTP</acronym>-Proxy einrichten</title> - <sect2> - <title>Verfügbare rc.conf-Optionen</title> + <para>Die Konfiguration einer funktionierenden Regel für + <acronym>FTP</acronym> kann aufgrund der Beschaffenheit des + <acronym>FTP</acronym>-Protokolls problematisch sein. + <acronym>FTP</acronym> ist sehr viel älter als Firewalls + und schon vom Design her unsicher. Die häufigsten Argumente + gegen eine Verwendung von <acronym>FTP</acronym> + sind:</para> + + <itemizedlist> + <listitem> + <para>Passwörter werden im Klartext übertragen.</para> + </listitem> + + <listitem> + <para>Das Protokoll erfordert die Verwendung von + mindestens zwei <acronym>TCP</acronym>-Verbindungen + (Steuerung und Daten) auf separaten Ports.</para> + </listitem> + + <listitem> + <para>Wenn eine Sitzung aufgebaut wird, werden die Daten + auf zufällig ausgewählten Ports übermittelt.</para> + </listitem> + </itemizedlist> - <para>Die folgenden &man.rc.conf.5;-Einträge konfigurieren - <acronym>PF</acronym> und &man.pflog.4; beim Systemstart:</para> + <para>All diese Punkte stellen Herausforderungen dar, noch + bevor die Client- oder Server-Software auf potenzielle + Sicherheitslücken überprüft wurde. Es existieren aber auch + sichere Alternativen für die Dateiübertragung, wie + &man.sftp.1; oder &man.scp.1;, wo die Authentifizierung und + die Datenübertragung über eine verschlüsselte Verbindung + erfolgt.</para> + + <para>Für Situationen, in denen <acronym>FTP</acronym> + erforderlich ist, kann <application>PF</application> den + <acronym>FTP</acronym>-Datenverkehr an ein kleines + Proxy-Programm namens &man.ftp-proxy.8; weiterleiten. + Dieses Programm ist im Basissystem von &os; enthalten. Die + Aufgabe des Proxies ist das dynamische Einfügen und + Entfernen von Regeln im Regelsatz. Dies wird durch den + Einsatz von Ankern erreicht, damit der + <acronym>FTP</acronym>-Verkehr korrekt verarbeitet werden + kann.</para> + + <para>Fügen Sie folgende Zeilen in + <filename>/etc/rc.conf</filename> ein, um den Proxy zu + aktivieren:</para> + + <programlisting>ftpproxy_enable="YES"</programlisting> + + <para>Danach kann der Proxy mit <command>service ftp-proxy + start</command> gestartet werden.</para> + + <para>Für die Grundkonfiguration müssen drei weitere Einträge + in <filename>/etc/pf.conf</filename> hinzugefügt werden. + Zunächst werden die Anker hinzugefügt, die der Proxy für die + <acronym>FTP</acronym>-Sitzungen verwendet:</para> + + <programlisting>nat-anchor "ftp-proxy/*" +rdr-anchor "ftp-proxy/*"</programlisting> + + <para>Dann wird eine <literal>pass</literal>-Regel benötigt, + damit der <acronym>FTP</acronym>-Datenverkehr durch den + Proxy geleitet werden kann.</para> + + <para>Die Regeln für Umleitung und <acronym>NAT</acronym> + müssen vor den eigentlichen Filterregeln definiert werden. + Fügen Sie diese <literal>rdr</literal>-Regel unmittelbar + nach der <acronym>NAT</acronym>-Regel ein:</para> + + <programlisting>rdr pass on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021</programlisting> + + <para>Zum Schluss muss der umgeleitete Verkehr die Firewall + passieren dürfen:</para> + + <programlisting>pass out proto tcp from $proxy to any port ftp</programlisting> + + <para><literal>$poxy</literal> enthält die Adresse, an dem der + Proxy-Daemon gebunden ist.</para> + + <para>Speichern Sie <filename>/etc/pf.conf</filename> und + laden Sie die Regeln neu. Prüfen Sie von einem Client, ob + die <acronym>FTP</acronym>-Verbindungen + funktionieren:</para> + + <screen>&prompt.root; <userinput>pfctl -f /etc/pf.conf</userinput></screen> + + <para>Dieses Beispiel umfasst eine Grundkonfiguration, in der + die Rechner im lokalen Netzwerk Zugriff auf entfernte + <acronym>FTP</acronym>-Server benötigen. Diese + Konfiguration sollte mit den meisten + <acronym>FTP</acronym>-Clients und -Servern gut + funktionieren. Das Verhalten von &man.ftp-proxy.8; kann + durch diverse Optionen in <literal>ftpproxy_flags</literal> + beeinflusst werden. Einige Clients und Server haben + bestimmte Marotten, die bei der Konfiguration berücksichtigt + werden müssen. Es kann zum Beispiel notwendig sein, den + <acronym>FTP</acronym>-Datenverkehr für den Proxy einer + bestimmten Warteschlange zuzuweisen.</para> + + <para>Es besteht auch die Möglichkeit einen + <acronym>FTP</acronym>-Server mit + <application>PF</application> und &man.ftp-proxy.8; zu + schützen. Konfigurieren Sie einen separaten + <command>ftp-proxy</command> mit <option>-R</option> für den + Reverse-Modus auf einem separaten Port und einer eigenen + Umleitungsregel.</para> + </sect3> - <programlisting>pf_enable="YES" # PF aktivieren (Modul, wenn nötig, aktivieren) -pf_rules="/etc/pf.conf" # Datei mit Regeldefinitionen für pf -pf_flags="" # zusätzliche Parameter für den Start von pfctl -pflog_enable="YES" # starte pflogd(8) -pflog_logfile="/var/log/pflog" # wo soll pflogd die Protokolldatei speichern -pflog_flags="" # zusätzliche Parameter für den Start von pflogd</programlisting> + <sect3 xml:id="pftut-icmp"> + <title><acronym>ICMP</acronym> verwalten</title> - <para>Wenn Sie ein lokales Netzwerk hinter dieser Firewall betreiben - und Pakete für dessen Rechner weiterleiten oder NAT verwenden - wollen, benötigen Sie zusätzlich die folgende Option:</para> + <para>Viele Werkzeuge zur Fehlerbehebung in + <acronym>TCP/IP</acronym>-Netzwerken verlassen sich auf das + <foreignphrase>Internet Control Message + Protocol</foreignphrase> (<acronym>ICMP</acronym>), das + speziell für diese Zwecke entwickelt wurde.</para> + + <para>Das <acronym>ICMP</acronym>-Protokoll sendet und + empfängt Kontrollnachrichten zwischen Rechnern und Gateways, + hauptsächlich um ungewöhnliche Bedingungen auf dem Weg zum + Zielrechner zu berichten. Router verwenden + <acronym>ICMP</acronym> um Paketgrößen und andere + Übertragungsparameter zu ermitteln. Dieser Prozess ist auch + als <emphasis>Path <acronym>MTU</acronym> + Discovery</emphasis> bekannt.</para> + + <para>Aus der Sicht einer Firewall sind einige + <acronym>ICMP</acronym>-Kontrollnachrichten anfällig für + bekannte Angriffsmethoden. Zwar ist die Fehlerbehebung + einfacher, wenn alle <acronym>ICMP</acronym>-Pakete + bedingungslos durch gelassen werden, aber dass macht es auch + für Angreifer leichter, Informationen über das Netzwerk zu + extrahieren. Aus diesen Gründen ist die folgende Regel nicht + optimal:</para> + + <programlisting>pass inet proto icmp from any to any</programlisting> + + <para>Eine Lösung besteht darin, nur den + <acronym>ICMP</acronym>-Verkehr aus dem lokalen Netz zu + akzeptieren, während <acronym>ICMP</acronym>-Pakete von + außerhalb des Netzwerks verworfen werden:</para> + + <programlisting>pass inet proto icmp from $localnet to any keep state +pass inet proto icmp from any to $ext_if keep state</programlisting> + + <para>Es stehen noch weitere Optionen zur Verfügung, die die + Flexibilität von <application>PF</application> + demonstrieren. Anstatt beispielsweise alle + <acronym>ICMP</acronym>-Nachrichten zu erlauben, kann man + die Nachrichten angeben, die von &man.ping.8; und + &man.traceroute.8; verwendet werden. Beginnen Sie damit, + ein Makro für diese Art von Nachrichten zu + definieren:</para> + + <programlisting>icmp_types = "echoreq"</programlisting> + + <para>Erstellen Sie dann eine Regel, die das eben erstellte + Makro benutzt:</para> + + <programlisting>pass inet proto icmp all icmp-type $icmp_types keep state</programlisting> + + <para>Wenn weitere Arten von + <acronym>ICMP</acronym>-Nachrichten benötigt werden, kann + die Liste <literal>icmp_types</literal> einfach erweitert + werden. Geben Sie <command>more + /usr/src/contrib/pf/pfctl/pfctl_parser.c</command> ein, um + eine Liste der von <application>PF</application> + unterstützten <acronym>ICMP</acronym>-Nachrichten zu sehen. + Die Webseite <link + xlink:href="http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml"> + http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml</link> + enthält eine Erklärung für jeden Nachrichtentyp.</para> + + <para>Da &unix; <command>traceroute</command> in der + Voreinstellung <acronym>UDP</acronym> verwendet, wird eine + weitere Regel benötigt:</para> + + <programlisting># allow out the default range for traceroute(8): +pass out on $ext_if inet proto udp from any to any port 33433 >< 33626 keep state</programlisting> + + <para>Da <command>TRACERT.EXE</command> unter + µsoft.windows;-Systemen <acronym>ICMP</acronym> Echo + Request Meldungen verwendet, ist nur die erste Regel + notwendig um Traces für solche Systeme zu ermöglichen. + &unix; <command>traceroute</command> kann aber auch andere + Protokolle verwenden, zum Beispiel <acronym>ICMP</acronym> + Echo Request, wenn der Schalter <option>-I</option> benutzt + wird. Details finden Sie in &man.traceroute.8;.</para> + + <sect4 xml:id="pftut-pathmtudisc"> + <title>Path <acronym>MTU</acronym> Discovery</title> + + <para>Internet-Protokolle sind so ausgelegt, dass sie + geräteunabhängig sind. Eine Folge davon ist, dass die + optimale Paketgröße nicht immer zuverlässig vorhergesagt + werden kann. Das größte Hindernis ist hier die + <emphasis>Maximum Transmission Unit</emphasis> + (<literal>MTU</literal>), welche die Obergrenze für die + Paketgröße festlegt. Die <acronym>MTU</acronym> für die + Schnittstelle des Systems können Sie sich mit + <command>ifconfig</command> anzeigen lassen.</para> + + <para><acronym>TCP/IP</acronym> benutzt ein Verfahren, das + als <foreignphrase>path MTU discovery</foreignphrase> + bekannt ist, um die korrekte Paketgröße für eine + Verbindung zu bestimmen. Dieses Verfahren sendet Pakete + unterschiedlicher Größe mit dem Flag <quote>do not + fragment</quote> und erwartet ein + <acronym>ICMP</acronym>-Antwortpaket vom Typ + <quote>type 3, code 4</quote>, wenn die Obergrenze + erreicht worden ist. Typ 3 bedeutet <quote>Ziel nicht + erreichbar</quote> und Code 4 ist die Abkürzung für + <quote>Fragmentierung nötig, aber Do-not-Fragment Flag ist + gesetzt</quote>. Um <foreignphrase>path MTU + discovery</foreignphrase> zu erlauben und damit + Verbindungen zu anderen <acronym>MTU</acronym>s zu + unterstützen, fügen Sie dem Makro + <literal>icmp_types</literal> den Typ <literal>destination + unreachable</literal> hinzu:</para> + + <programlisting>icmp_types = "{ echoreq, unreach }"</programlisting> + + <para>Da die <literal>pass</literal>-Regel bereits das Makro + verwendet, braucht es nicht geändert werden um den neuen + <acronym>ICMP</acronym>-Typ zu unterstützen:</para> + + <programlisting>pass inet proto icmp all icmp-type $icmp_types keep state</programlisting> + + <para><application>PF</application> kann alle Variationen + von <acronym>ICMP</acronym>-Typen und Codes filtern. Eine + Liste der verfügbaren Typen und Codes ist in &man.icmp.4; + und &man.icmp6.4; dokumentiert.</para> + </sect4> + </sect3> - <programlisting>gateway_enable="YES" # LAN Gateway aktivieren</programlisting> - </sect2> + <sect3 xml:id="pftut-tables"> + <title>Tabellen benutzen</title> - <sect2> - <title>Filterregeln erstellen</title> + <para>Manchmal sind bestimmte Daten für die Filterung und + Weiterleitung interessant, jedoch wäre eine Definition einer + solchen Filterregel für einen Regelsatz viel zu lang. + <application>PF</application> unterstützt die Verwendung von + Tabellen. Dies sind definierte Listen, die verändert werden + können, ohne den gesamten Regelsatz neu laden zu müssen. + Zudem können diese Listen sehr schnell durchsucht werden. + Tabellennamen sind immer in <literal>< ></literal> + eingeschlossen und sehen wie folgt aus:</para> + + <programlisting>table <clients> { 192.168.2.0/24, !192.168.2.5 }</programlisting> + + <para>In diesem Beispiel ist das Netzwerk + <literal>192.168.2.0/24</literal> Teil der Tabelle. + <literal>192.168.2.5</literal> wurde im dem Operator + <literal>!</literal> ausgeschlossen und ist somit nicht Teil + der Tabelle. Es ist auch möglich Tabellen aus Dateien zu + laden, wo jeder Eintrag in einer separaten Zeile steht. + Dieses Beispiel verwendet dazu die Datei + <filename>/etc/clients</filename>:</para> + + <programlisting>192.168.2.0/24 +!192.168.2.5</programlisting> + *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606071122.u57BMst3033802>