Changeset View
Changeset View
Standalone View
Standalone View
firewalls/chapter.xml
- This file uses an unknown character encoding.
Context not available. | |||||
</sect1> | </sect1> | ||||
<sect1 xml:id="firewalls-pf"> | <sect1 xml:id="firewalls-pf"> | ||||
<info><title>Paket Filter (PF) von OpenBSD und | <info> | ||||
<acronym>ALTQ</acronym></title> | <title>PF</title> | ||||
<authorgroup> | <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> | </authorgroup> | ||||
</info> | </info> | ||||
<indexterm> | <indexterm> | ||||
<primary>firewall</primary> | <primary>firewall</primary> | ||||
Context not available. | |||||
<secondary>PF</secondary> | <secondary>PF</secondary> | ||||
</indexterm> | </indexterm> | ||||
<para>Im Juli 2003 wurde <acronym>PF</acronym>, die | <para>In &os; 5.3 wurde <application>PF</application> von | ||||
Standard-Firewall von OpenBSD, nach &os; portiert und in die | OpenBSD in das Basissystem integriert. Bei | ||||
&os;-Ports-Sammlung aufgenommen. 2004 war <acronym>PF</acronym> in | <application>PF</application> handelt es sich um eine komplette, | ||||
&os; 5.3 Teil des Basissystems. Bei <acronym>PF</acronym> | voll ausgestattete Firewall, die optional auch | ||||
handelt es sich um eine komplette, vollausgestattete Firewall, | <application>ALTQ</application> (Alternatives Queuing) | ||||
die optional auch <acronym>ALTQ</acronym> (Alternatives | unterstützt. <application>ALTQ</application> stellt | ||||
Queuing) unterstützt. <acronym>ALTQ</acronym> bietet Ihnen | |||||
<foreignphrase>Quality of Service</foreignphrase> | <foreignphrase>Quality of Service</foreignphrase> | ||||
(<acronym>QoS</acronym>)-Bandbreitenformung.</para> | (<acronym>QoS</acronym>) zur Verfügung.</para> | ||||
<para>Das OpenBSD-Projekt leistet bereits hervorragende | <para>Das OpenBSD-Projekt pflegt die maßgebliche Referenz von | ||||
Dokumentationsarbeit mit der <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>. Aus diesem Grund | <application>PF</application> in der <link | ||||
konzentriert sich dieser Handbuchabschnitt nur auf diejenigen | xlink:href="http://www.openbsd.org/faq/pf">PF FAQ</link>. | ||||
Besonderheiten von <acronym>PF</acronym>, die &os; betreffen, sowie ein | Peter Hansteen betreut ein sehr ausführliches | ||||
paar allgemeine Informationen hinsichtlich der Verwendung. Genauere | <application>PF</application>-Tutorial unter <link | ||||
Informationen zum Einsatz erhalten Sie in der <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>.</para> | xlink:href="http://home.nuug.no/~peter/pf/"> | ||||
http://home.nuug.no/~peter/pf/</link>.</para> | |||||
<para>Weitere Informationen zu <acronym>PF</acronym> für &os; finden | <warning> | ||||
Sie unter <uri xlink:href="http://pf4freebsd.love2party.net/">http://pf4freebsd.love2party.net/</uri>.</para> | <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> | <sect2> | ||||
<title>Verwendung der PF-Kernelmodule</title> | <title><application>PF</application> aktivieren</title> | ||||
<para>Um die PF Kernel Module zu laden, fügen Sie folgende | <para>Damit <application>PF</application> benutzt werden kann, | ||||
Zeile in ihre <filename>/etc/rc.conf</filename> ein:</para> | 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>Beginnen Sie mit folgender Zeile in | |||||
<filename>/etc/rc.conf</filename>:</para> | |||||
<programlisting>pf_enable="YES"</programlisting> | <programlisting>pf_enable="YES"</programlisting> | ||||
<para>Danach starten Sie das Startup Script um die Module | <para>&man.pfctl.8; beschreibt zusätzliche Optionen, die beim | ||||
zu laden:</para> | 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ötigen Optionen zwischen die Anführungszeichen:</para> | |||||
bcr: s/benötigen/benötigten/ | |||||
<screen>&prompt.root; <userinput>/etc/rc.d/pf start</userinput></screen> | <programlisting>pf_flags="" # additional flags for pfctl startup</programlisting> | ||||
<para>Das PF Modul wird nicht geladen, falls es die Ruleset | <para><application>PF</application> kann nicht gestartet werden, | ||||
Konfigurationsdatei nicht findet. Standardmässig befindet | wenn es seine Konfigurationsdatei nicht findet. In der | ||||
sich diese Datei in <filename>/etc/pf.conf</filename>. Falls das | Voreinstellung existiert bereits ein Regelsatz namens | ||||
PF Ruleset sich an einem anderen Platz befindet, können Sie das | <filename>/etc/pf.conf</filename>. Wenn bereits ein Regelsatz | ||||
durch Hinzufügen einer Zeile ähnlich der folgenden, in | an anderer Stelle gespeichert wurde, fügen Sie in | ||||
ihrer <filename>/etc/rc.conf</filename> ändern:</para> | <filename>/etc/rc.conf</filename> einen Eintrag mit dem | ||||
vollständigen Pfad zur Datei ein:</para> | |||||
<programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting> | <programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting> | ||||
<note> | <para>Protokollierungsfunktionen für | ||||
<para>Ein Beispiel für die Datei <filename>pf.conf</filename> | <application>PF</application> werden von &man.pflog.4; zur | ||||
finden Sie im Verzeichnis <filename>/usr/share/examples/pf/</filename>.</para> | Verfügung gestellt. Fügen Sie folgende Zeile in | ||||
</note> | <filename>/etc/rc.conf</filename> ein, um diese Funktion zu | ||||
aktivieren:</para> | |||||
<para>Das <acronym>PF</acronym>-Modul kann auch manuell über die | <programlisting>pflog_enable="YES"</programlisting> | ||||
Kommandozeile geladen werden:</para> | |||||
<screen>&prompt.root; <userinput>kldload pf.ko</userinput></screen> | <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> | |||||
<para>Protokollierungsfunktionen für PF werden durch das Modul | <programlisting>pflog_logfile="/var/log/pflog" # where pflogd should store the logfile | ||||
<literal>pflog.ko</literal> zur Verfügung gestellt und | pflog_flags="" # additional flags for pflogd startup</programlisting> | ||||
können durch folgenden Eintrag in der | |||||
<filename>/etc/rc.conf</filename> aktiviert werden:</para> | |||||
<programlisting>pflog_enable="YES"</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> | |||||
<para>Danach starten Sie das Startup Script, um das Modul | <programlisting>gateway_enable="YES" # Enable as LAN gateway</programlisting> | ||||
zu laden:</para> | |||||
<screen>&prompt.root; <userinput>/etc/rc.d/pflog start</userinput></screen> | <para>Nachdem die Änderungen gespeichert wurden, kann | ||||
<application>PF</application> mit Unterstützung für | |||||
Protokollierung gestartet werden:</para> | |||||
<para>Falls Sie noch weitere Features für | <screen>&prompt.root; <userinput>service pf start</userinput> | ||||
<acronym>PF</acronym> benötigen, müssen Sie diese in den | &prompt.root; <userinput>service pflog start</userinput></screen> | ||||
Kernel einbauen.</para> | |||||
</sect2> | |||||
<sect2> | <!-- | ||||
<title>PF Kernel-Optionen</title> | 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> | <indexterm>$ | ||||
<primary>Kerneloptionen</primary> | <primary>kernel options</primary> | ||||
<secondary>device pf</secondary> | |||||
<secondary>device pf</secondary> | |||||
</indexterm> | </indexterm> | ||||
<indexterm> | <indexterm> | ||||
<primary>Kerneloptionen</primary> | <primary>kernel options</primary> | ||||
<secondary>device pflog</secondary> | |||||
<secondary>device pflog</secondary> | |||||
</indexterm> | </indexterm> | ||||
<indexterm> | <indexterm> | ||||
<primary>Kerneloptionen</primary> | <primary>kernel options</primary> | ||||
<secondary>device pfsync</secondary> | |||||
<secondary>device pfsync</secondary> | |||||
</indexterm> | </indexterm> | ||||
<para>Es ist nicht zwingend nötig, dass Sie | <note> | ||||
<acronym>PF</acronym>-Unterstützung in den &os;-Kernel | <para>While it is not necessary to compile | ||||
kompilieren. Sie werden dies tun müssen, um eine von PFs | <application>PF</application> support into the &os; kernel, | ||||
fortgeschritteneren Eigenschaften nutzen zu können, die nicht als | some advanced features are not included, namely &man.pfsync.4;, which is a | ||||
Kernelmodul verfügbar ist. Genauer handelt es sich dabei um | pseudo-device that exposes certain changes to the state table | ||||
&man.pfsync.4;, ein Pseudo-Gerät, welches bestimmte | used by <application>PF</application>. It can be paired with | ||||
Änderungen der <acronym>PF</acronym>-Zustandstabelle offenlegt. | &man.carp.4; to create failover firewalls using | ||||
Es kann mit &man.carp.4; kombiniert werden, um ausfallsichere | <application>PF</application>. More information on | ||||
Firewalls mit <acronym>PF</acronym> zu realisieren. Weitere | <acronym>CARP</acronym> can be found in <xref linkend="carp"/>.</para> | ||||
Informationen zu <acronym>CARP</acronym> erhalten Sie in | |||||
<xref linkend="carp"/> des Handbuchs.</para> | |||||
<para>Die Kernelkonfigurationsoptionen von <acronym>PF</acronym> befinden | <para>The following <application>PF</application> kernel options | ||||
sich in <filename>/usr/src/sys/conf/NOTES</filename> und sind im | are available:</para> | ||||
Folgenden wiedergegeben:</para> | |||||
<programlisting>device pf | <programlisting>device pf | ||||
device pflog | device pflog | ||||
device pfsync</programlisting> | device pfsync</programlisting> | ||||
<para>Die Option <literal>device pf</literal> aktiviert die | <para>where:</para> | ||||
Unterstützung für die <quote>Packet | |||||
Filter</quote>-Firewall (&man.pf.4;).</para> | |||||
<para>Die Option <literal>device pflog</literal> aktiviert das optionale | <para><literal>device pf</literal> enables PF support.</para> | ||||
&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> | |||||
<para>Die Option <literal>device pfsync</literal> aktiviert das optionale | <para><literal>device pflog</literal> enables the optional | ||||
&man.pfsync.4;-Pseudonetzwerkgerät für die | &man.pflog.4; pseudo network device which can be used to log | ||||
Überwachung von <quote>Statusänderungen</quote>.</para> | >>>>>>>> traffic to a &man.bpf.4; descriptor. The &man.pflogd.8; | ||||
</sect2> | >>>>>>>> daemon can then be used to store the logging information to | ||||
>>>>>>>> disk.</para> | |||||
<sect2> | <para><literal>device pfsync</literal> enables the optional | ||||
<title>Verfügbare rc.conf-Optionen</title> | &man.pfsync.4; pseudo-network device that is used to monitor | ||||
<quote>state changes</quote>.</para> | |||||
</note> | |||||
--> | |||||
<para>Die folgenden &man.rc.conf.5;-Einträge konfigurieren | <para>In der Voreinstellung liest <application>PF</application> | ||||
<acronym>PF</acronym> und &man.pflog.4; beim Systemstart:</para> | 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> | |||||
<programlisting>pf_enable="YES" # PF aktivieren (Modul, wenn nötig, aktivieren) | <para>Zur Steuerung von <application>PF</application> wird | ||||
pf_rules="/etc/pf.conf" # Datei mit Regeldefinitionen für pf | <command>pfctl</command> verwendet. <xref linkend="pfctl"/> | ||||
pf_flags="" # zusätzliche Parameter für den Start von pfctl | fasst einige nützliche Optionen für diesen Befehl zusammen. | ||||
pflog_enable="YES" # starte pflogd(8) | Eine Beschreibung aller verfügbaren Optionen finden Sie in | ||||
pflog_logfile="/var/log/pflog" # wo soll pflogd die Protokolldatei speichern | &man.pfctl.8;.</para> | ||||
pflog_flags="" # zusätzliche Parameter für den Start von pflogd</programlisting> | |||||
<para>Wenn Sie ein lokales Netzwerk hinter dieser Firewall betreiben | <table xml:id="pfctl" frame="none" pgwide="1"> | ||||
und Pakete für dessen Rechner weiterleiten oder NAT verwenden | <title>Nützliche <command>pfctl</command> Optionen</title> | ||||
wollen, benötigen Sie zusätzlich die folgende Option:</para> | |||||
<programlisting>gateway_enable="YES" # LAN Gateway aktivieren</programlisting> | <tgroup cols="2"> | ||||
</sect2> | <thead> | ||||
<row> | |||||
<entry>Kommando</entry> | |||||
<entry>Aufgabe</entry> | |||||
</row> | |||||
</thead> | |||||
<sect2> | <tbody> | ||||
<title>Filterregeln erstellen</title> | <row> | ||||
<entry><command>pfctl -e</command></entry> | |||||
<entry><application>PF</application> aktivieren</entry> | |||||
</row> | |||||
<para><acronym>PF</acronym> liest seine konfigurierten Regeln aus | <row> | ||||
&man.pf.conf.5; (standardmässig <filename>/etc/pf.conf</filename>) | <entry><command>pfctl -d</command></entry> | ||||
und modifiziert, verwirft oder lässt Pakete passieren anhand der | <entry><application>PF</application> | ||||
Regeln oder Definitionen, die in dieser Datei gespeichert sind. &os; | deaktivieren</entry> | ||||
enthält dazu nach der Installation mehrere Beispieldateien, die | </row> | ||||
in <filename>/usr/share/examples/pf/</filename> abgelegt sind. | |||||
Für eine ausführliche Behandlung des | |||||
<acronym>PF</acronym>-Regelwerks lesen Sie bitte die <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link>.</para> | |||||
<warning> | <row> | ||||
<para>Beim Lesen der <link xlink:href="http://www.openbsd.org/faq/pf/">PF FAQ</link> wollten Sie | <entry><command>pfctl -F all -f | ||||
darauf achten, dass verschiedene Versionen von &os; auch | /etc/pf.conf</command></entry> | ||||
unterschiedliche Versionen von PF enthalten. | <entry>Alle Filterregeln zurücksetzen | ||||
&os; 8.<replaceable>X</replaceable> (und älter) | (<acronym>NAT</acronym>, Filter, Zustandstabelle) und | ||||
&os;-Versionen benutzen <acronym>PF</acronym> aus OpenBSD 4.1. | <filename>/etc/pf.conf</filename> erneut | ||||
&os; 9.<replaceable>X</replaceable> (und neuer) benutzen | einlesen.</entry> | ||||
hingegen <acronym>PF</acronym> aus OpenBSD 4.5.</para> | </row> | ||||
</warning> | |||||
<para>Die &a.pf; ist eine erste Anlaufstelle für | <row> | ||||
Fragen zur Konfiguration und dem Einsatz der <acronym>PF</acronym> | <entry><command>pfctl -s [ rules | nat | | ||||
Firewall. Vergessen Sie nicht, vorher die Mailinglistenarchive zu | states ]</command></entry> | ||||
durchsuchen, bevor Sie dort eine Frage stellen!</para> | <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> | ||||
<sect2> | <sect2> | ||||
<title>Arbeiten mit PF</title> | <title><application>ALTQ</application> aktivieren</title> | ||||
<para>Benutzen Sie &man.pfctl.8;, um <acronym>PF</acronym> zu steuern. | <para>Unter &os; kann <application>ALTQ</application> zusammen | ||||
Unten finden Sie ein paar nützliche Befehle (lesen Sie auch die | mit <application>PF</application> benutzt werden, um Quality | ||||
Manualpage zu &man.pfctl.8;, um alle verfügbaren Optionen | of Service (<acronym>QoS</acronym>) bereitzustellen. Sobald | ||||
nachzuschlagen):</para> | <application>ALTQ</application> aktiviert ist, können | ||||
Warteschlangen definiert werden, mit denen Sie die Priorität | |||||
für ausgehende Pakete festlegen können.</para> | |||||
<informaltable frame="none" pgwide="1"> | <para>Bevor Sie <application>ALTQ</application> aktivieren, | ||||
<tgroup cols="2"> | sollten Sie &man.altq.4; lesen und sicherstellen, das der | ||||
<thead> | Treiber der Netzwerkkarte diese Funktion unterstützt.</para> | ||||
<row> | |||||
<entry>Befehl</entry> | |||||
<entry>Zweck</entry> | |||||
</row> | |||||
</thead> | |||||
<tbody> | <para><application>ALTQ</application> steht nicht als ladbares | ||||
<row> | Kernelmodul zur Verfügung. Wenn die Netzwerkkarte des Systems | ||||
<entry><command>pfctl -e</command></entry> | <application>ALTQ</application> unterstützt, erstellen Sie | ||||
<entry>PF aktivieren</entry> | nach den Anweisungen in <xref linkend="kernelconfig"/> einen | ||||
</row> | 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> | |||||
<row> | <programlisting>options ALTQ | ||||
<entry><command>pfctl -d</command></entry> | options ALTQ_CBQ # Class Based Queuing (CBQ) | ||||
<entry>PF deaktivieren</entry> | options ALTQ_RED # Random Early Detection (RED) | ||||
</row> | options ALTQ_RIO # RED In/Out | ||||
options ALTQ_HFSC # Hierarchical Packet Schedule (HFSC) | |||||
options ALTQ_PRIQ # Priority Queuing (PRIQ)</programlisting> | |||||
<row> | <para>Die folgenden Algorithmen stehen zur Verfügung:</para> | ||||
<entry><command>pfctl -F all -f /etc/pf.conf</command></entry> | |||||
<entry>Alle Filterregeln zurücksetzen (NAT, Filter, Zustand, | |||||
Tabelle, etc.) und erneut aus der Datei | |||||
<filename>/etc/pf.conf</filename> auslesen</entry> | |||||
</row> | |||||
<row> | <variablelist> | ||||
<entry><command>pfctl -s [ rules | nat | | <varlistentry> | ||||
states ]</command></entry> | <term>CBQ</term> | ||||
<entry>Bericht über die Filterregeln, NAT-Regeln, oder | <listitem> | ||||
Zustandstabellen</entry> | <para>Class Based Queuing (<acronym>CBQ</acronym>) erlaubt | ||||
</row> | 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> | |||||
<row> | <varlistentry> | ||||
<entry><command>pfctl -vnf /etc/pf.conf</command></entry> | <term>RED</term> | ||||
<entry>überprüft <filename>/etc/pf.conf</filename> auf | <listitem> | ||||
Fehler, lädt aber das Regelwerk nicht neu</entry> | <para>Random Early Detection (<acronym>RED</acronym>) wird | ||||
</row> | eingesetzt, um eine Überlastung des Netzwerks zu | ||||
</tbody> | vermeiden. Dazu ermittelt <acronym>RED</acronym> die | ||||
</tgroup> | Größe der Warteschlange und vergleicht diesen Wert mit | ||||
</informaltable> | 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> | |||||
<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> | |||||
<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> | |||||
<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>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> | </sect2> | ||||
<sect2> | <sect2 xml:id="pf-tutorial"> | ||||
<title><acronym>ALTQ</acronym> aktivieren</title> | <info> | ||||
<title><application>PF</application> Regelsätze</title> | |||||
<para><acronym>ALTQ</acronym> muss vor der Verwendung in den | <authorgroup> | ||||
&os;-Kernel kompiliert werden. Beachten Sie, dass | <author> | ||||
<acronym>ALTQ</acronym> nicht von allen verfügbaren | <personname> | ||||
Netzwerkkartentreibern unterstützt wird. Sehen Sie daher | <firstname>Peter</firstname> | ||||
zuerst in &man.altq.4; nach, ob Ihre Netzwerkkarte diese | <surname>Hansteen</surname> | ||||
Funktion unter Ihrer &os;-Version unterstützt.</para> | <othername>N. M.</othername> | ||||
</personname> | |||||
<contrib>Beigetragen von </contrib> | |||||
</author> | |||||
</authorgroup> | |||||
</info> | |||||
<para>Die folgenden Kerneloptionen aktivieren <acronym>ALTQ</acronym> | <para>Dieser Abschnitt beschreibt die Erstellung von angepassten | ||||
sowie alle Zusatzfunktionen:</para> | 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> | |||||
<programlisting>options ALTQ | <para>Der einfachste Regelsatz gilt für einen Rechner, der | ||||
options ALTQ_CBQ # Class Bases Queuing (CBQ) | keine Dienste anbietet und Zugriff auf das Internet haben | ||||
options ALTQ_RED # Random Early Detection (RED) | soll. Für diesen minimalen Regelsatz wird | ||||
options ALTQ_RIO # RED In/Out | <filename>/etc/pf.conf</filename> wie folgt | ||||
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) | konfiguriert:</para> | ||||
options ALTQ_PRIQ # Priority Queuing (PRIQ) | |||||
options ALTQ_NOPCC # Wird von SMP benötigt</programlisting> | |||||
<para><literal>options ALTQ</literal> aktiviert das | <programlisting>block in all | ||||
<acronym>ALTQ</acronym>-Framework.</para> | pass out all keep state</programlisting> | ||||
<para><literal>options ALTQ_CBQ</literal> aktiviert das | <para>Die erste Regel blockiert jeglichen eingehenden | ||||
<emphasis>Class Based Queuing</emphasis> (<acronym>CBQ</acronym>). | Datenverkehr. Die zweite Regel erlaubt ausgehende | ||||
<acronym>CBQ</acronym> erlaubt es, die Bandbreite einer Verbindung in | Verbindungen von diesem Rechner, während die | ||||
verschiedene Klassen oder Warteschlangen zu unterteilen, um die | Zustandsinformationen dieser Verbindungen gespeichert werden. | ||||
Priorität von Datenpaketen basierend auf Filterregeln zu | Diese Zustandsinformationen machen es möglich, den | ||||
ändern.</para> | Antwortverkehr für diese Verbindungen zu erlauben. Der | ||||
Regelsatz wird mit dem folgenden Befehl geladen:</para> | |||||
<para><literal>options ALTQ_RED</literal> aktiviert | <screen>&prompt.root; <userinput>pfctl -e ; pfctl -f /etc/pf.conf</userinput></screen> | ||||
<emphasis>Random Early Detection</emphasis> | |||||
(<acronym>RED</acronym>). <acronym>RED</acronym> wird | |||||
zur Vermeidung einer Netzwerkverstopfung verwendet. 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 verworfen. Getreu seinem Namen | |||||
verwirft <acronym>RED</acronym> Pakete unterschiedlicher | |||||
Verbindungen nach dem Zufallsprinzip.</para> | |||||
<para><literal>options ALTQ_RIO</literal> aktiviert | <para>Neben den Zustandsinformationen verfügt | ||||
<emphasis>Random Early Detection In and Out</emphasis>.</para> | <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> | |||||
<para><literal>options ALTQ_HFSC</literal> aktiviert den | <programlisting>tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }" | ||||
<emphasis>Hierarchical Fair Service Curve</emphasis>-Paketplaner. | udp_services = "{ domain }"</programlisting> | ||||
Weitere Informationen zu <acronym>HFSC</acronym> finden Sie | |||||
unter <uri xlink:href="http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html">http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html</uri>.</para> | |||||
<para><literal>options ALTQ_PRIQ</literal> aktiviert | <para><application>PF</application> versteht sowohl Portnamen | ||||
<emphasis>Priority Queuing</emphasis> (<acronym>PRIQ</acronym>). | als auch Portnummern, solange die Namen in | ||||
<acronym>PRIQ</acronym> lässt Verkehr einer Warteschlange mit | <filename>/etc/services</filename> aufgeführt sind. Dieses | ||||
höherer Priorität zuerst durch.</para> | 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> | |||||
<para><literal>options ALTQ_NOPCC</literal> aktiviert die | <programlisting>tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }" | ||||
<acronym>SMP</acronym> Unterstützung von | udp_services = "{ domain }" | ||||
<acronym>ALTQ</acronym>. Diese Option ist nur auf | block all | ||||
<acronym>SMP</acronym>-System erforderlich.</para> | 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 | |||||
externen Schnittstelle <filename>tun0</filename> und nicht | |||||
bcrUnsubmitted Done Inline Actionss/externen/externe/ bcr: s/externen/externe/ | |||||
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> | |||||
<sect3 xml:id="pftut-ftp"> | |||||
<title>Einen <acronym>FTP</acronym>-Proxy einrichten</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>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> | |||||
<sect3 xml:id="pftut-icmp"> | |||||
<title><acronym>ICMP</acronym> verwalten</title> | |||||
<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> | |||||
<sect3 xml:id="pftut-tables"> | |||||
<title>Tabellen benutzen</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> | |||||
<para>Um sich auf diese Datei zu beziehen, definieren Sie die | |||||
Tabelle wie folgt:</para> | |||||
<programlisting>table <clients> persist file "/etc/clients"</programlisting> | |||||
<para>Sobald die Tabelle definiert ist, kann eine Filterregel | |||||
Bezug darauf nehmen:</para> | |||||
<programlisting>pass inet proto tcp from <clients> to any port $client_out flags S/SA keep state</programlisting> | |||||
<para>Die Inhalte einer Tabelle können mit | |||||
<command>pfctl</command> direkt verändert werden. Dieses | |||||
Beispiel fügt ein weiteres Netzwerk zur Tabelle | |||||
hinzu:</para> | |||||
<screen>&prompt.root; <userinput>pfctl -t clients -T add 192.168.1.0/16</userinput></screen> | |||||
<para>Beachten Sie, dass auf diese Weise vorgenommene | |||||
Änderungen direkt übernommen werden, jedoch bei einem | |||||
Neustart des Systems oder bei einem Stromausfall verloren | |||||
gehen. Um die Änderungen dauerhaft zu speichern, müssen sie | |||||
in der Definition der Tabelle oder in der Datei, auf die | |||||
sich die Tabelle bezieht, bearbeitet werden. Mit einem | |||||
&man.cron.8; Job und einem Befehl wie | |||||
<command>pfctl -t clients -T show >/etc/clients</command> | |||||
können Sie auch eine Kopie der Tabelle auf Platte speichern | |||||
und dann in regelmäßigen Abständen aktualisieren. | |||||
Alternativ kann <filename>/etc/clients</filename> auch mit | |||||
den Tabelleneinträgen, die sich aktuell im Speicher | |||||
befinden, aktualisiert werden.</para> | |||||
<screen>&prompt.root; <userinput>pfctl -t clients -T replace -f /etc/clients</userinput></screen> | |||||
</sect3> | |||||
<sect3 xml:id="pftut-overload"> | |||||
<title>Verwendung von Tabellen zum Schutz von | |||||
<acronym>SSH</acronym></title> | |||||
<para>Benutzer, die <acronym>SSH</acronym> auf einer externen | |||||
Schnittstelle ausführen, haben wahrscheinlich schon einmal | |||||
ähnliche Meldungen in den Protokolldateien gesehen:</para> | |||||
<programlisting>Sep 26 03:12:34 skapet sshd[25771]: Failed password for root from 200.72.41.31 port 40992 ssh2 | |||||
Sep 26 03:12:34 skapet sshd[5279]: Failed password for root from 200.72.41.31 port 40992 ssh2 | |||||
Sep 26 03:12:35 skapet sshd[5279]: Received disconnect from 200.72.41.31: 11: Bye Bye | |||||
Sep 26 03:12:44 skapet sshd[29635]: Invalid user admin from 200.72.41.31 | |||||
Sep 26 03:12:44 skapet sshd[24703]: input_userauth_request: invalid user admin | |||||
Sep 26 03:12:44 skapet sshd[24703]: Failed password for invalid user admin from 200.72.41.31 port 41484 ssh2</programlisting> | |||||
<para>Diese Meldungen deuten auf einen Brute-Force-Angriff | |||||
hin, bei dem ein Angreifer oder ein Programm versucht, | |||||
den Benutzernamen und das Passwort zu erraten, um Zugriff | |||||
auf das System zu bekommen.</para> | |||||
<para>Wenn der Zugriff über <acronym>SSH</acronym> für | |||||
berechtigte Benutzer erforderlich ist, kann eine Änderung | |||||
des Standard-Ports für <acronym>SSH</acronym> einen gewissen | |||||
Schutz bieten. Allerdings bietet | |||||
<application>PF</application> eine elegantere Lösung für | |||||
dieses Problem. <literal>pass</literal>-Regeln können | |||||
Einschränkungen für Dinge enthalten, die ein verbindender | |||||
Rechner tun kann. Bei einem Verstoß gegen diese | |||||
Einschränkungen kann dann dem betroffenen Rechner der | |||||
Zugriff teilweise oder ganz entzogen werden. Es ist sogar | |||||
möglich, alle bestehenden Verbindungen zu trennen, falls die | |||||
Grenze überschritten wird.</para> | |||||
<para>Um dies zu konfigurieren, erstellen Sie folgende Tabelle | |||||
im Regelsatz:</para> | |||||
<programlisting>table <bruteforce> persist</programlisting> | |||||
<para>Fügen Sie dann ziemlich am Anfang der Filterregeln | |||||
folgende Regeln hinzu, um die Brute-Force-Angriffe zu | |||||
blocken und gleichzeitig berechtigte Verbindungen zu | |||||
erlauben:</para> | |||||
<programlisting>block quick from <bruteforce> | |||||
pass inet proto tcp from any to $localnet port $tcp_services \ | |||||
flags S/SA keep state \ | |||||
(max-src-conn <replaceable>100</replaceable>, max-src-conn-rate <replaceable>15/5</replaceable>, \ | |||||
overload <bruteforce> flush global)</programlisting> | |||||
<para>Der Teil in Klammern definiert die Grenzwerte. Die | |||||
Zahlen sollten an die lokalen Anforderungen angepasst | |||||
werden. Die Zeilen können wie folgt interpretiert | |||||
werden:</para> | |||||
<para><literal>max-src-conn</literal> definiert die maximal | |||||
erlaubte Anzahl gleichzeitiger Verbindungen von einem | |||||
Rechner.</para> | |||||
<para><literal>max-src-conn-rate</literal> definiert die | |||||
maximal erlaubte Anzahl neuer Verbindungen eines einzelnen | |||||
Rechners (<replaceable>15</replaceable>) pro Anzahl von | |||||
Sekunden (<replaceable>5</replaceable>).</para> | |||||
<para><literal>overload <bruteforce></literal> bedeutet, | |||||
dass jeder Rechner, der diesen Grenzwert überschreitet, zur | |||||
Tabelle <literal>bruteforce</literal> hinzugefügt wird. | |||||
Diese Filterregel blockiert jeglichen Datenverkehr von | |||||
Adressen aus der Tabelle | |||||
<literal>bruteforce</literal>.</para> | |||||
<para><literal>flush global</literal> besagt, dass alle | |||||
(<literal>global</literal>) Verbindungen dieses Rechners | |||||
getrennt (<literal>flush</literal>) werden, wenn der | |||||
Grenzwert erreicht wird.</para> | |||||
<note> | |||||
<para>Diese Filterregeln helfen nicht bei langsamen | |||||
Brute-Force-Angriffen, wie sie in <link | |||||
xlink:href="http://home.nuug.no/~peter/hailmary2013/"> | |||||
http://home.nuug.no/~peter/hailmary2013/</link> | |||||
beschrieben sind.</para> | |||||
</note> | |||||
<para>Dieser Beispielregelsatz dient lediglich als | |||||
Illustration. Wenn Sie allgemein eine große Anzahl an | |||||
Verbindungen erlauben wollen, aber gleichzeitig | |||||
bei <acronym>SSH</acronym> etwas restriktiver vorgehen | |||||
möchten, können Sie die obige Regel ergänzen:</para> | |||||
<programlisting>pass quick proto { tcp, udp } from any to any port ssh \ | |||||
flags S/SA keep state \ | |||||
(max-src-conn 15, max-src-conn-rate 5/3, \ | |||||
overload <bruteforce> flush global)</programlisting> | |||||
<note> | |||||
<!-- XXX Overloaders == agressive Rechner --> | |||||
<title>Es ist möglicherweise nicht notwendig, alle | |||||
aggressiven Rechner zu blockieren</title> | |||||
<para>Es ist zu erwähnen, dass der | |||||
<literal>overlaod</literal>-Mechanismus eine allgemeine | |||||
Technik darstellt, die nicht auf <acronym>SSH</acronym> | |||||
beschränkt ist. Außerdem ist es nicht immer optimal, | |||||
Datenverkehr von aggressiven Rechnern zu | |||||
blockieren.</para> | |||||
<para>Eine <literal>overload</literal>-Regel kann | |||||
beispielsweise benutzt werden, um einen Mail- oder | |||||
Webserver zu schützen. Die | |||||
<literal>overload</literal>-Tabelle könnte dann in einer | |||||
Regel verwendet werden, um aggressive Rechner einer | |||||
Warteschlange mit geringerer Bandbreite zuzuweisen, oder | |||||
den Rechner auf eine bestimtme Webseite umzuleiten.</para> | |||||
</note> | |||||
<para>Im Laufe der Zeit werden die Tabellen durch die | |||||
<literal>overload</literal>-Regeln immer größer und belegen | |||||
immer mehr Speicher. Manchmal wird eine geblockte | |||||
<acronym>IP</acronym>-Adresse einem Rechner dynamisch | |||||
zugewiesen, der eigentlich berechtigt ist, mit den Rechnern | |||||
im lokalen Netzwerk zu kommunizieren.</para> | |||||
<para>Für solche Situationen bietet <command>pfctl</command> | |||||
die Möglichkeit, Tabelleneinträge auslaufen zu lassen. | |||||
Dieses Kommando würde beispielsweise Einträge aus der | |||||
Tabelle <literal><bruteforce></literal> löschen, | |||||
die seit <literal>86400</literal> Sekunden nicht mehr | |||||
referenziert wurden:</para> | |||||
<screen>&prompt.root; <userinput>pfctl -t bruteforce -T expire 86400</userinput></screen> | |||||
<para>Eine ähnliche Funktionalität bietet | |||||
<package>security/expiretable</package>, welches Einträge | |||||
entfernt, die für einen bestimmten Zeitraum nicht | |||||
referenziert wurden.</para> | |||||
<para>Nach der Installation kann | |||||
<application>expiretable</application> benutzt werden, um | |||||
Einträge aus der Tabelle | |||||
<literal><bruteforce></literal> nach einer bestimmten | |||||
Zeit zu entfernen. Dieses Beispiel entfernt alle Einträge, | |||||
die älter sind als 24 Stunden:</para> | |||||
<programlisting>/usr/local/sbin/expiretable -v -d -t 24h bruteforce</programlisting> | |||||
</sect3> | |||||
<sect3 xml:id="pftut-spamd"> | |||||
<title>Schutzt vor <acronym>SPAM</acronym></title> | |||||
<para>Im Gegensatz zum <application>spamd</application>-Daemon | |||||
von <application>spamassassin</application>, kann | |||||
<package>mail/spamd</package> zusammen mit | |||||
<application>PF</application> den <acronym>SPAM</acronym> | |||||
direkt an der Firewall abgewehren. Dieser | |||||
bcrUnsubmitted Done Inline Actionss/abgewehren/abwehren/ bcr: s/abgewehren/abwehren/ | |||||
<application>spamd</application> wird in | |||||
<application>PF</application> über einen Satz von | |||||
Umleitungen konfiguriert.</para> | |||||
<para>Spammer neigen dazu, eine große Anzahl von Nachrichten | |||||
zu versenden. Dabei nutzten Sie <acronym>SPAM</acronym> | |||||
bcrUnsubmitted Done Inline Actionsich würde zwischen "SPAM" und "freundliche" noch einen Bindestrich setzen. bcr: ich würde zwischen "SPAM" und "freundliche" noch einen Bindestrich setzen. | |||||
freundliche Netzwerke und gekaperte Rechner, welche dann | |||||
ziemlich schnell bei sogenannten | |||||
<foreignphrase>Blacklists</foreignphrase> gemeldet | |||||
werden.</para> | |||||
<para>Wenn eine <acronym>SMTP</acronym>-Verbindung von einer | |||||
Adresse in der Blacklist empfangen wird, präsentiert | |||||
<application>spamd</application> einen Banner und schaltet | |||||
sofort in einen Modus, in dem die Antworten auf den | |||||
<acronym>SMTP</acronym>-Verkehr jeweils ein Byte groß sind. | |||||
Diese Technik, die möglichst viel Zeit des Spammers | |||||
verschwenden soll, wird | |||||
<foreignphrase>Tarpitting</foreignphrase> genannt. Die | |||||
spezifische Implementierung, welche ein Byte | |||||
<acronym>SMTP</acronym>-Antworten verwendet, wird als | |||||
<foreignphrase>Stuttering</foreignphrase> bezeichnet.</para> | |||||
<para>Dieses Beispiel zeigt das grundlegende Verfahren zur | |||||
Konfiguration von <application>spamd</application> mit | |||||
automatisch aktualisierten Blacklists. Für weitere | |||||
Informationen lesen die Manualpages, die zusammen mit | |||||
<package>mail/spamd</package> installiert werden.</para> | |||||
<procedure> | |||||
<title>Konfiguration von | |||||
<application>spamd</application></title> | |||||
<step> | |||||
<para>Installieren Sie das Paket oder den Port | |||||
<package>mail/spamd</package>. Um | |||||
<application>spamd</application>'s Greylisting-Funktion | |||||
zu nutzen, muss &man.fdescfs.5; in | |||||
<filename>/dev/fd</filename> eingehängt werden. Fügen | |||||
Sie folgende Zeile in <filename>/etc/fstab</filename> | |||||
ein:</para> | |||||
<programlisting>fdescfs /dev/fd fdescfs rw 0 0</programlisting> | |||||
<para>Danach hängen Sie das Dateisystem ein:</para> | |||||
<screen>&prompt.root; <userinput>mount fdescfs</userinput></screen> | |||||
</step> | |||||
<step> | |||||
<para>Fügen Sie folgende Zeilen in den | |||||
<application>PF</application>-Regelsatz ein:</para> | |||||
<programlisting>table <spamd> persist | |||||
table <spamd-white> persist | |||||
rdr pass on $ext_if inet proto tcp from <spamd> to \ | |||||
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025 | |||||
rdr pass on $ext_if inet proto tcp from !<spamd-white> to \ | |||||
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025</programlisting> | |||||
<para>Die beiden Tabellen <literal><spamd></literal> | |||||
und <literal><spam-white></literal> sind von | |||||
großer Bedeutung. <acronym>SMTP</acronym>-Verkehr von | |||||
einer Adresse, die in <literal><spamd></literal> | |||||
aber nicht in <literal><spamd-white></literal> | |||||
ist, wird an den <application>spamd</application>-Daemon | |||||
auf Port 8025 umgeleitet.</para> | |||||
</step> | |||||
<step> | |||||
<para>Im nächsten Schritt wird | |||||
<application>spamd</application> in | |||||
<filename>/usr/local/etc/spamd.conf</filename> | |||||
konfiguriert und einige Parameter werden in | |||||
<filename>/etc/rc.conf</filename> hinzugefügt.</para> | |||||
<para>Die Installation von <package>mail/spamd</package> | |||||
enthält eine Beispielkonfiguration | |||||
(<filename>/usr/local/etc/spamd.conf.sample</filename>) | |||||
und eine Manualpage für <filename>spamd.conf</filename>. | |||||
Beziehen Sie sich für zusätzliche Konfigurationsoptionen | |||||
auf diese Dokumentation.</para> | |||||
<para>Die Konfigurationsdatei enthält einen Block, in dem | |||||
die <literal>all</literal>-Liste definiert ist, die | |||||
wiederum weitere Listen spezifiziert:</para> | |||||
<programlisting>all:\ | |||||
:traplist:whitelist:</programlisting> | |||||
<para>Dieser Eintrag fügt die gewünschten Blacklists, | |||||
getrennt durch einen Doppelpunkt (<literal>:</literal>), | |||||
hinzu. Um auch eine Whitelist zu verwenden, fügen Sie | |||||
den Namen unmittelbar hinter dem Namen der Blacklist | |||||
ein. Zum Beispiel: | |||||
<literal>:Blacklist:Whitelist:</literal>.</para> | |||||
<para>Danach folgt die Definition der verwendeten | |||||
Blacklist:</para> | |||||
<programlisting>traplist:\ | |||||
:black:\ | |||||
:msg="SPAM. Your address %A has sent spam within the last 24 hours":\ | |||||
:method=http:\ | |||||
:file=www.openbsd.org/spamd/traplist.gz</programlisting> | |||||
<para>In der ersten Zeile steht der Name der Blacklist und | |||||
die zweite Zeile gibt den Typ an. Das Feld | |||||
<literal>msg</literal> enthält die Nachricht, die dem | |||||
Absender während des <acronym>SMTP</acronym>-Dialogs | |||||
angezeigt wird. Das Feld <literal>mehtod</literal> legt | |||||
fest, wie <application>spamd-setup</application> die | |||||
Listen bezieht; unterstützte Methoden sind | |||||
<literal>http</literal>, <literal>ftp</literal>, | |||||
<literal>file</literal> und ein externes Programm via | |||||
<literal>exec</literal>. Im letzten Feld gibt | |||||
<literal>file</literal> den Namen der Datei an, die | |||||
<application>spamd</application> erwartet.</para> | |||||
<para>Die Definition der Whitelist ist ähnlich. Das Feld | |||||
<literal>msg</literal> wird jedoch nicht definiert, da | |||||
eine Meldung hier nicht erforderlich ist:</para> | |||||
<programlisting>whitelist:\ | |||||
:white:\ | |||||
:method=file:\ | |||||
:file=/var/mail/whitelist.txt</programlisting> | |||||
<tip> | |||||
<title>Wählen Sie die Datenquellen mit Sorgfalt:</title> | |||||
<para>Bei der Verwendung von sämtlichen Blacklists aus | |||||
der Beispieldatei <filename>spamd.conf</filename> | |||||
würden große Teile des Internets geblockt. Der | |||||
Administrator muss diese Datei bearbeiten, um eine | |||||
optimale Konfiguration zu erzielen. Dazu gehört auch | |||||
die Auswahl von geeigneten Blacklists und, wenn nötig, | |||||
die Erstellung von benutzerdefinierten Listen.</para> | |||||
</tip> | |||||
<para>Als nächstes fügen Sie folgenden Eintrag in | |||||
<filename>/etc/rc.conf</filename> hinzu. Zusätzliche | |||||
Optionen sind in der Manualpage beschrieben:</para> | |||||
<programlisting>spamd_flags="-v" # use "" and see spamd-setup(8) for flags</programlisting> | |||||
<para>Wenn Sie fertig sind, starten Sie | |||||
<application>spamd</application> durch die Eingabe von | |||||
<command>service obspamd start</command>. Führen Sie | |||||
die weitere Konfiguration mit | |||||
<command>spamd-setup</command> durch. Erstellen Sie zum | |||||
Schluss einen &man.cron.8;-Job, der | |||||
<command>spamd-setup</command> in regelmäßigen Abständen | |||||
aufruft, um die Listen zu aktualisieren.</para> | |||||
</step> | |||||
</procedure> | |||||
<para>Auf einem typischen Gateway vor dem Mailserver, werden | |||||
Rechner innerhalb von wenigen Minuten geblockt.</para> | |||||
<para><application>PF</application> unterstützt auch | |||||
<firstterm>Greylisting</firstterm>, das Nachrichten von | |||||
unbekannten Rechnern vorübergehend mit | |||||
<replaceable>45n</replaceable>-Codes ablehnt. Nachrichten | |||||
von diesen Rechnern werden bei einem erneuten Versuch nach | |||||
einer angemessenen Zeit durchgelassen. Nachrichten von | |||||
Rechnern, die nach RFC 1123 und RFC 2821 konfiguriert sind, | |||||
werden sofort durchgelassen.</para> | |||||
<para>Weitere Informationen über Greylisting finden Sie unter | |||||
<link xlink:href="http://www.greylisting.org/"> | |||||
greylisting.org</link>. Das Erstaunlichste an Greylisting | |||||
ist, neben der einfachen Benutzung, dass es immer noch | |||||
funktioniert. Spammer und Malware-Autoren gelingt es | |||||
bislang nur schwer, diese Technik zu umgehen.</para> | |||||
<para>Die grundsätzliche Vorgehensweise zur Konfiguration von | |||||
Greylisting ist wie folgt:</para> | |||||
<procedure> | |||||
<title>Konfiguration von Greylisting</title> | |||||
<step> | |||||
<para>Stellen Sie sicher, dass &man.fdescfs.5; eingehängt | |||||
ist. Dies wird in Schritt 1 der vorherigen Prozedur | |||||
beschrieben.</para> | |||||
</step> | |||||
<step> | |||||
<para>Um <application>spamd</application> im | |||||
Greylisting-Modus auszuführen, fügen Sie folgende Zeilen | |||||
in <filename>/etc/rc.conf</filename> ein:</para> | |||||
<programlisting>spamd_grey="YES" # use spamd greylisting if YES</programlisting> | |||||
<para>Lesen Sie die Manualpage von | |||||
<application>spamd</application> für Beschreibungen von | |||||
zusätzlichen Parametern.</para> | |||||
</step> | |||||
<step> | |||||
<para>Starten Sie die Dienste, um die Konfiguration von | |||||
Greylisting abzuschließen:</para> | |||||
<screen>&prompt.root; <userinput>service obspamd restart</userinput> | |||||
&prompt.root; <userinput>service spamlogd start</userinput></screen> | |||||
</step> | |||||
</procedure> | |||||
<para>Hinter den Kulissen führen die | |||||
<application>spamdb</application>-Datenbank und | |||||
<application>spamlogd</application> wesentliche Aufgaben der | |||||
Greylisting-Funktion aus. <application>spamdb</application> | |||||
ist die Schnittstelle für den Administrator, der über den | |||||
Inhalt der Datenbank <filename>/var/db/spamdb</filename> | |||||
Blaklists, Whitelists und Greylists verwaltet.</para> | |||||
</sect3> | |||||
<sect3 xml:id="pftut-hygiene"> | |||||
<title>Netzwerk-Hygiene</title> | |||||
<para>Dieser Abschnitt beschreibt die Verwendung von | |||||
<literal>block-policy</literal>, <literal>scrub</literal> | |||||
und <literal>antispoof</literal>, mit denen das Verhalten | |||||
des Regelsatzes weiter optimiert werden kann.</para> | |||||
<para>Die Option <literal>block-policy</literal> kann im | |||||
Teil <literal>options</literal> des Regelwerks konfiguriert | |||||
werden, vor den Umleitungen und den eigentlichen | |||||
Filterregeln. Diese Option legt fest, welche Rückmeldung | |||||
<application>PF</application> an einen geblockten Rechner | |||||
sendet. Es existieren zwei mögliche Werte: | |||||
<literal>drop</literal> verwirft das Paket ohne Rückmeldung | |||||
und <literal>return</literal> gibt eine Statusmeldung, wie | |||||
etwa <computeroutput>Connection refused</computeroutput> | |||||
zurück.</para> | |||||
<para>Die Voreinstellung ist <literal>drop</literal>. Geben | |||||
Sie den gewünschten Wert ein, um die | |||||
<literal>block-policy</literal>-Richtlinie zu ändern:</para> | |||||
<programlisting>set block-policy return</programlisting> | |||||
<para><literal>scrub</literal> ist ein Schlüsselwort in | |||||
<application>PF</application>, das die Paket-Normalisierung | |||||
aktiviert. Dieser Prozess fügt fragmentierte Pakete wieder | |||||
zusammen und blockt <acronym>TCP</acronym>-Pakete mit | |||||
ungültigen Flag-Kombinationen. Ein aktiviertes | |||||
<literal>scrub</literal> bietet einen gewissen Schutz gegen | |||||
Angriffe, die auf die falsche Handhabung von fragmentierten | |||||
Paketen aufbauen. Es stehen viele Optionen zur Verfügung, | |||||
jedoch sollte die einfachste Form für die meisten | |||||
Konfigurationen ausreichend sein:</para> | |||||
<programlisting>scrub in all</programlisting> | |||||
<para>Einige Dienste, wie beispielsweise | |||||
<acronym>NFS</acronym>, erfordern eine bestimmte Handhabung | |||||
von fragmentierten Paketen. Weitere Informationen finden | |||||
Sie unter <link | |||||
xlink:href="http://www.openbsd.org/faq/pf/scrub.html"> | |||||
http://www.openbsd.org/faq/pf/scrub.html</link>.</para> | |||||
<para>Dieses Beispiel fügt fragmentierte Pakete wieder | |||||
zusammen, löscht das <quote>do not fragment</quote>-Bit und | |||||
setzt die maximale Segmentgröße auf 1440 Bytes:</para> | |||||
<programlisting>scrub in all fragment reassemble no-df max-mss 1440</programlisting> | |||||
<para>Der <literal>antispoof</literal>-Mechanismus bietet | |||||
einen Schutz gegen gefälschte | |||||
<acronym>IP</acronym>-Adressen. Dabei werden hauptsächlich | |||||
Pakete verworfen, die auf der falschen Schnittstellen | |||||
ankommen.</para> | |||||
<para>Folgende Regeln verwerfen gefälschte Adressen, wenn sie | |||||
aus dem Internet oder dem lokalen Netzwerk stammen:</para> | |||||
<programlisting>antispoof for $ext_if | |||||
antispoof for $int_if</programlisting> | |||||
</sect3> | |||||
<sect3 xml:id="pftut-unrouteables"> | |||||
<title>Handhabung von nicht-routebaren Adressen</title> | |||||
<para>Sogar bei einem richtig konfigurierten | |||||
<acronym>NAT</acronym>-Gateway müssen Sie vielleicht die | |||||
Fehlkonfiguration anderer Personen ausgleichen. Ein | |||||
typischer Fehler besteht darin, nicht-routebare Adressen ins | |||||
Internet zu lassen. Da der Verkehr von nicht-routebaren | |||||
Adressen Teil eines <acronym>DoS</acronym>-Angriffs sein | |||||
kann, sollten Sie in Betracht ziehen, diesen Verkehr | |||||
explizit an der externen Schnittstelle des Netzwerks zu | |||||
blockieren.</para> | |||||
<para>In diesem Beispiel wird ein Makro erstellt, das die | |||||
nicht-routebaren Adressen enthält. Datenverkehr von und zu | |||||
diesen Adressen wird dann an der externen Schnittstelle des | |||||
Gateways verworfen.</para> | |||||
<programlisting>martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \ | |||||
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \ | |||||
0.0.0.0/8, 240.0.0.0/4 }" | |||||
block drop in quick on $ext_if from $martians to any | |||||
block drop out quick on $ext_if from any to $martians</programlisting> | |||||
</sect3> | |||||
</sect2> | </sect2> | ||||
</sect1> | </sect1> | ||||
Context not available. |
s/benötigen/benötigten/