<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
 <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <META NAME="GENERATOR" CONTENT="lfparser_2.35">
 <META NAME="LFCATEGORY" CONTENT="SystemAdministration">
 <link rel="icon" href="../../common/images/lf-16.png" type="image/png">
 <TITLE>lf289, SystemAdministration: Paketfilterung mit Linux</TITLE>
<style type="text/css">
<!--
 td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 }
 pre { font-family:monospace,Courier }
 pre.code { font-family:monospace,Courier;background-color:#aedbe8; }
 p.cl { color:#EE9500 }
 a.nodec { text-decoration:none }
 p.trans { font-size:8pt; text-align:right }
 p.clbox { width:50%; alignment:center; background-color:#FFD700; 
           border-style:none; border-width:medium; border-color:#FFD700; 
           padding:0.5cm;  text-align:center }
 p.code { width:80%; alignment:center; background-color:#aedbe8; 
          border-style:none; border-width:medium; border-color:#aedbe8; 
          padding:0.1cm;  text-align:left }
 p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; 
          border-width:medium; border-color:#AAAAAA; padding:0.5cm ; 
          margin-top:0.1cm; margin-right:1cm; margin-left:1cm; 
          text-align:center }
 .mark  { background-color:#e6e6ff }
-->
</style>
 
</HEAD>
<BODY bgcolor="#ffffff" text="#000000">
 <!-- this is generated html code. NEVER use this file for your
 translation work. Instead get the file with the same article number
 and .meta.shtml in its name. Translate this meta file and then
 use lfparser program to generate the final article -->
 <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html -->

<!-- this is used by a number of tools:
 =LF=AUTHOR: Vincent Renardias
 =LF=CAT___: SystemAdministration
 =LF=TITLE_: Paketfilterung mit Linux
 =LF=NUMBER: 289
 =LF=ANAME_: article289.shtml
 -->

<!-- 2pdaIgnoreStart -->

<!-- start navegation bar -->
 <!-- top navegation bar -->
 <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%">
   <TR bgcolor="#2e2292">
     <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width=
       "100%">
         <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif"
           alt="[LinuxFocus-icon]" width="319" height="45" align="left" 
           border="0"></TD>

           <TD class="top">
             <TABLE summary="topbar_1_links" width="100%">
               <TR align="right">
                 <TD class="top"><A class="nodec" href="../index.shtml"><FONT color=
                 "#DDDDDD" size="2">Home</FONT></A> &nbsp;|&nbsp; <A class=
                 "nodec" href="../map.html"><FONT color=
                 "#DDDDDD" size="2">Plan</FONT></A> &nbsp;|&nbsp; <A class=
                 "nodec" href="../indice.html"><FONT color=
                 "#DDDDDD" size="2">Index</FONT></A> &nbsp;|&nbsp; <A class="nodec" href="../Search/index.html"><FONT color=
                 "#DDDDDD" size="2">Suchen</FONT></A> </TD>
               </TR>

               <TR align="right">
                 <TD class="top">
                   <HR width="100%" noshade size="1">
                 </TD>
               </TR>
             </TABLE>
           </TD>
         </TR>
       </TABLE>
     </TD>
   </TR>
 </TABLE>
 <!-- end top navegation bar -->
 <!-- blue bar -->
 <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center"
 width="90%">
   <TR bgcolor="#00ffff">
     <TD><IMG src="../../common/images/transpix.gif" width="1" height=
     "2" alt=""></TD>
   </TR>
 </TABLE>
 <!-- end blue bar -->
 <!-- bottom navegation bar -->
 <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center"
 width="94%">
   <TR bgcolor="#000000">
     <TD>
       <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width=
       "100%">
         <TR align="center">
           <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color=
           "#FFFFFF">Nachrichten</FONT></A> </TD>
           <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD>
           <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color=
           "#FFFFFF">Archiv</FONT></A> </TD>
           <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD>
           <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color=
           "#FFFFFF">Links</FONT></A> </TD>
           <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD>
           <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color=
           "#FFFFFF">&Uuml;ber uns</FONT></A> </TD>
         </TR>
       </TABLE>
     </TD>
   </TR>
 </TABLE>
 <!-- end bottom navegation bar -->
<!-- stop navegation bar -->

<!-- SSI_INFO -->

<!-- tr_staticssi include virtual -->
<!-- tr_staticssi exec cmd -->
<!-- addedByLfdynahead ver 1.4 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieses Dokument ist verf&uuml;bar auf: <A href="../../English/May2003/article289.shtml">English</a> &nbsp;<A href="../../Castellano/May2003/article289.shtml">Castellano</a> &nbsp;<A href="../../ChineseGB/May2003/article289.shtml">ChineseGB</a> &nbsp;<A href="../../Deutsch/May2003/article289.shtml">Deutsch</a> &nbsp;<A href="../../Francais/May2003/article289.shtml">Francais</a> &nbsp;<A href="../../Nederlands/May2003/article289.shtml">Nederlands</a> &nbsp;<A href="../../Russian/May2003/article289.shtml">Russian</a> &nbsp;<A href="../../Turkce/May2003/article289.shtml">Turkce</a> &nbsp;</FONT></TD></TR></TABLE><br>
 


<!-- SSI_INFO STOP -->
<!-- 2pdaIgnoreStop -->

<!-- SHORT BIO ABOUT THE AUTHOR -->
<TABLE ALIGN=LEFT BORDER=0  WIDTH="190" summary="about the author">
<TR>
<TD>

<!-- 2pdaIgnoreStart -->
<!-- PALM DOC -->
<TABLE BORDER=0 hspace=4 vspace=4 summary="pda download"> <TR> <TD>
<font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font>
</TD> </TR> </TABLE>
<!-- END PALM DOC -->
<!-- 2pdaIgnoreStop -->
<br>
<img src="../../common/images/VincentRenardias.jpg" alt="Vincent Renardias" width="100" height="115">
<BR>von  Vincent Renardias <br> <small>&lt;vincent(at)renardias.com&gt;</small>
<BR><BR>
<I>&Uuml;ber den Autor:</I><BR>
<!-- aboutauthor_start -->
<p>GNU/Linux-Benutzer seit 1993, ist Vincent Renardias seit 1996
    in dessen Entwicklung involviert: Debian-Entwickler, franz&ouml;sischer &Uuml;bersetzer von GIMP und GNOME, Gr&uuml;nder der Linux-Anwendergruppe in Marseille (PLUG) ... Nun Manager f&uuml;r Forschung und Entwicklung bei der Firma EFB2, tr&auml;gt er weiterhin zu GNU/Linux bei.</p>
<!-- aboutauthor_stop -->
<!-- TRANSLATED TO de -->
<BR><BR><I>&Uuml;bersetzt ins Deutsche von:</I><BR>
Hermann-Josef Beckers <small>&lt;beckerst/at/lst-oneline.de&gt;</small>
<br>
<!--
 =LF=TRANSTO=de: Hermann-Josef Beckers
-->
<!-- TRANSLATED TO STOP -->
<BR><i>Inhalt</i>:
<UL>
  <LI><A HREF="#289lfindex0">Gateway, Proxy-Arp oder Ethernet-Br&uuml;cke ?</A></LI>
  <LI><A HREF="#289lfindex1">Grundregeln des Filterns</A></LI>
  <LI><A HREF="#289lfindex2">Netfilter</A></LI>
  <LI><A HREF="#289lfindex3">Beispiel f&uuml;r eine Einrichtung </A></LI>
  <LI><A HREF="#289lfindex4">Referenzen</A></LI>
  <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=289">Talkback f&uuml;r diesen Artikel</A></LI>
</UL>

</TD></TR></TABLE>
<!-- HEAD OF THE ARTICLE -->
<br>&nbsp;
<table border="0"><tr><td>
<H2>Paketfilterung mit Linux</H2>
 <img src="../../common/images/article289/illustration289.jpg" alt="[Illustration]" hspace="10"  width="283" height="193">
<!-- ABSTRACT OF THE ARTICLE -->
<P><i>Zusammenfassung</i>:
<P>
<!-- articleabstract_start -->
<p>Dieser Artikel wurde zuerst in einer Spezial-Ausgabe des franz&ouml;sischen Linux-Magazins ver&ouml;ffentlich, die sich auf Sicherheit konzentrierte. Der Editor, die Autoren und die &Uuml;bersetzer haben LinuxFocus freundlicherweise erlaubt, jeden Artikel aus dieser Spezialausgabe zu ver&ouml;ffentlichen. Entsprechend wird LinuxFocus diese Artikel ver&ouml;ffentlichen, sobald diese ins Englische &uuml;bersetzt sind. Dank an alle Personen, die an dieser Arbeit beteiligt sind.  Dieser Abstrakt wird f&uuml;r jeden Artikel reproduziert, der den gleichen Ursprung hat.
</p><p><br>
Eine der guten M&ouml;glichkeiten, Einbruchsversuche zu verhindern, ist es zu filtern, was in einem Netzwerk nutzlos ist. Diese Aufgabe wird normalerweise einer Maschine &uuml;bertragen, die als Firewall genutzt wird. <br>
In diesem Artikel pr&auml;sentieren wir die erforderlichen Grundlagen f&uuml;r die Implementierung und Konfiguration eines solchen Systems. </p>
<!-- articleabstract_stop -->

<br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br>
</td></tr></table>
<!-- BODY OF THE ARTICLE -->


    <A NAME="289lfindex0">&nbsp;</A>
<H2>Gateway, Proxy-Arp oder Ethernet-Br&uuml;cke ?</H2>


    <p>Der Filtermechanismus kann als ein Netz betrachtet werden, das einige unerw&uuml;nschte Pakete stoppt. Das Wichtigste ist es, die richtige Gr&ouml;&szlig;e der Maschen zu bestimmen und den rechten Ort f&uuml;r die Installation.
    <br>
    <br>
    </p>

    <center>
      <b>Firewall-Anordnung im Netzwerk </b><br>
       <img src="../../common/images/article289/packet-filter.png"
      alt="Firewall location" height="271" width="565">
    </center>

    <p>Um Pakete ordnungsgem&auml;&szlig; filtern zu k&ouml;nnen, muss der Filtermechanismus physikalisch zwischen dem zu sch&uuml;tzenden Netzwerk und dem "Rest der Welt" positioniert sein. Dies wird durch eine Maschine mit zwei Netzwerk-Karten (normalerweise Ethernet) erreicht, eine mit dem internen Netzwerk verbunden und die andere mit dem Router, der den Zugang nach aussen erm&ouml;glicht. Auf diese Art muss alle Kommunikation durch die Firewall gehen, die diese Kommunikation in Abh&auml;ngigkeit von ihrem Inhalt blockt oder passieren l&auml;sst.
<br>
 Der Rechner mit dem Filtermechanismus kann auf drei verschiedene Arten konfiguriert werden:<br>
<br>

    - "einfaches" Gateway: dies ist die h&auml;ufigste Konfiguration. Der Rechner wird als Gateway zwischen zwei Netzwerken oder Subnetzwerken benutzt. Die Computer im lokalen Netzwerk werden so konfiguriert, dass sie die Firewall anstelle des Routers f&uuml;r ihre Default-Route benutzen.<br>
<br>

    - "Proxy-ARP"-Gateway: die vorstehende Konfiguration impliziert die Aufteilung des Netzwerkes in zwei Subnetz-Bereiche, wobei die H&auml;lfte der verf&uuml;gbaren IP-Adressen verloren geht. Dies ist etwas &auml;rgerlich. Beim Beispiel eines Subnetzwerkes mit 16 Adressen (und einer 28-Bit-Netzmaske) gehen wir von 14 auf nur 6 verf&uuml;gbare Adressen, da die Netzwerk- und Broadcast-Adresse benutzt werden. Durch Hinzuf&uuml;gen eines Bits zur Subnetzmaske verringern wir von 14 auf 6 verf&uuml;gbare Adressen (8 IPs abz&uuml;glich der f&uuml;r Netzwerk und Broadcast). Wenn Sie sich es nicht leisten k&ouml;nnen, die H&auml;lfte der verf&uuml;gbaren IP-Adressen zu verlieren, k&ouml;nnen Sie die Technik nutzen, die etwas sp&auml;ter im Artikel erl&auml;utert wird. Weiterhin erfordert diese Technik keine &Auml;nderung in der Netzwerk-Konfiguration der vorhandenen Maschinen, weder am Router noch an den gesch&uuml;tzten Computern. <br>
<br>

    - Ethernet-Br&uuml;cke: Installation eines Ethernet-Gateways (nicht eines IP-Gateways) macht den Filtermechanismus f&uuml;r andere Rechner unsichtbar. Eine solche Konfiguration kann vorgenommen werden, ohne den Ethernet-Schnittstellen IP-Adressen zuzuweisen. Die Maschine ist dann mittels ping, traceroute usw. nicht zu entdecken. Wir m&uuml;ssen beachten, dass eine Paketfilter-Implementation in einer solchen Konfiguration einen 2.2.x-Kernel erfordert, da die Portierung dieser Eigenschaft auf die 2.4.x-Kernel noch nicht fertig ist. </p>

    <A NAME="289lfindex1">&nbsp;</A>
<H2>Grundregeln des Filterns</H2>


    <p>Da wir nun wissen, wo wir unseren Filter installieren, m&uuml;ssen wir definieren, was er blockieren und was akzeptieren soll.<br>
 Es gibt zwei M&ouml;glichkeiten, einen Filter zu konfigurieren:<br>
<br>

    - Die gute: Es sind nur Pakete zul&auml;ssig, die von einer Regel akzeptiert werden. <br>
    - Die schlechte: (leider oft benutzt) nur ausdr&uuml;cklich verbotene Pakete werden blockiert, alle anderen werden akzeptiert.<br>
<br>

    Dies ist einfach zu erkl&auml;ren: im ersten Fall f&uuml;hrt das Vergessen einer Regel dazu, dass ein Dienst nicht ordentlich oder gar nicht funktioniert. Dies f&auml;llt normalerweise recht schnell auf und dann reicht es, die passende Regel zu aktivieren, damit wieder alles funktioniert. <br>
    Im zweiten Fall bedeutet das Vergessen einer Regel eine m&ouml;gliche Verletzbarkeit, die vielleicht schwer zu finden ist ... wenn wir sie &uuml;berhaupt finden.
    </p>

    <A NAME="289lfindex2">&nbsp;</A>
<H2>Netfilter</H2>


    <p>Die am h&auml;ufigsten verwendete Paketfilter-Software in Linux 2.4 ist Netfilter; es ersetzt das in Linux-Kernel 2.2 genutzte 'ipchains' recht gut. Netfilter besteht aus zwei Teilen: der Kernel-Unterst&uuml;tzung, die in Ihrem Kernel einkompiliert sein muss und dem <tt>'iptables'</tt>-Befehl, der in Ihrem System verf&uuml;gbar sein sollte. </p>

    <A NAME="289lfindex3">&nbsp;</A>
<H2>Beispiel f&uuml;r eine Einrichtung </H2>


    <p>Ein kommentiertes Beispiel ist besser als eine lange Rede, daher beschreiben wir als n&auml;chstes, wie man einen Filtermechanismus installiert und einrichtet. Zun&auml;chst wird die Maschine als Gateway unter Benutzung von Proxy-ARP konfiguriert, um die Anzahl der IP-Adressen zu begrenzen und wir werden das Filtersystem einrichten. </p>

    <p>Der Autor hat eine Vorliebe f&uuml;r die Debian-Distribution, um solch ein System einzurichten, aber jede andere Distribution ist genauso gut. </p>

    <p>Testen Sie zuerst, ob Ihr Kernel &uuml;ber Netfilter-Unterst&uuml;tzung verf&uuml;gt. Wenn dies der Fall ist, finden Sie in den Boot-Nachrichten folgendes:</p>

    <p><tt>ip_conntrack (4095 buckets, 32760 max)</tt><br>
    <tt>ip_tables: (c)2000 Netfilter core team</tt></p>

    <p>Andernfalls m&uuml;ssen Sie den Kernel neukompilieren, nachdem Sie die Netzfilter-Unterst&uuml;tzung aktiviert haben. Die entsprechenden Optionen finden sich im Untermen&uuml; <tt>"Netzwerk-Paketfilterung"</tt> des Men&uuml;s <tt>"Netzwerk-Optionen"</tt>. Aus dem Abschnitt <tt>"Netfilter-Konfiguration"</tt> w&auml;hlen Sie die von Ihnen ben&ouml;tigten Optionen. Im Zweifel k&ouml;nnen Sie alle aktivieren. Desweiteren ist es besser, Netfilter in den Kernel zu legen und keine Module zu benutzen. Wenn aus irgendeinem Grund eines der Netfilter-Module fehlt oder nicht geladen wird, funktioniert die Filterung nicht und wir reden besser nicht &uuml;ber die Risiken, die das impliziert. </p>

    <p>Sie sollten auch das Paket 'iproute2' installieren (dies ist nicht obligatorisch, aber unser Beispiel benutzt es, da es uns erm&ouml;glicht, das Konfigurations-Skript einfacher zu gestalten). Mit Debian reicht der Befehl  'apt-get install iproute'.<br>
   Bei anderen Distributionen m&uuml;ssen Sie das entsprechende Paket installieren. Der &uuml;bliche Weg ist es, die Software aus den Quellen zu installieren, die Sie von der folgenden Adresse abrufen k&ouml;nnen:<br>
    <tt><a href=
    "ftp://ftp.inr.ac.ru/ip-routing/">ftp://ftp.inr.ac.ru/ip-routing/</a></tt></p>

    <p>Nun m&uuml;ssen die 2 Ethernet-Karten konfiguriert werden. Wir m&uuml;ssen beachten, dass der Linux-Kernel bei der Auto-Erkennung der Hardware mit der Suche nach Netzwerk-Karten aufh&ouml;rt, sobald eine gefunden wurde. Dementsprechend wird nur die erste erkannt. <br>
    Eine einfache L&ouml;sung f&uuml;r dieses Problem besteht darin, der  <tt>lilo.conf</tt>-Datei folgende Zeile hinzuzuf&uuml;gen:<br>
    <tt>append="ether=0,0,eth1"</tt></p>

    <p>Nun m&uuml;ssen wir die Ethernet-Schnittstellen konfigurieren. Die Methode, die wir benutzen, erlaubt es uns, die gleiche IP-Adresse f&uuml;r beide Karten zu verwenden und damit eine Adresse zu sparen:<br>
   Wir nehmen an, dass wir ein <tt>10.1.2.96/28</tt>-Subnetzwerk haben, d.h. Adressen von 10.1.2.96 bis 10.1.2.111 einschlie&szlig;lich. Der Router erh&auml;lt die Adresse 10.1.2.97 und unser Filter-Rechner die 10.1.2.98. Die <tt>eth0</tt>-Schnittstelle wird mit dem Router &uuml;ber ein RJ45-Cross-Kabel verbunden, wenn beide ohne einen Hub/Switch direkt verbunden sind; die  <tt>eth1</tt>-Schnittstelle wird mit dem Hub/Switch verbunden und von dort mit den Rechnern im lokalen Netzwerk.</p>

    <p>Entsprechend werden beide Schinttstellen mit den folgenden Parametern konfiguriert:</p>
<pre>
Adresse  : 10.1.2.98
Netzmaske  : 255.255.255.240
Netzwerk  : 10.1.2.96
Broadcast: 10.1.2.111
Gateway  : 10.1.2.97
</pre>

    <p>Als n&auml;chstes benutzen wir das folgende Skript, das nach der Initial-Konfiguration der Netzwerk-Karten gestartet werden muss, um die Einrichtung zu beenden.<br>
    </p>
<pre class="code">
net.vars: Konfigurations-Variablen

PREFIX=10.1.2
DMZ_ADDR=$PREFIX.96/28
# Schnittstellen-Definitionen
BAD_IFACE=eth0
DMZ_IFACE=eth1
ROUTER=$PREFIX.97


net-config.sh: Netzwerk-Konfigurationsskript

#!/bin/sh
# Aktivieren Sie die n&auml;chste Zeile, um die Befehle w&auml;hrend der Ausf&uuml;hrung anzuzeigen
# set -x
# Wir lesen die definierten Variablen aus der vorherigen Datei
source /etc/init.d/net.vars
# Wir entfernen die aktuellen Routen aus dem lokalen Netzwerk
ip route del $PREFIX.96/28 dev $BAD_IFACE
ip route del $PREFIX.96/28 dev $DMZ_IFACE
# Wir definieren, dass das lokale Netzwerk &uuml;ber eth1 erreicht wird
# und der Router &uuml;ber eth0.
ip route add $ROUTER dev $BAD_IFACE
ip route add $PREFIX.96/28 dev $DMZ_IFACE
# Wir aktivieren Proxy-ARP f&uuml;r beide Schnittstellen
echo 1 &gt; /proc/sys/net/ipv4/conf/eth0/proxy_arp
echo 1 &gt; /proc/sys/net/ipv4/conf/eth1/proxy_arp
# Wir aktivieren IP-Forwarding, damit die Pakete von einer Karte zur anderen
# geleitet werden k&ouml;nnen.
echo 1 &gt; /proc/sys/net/ipv4/ip_forward

</pre>

    <p>Wir kehren nun zum Proxy-ARP-Mechanismus zur&uuml;ck, den wir f&uuml;r unsere Konfiguration ben&ouml;tigen.<br>
    Wenn ein Rechner mit einem anderen im gleichen Netzwerk Verbindung aufnehmen m&ouml;chte, ben&ouml;tigt er dessen Ethernet-Adresse (oder MAC- oder Hardware-Adresse), die der IP-Adresse des Zielrechners entspricht. Der Quellrechner sendet dann die Frage "Wie lautet die MAC-Adresse der Schnittstelle, die die IP-Adresse 1.2.3.4 besitzt?", und der Zielrechner muss antworten.</p>

    <p>Hier ist ein Beispiel eines solchen "Gespr&auml;chs", mittels tcpdump aufgezeichnet: <br>
    - die Anforderung: der Rechner 172.16.6.72 fragt nach der MAC-Adresse zur IP-Adresse  172.16.6.10.<br>
    <tt>19:46:15.702516 arp who-has 172.16.6.10 tell
    172.16.6.72</tt><br>
    - die Antwort: der Rechner 172.16.6.10 teilt seine Karten-Nummer mit:<br>
    <tt>19:46:15.702747 arp reply 172.16.6.10 is-at
    0:a0:4b:7:43:71</tt></p>

    <p>Dies bringt uns zum Ende dieser kurzen Erkl&auml;rung: Die ARP-Anforderungen werden mittels Broadcast (Rundspruch) vorgenommen und sind daher auf ein physikalisches Netzwerk begrenzt. Entsprechend sollte die Anforderung von einer gesch&uuml;tzten Maschine, die MAC-Adresse des Routers herauszufinden, von dem Filter-Rechner geblockt werden. Die Aktivierung der Proxy-ARP-Eigenschaft erlaubt uns die L&ouml;sung dieses Problems, da die ARP Anfragen und Antworten, die zu der Karte kommen, dann weitergeleitet werden.
</p>

    <p>Zu diesem Zeitpunkt sollten Sie &uuml;ber ein funktionierendes Netzwerk verf&uuml;gen mit einem Rechner, der den gesamten Verkehr zwischen dem lokalen Netzwerk und der Au&szlig;enwelt verwaltet.</p>

    <p>Nun m&uuml;ssen wir das Filtersystem mittels Netfilter einrichten.<br>
    Netfilter erlaubt es, direkt auf den Paketfluss zu reagieren. In der Basiskonfiguration werden die Pakete &uuml;ber 3 Regel-Ketten verwaltet:<br>
    - INPUT: f&uuml;r die &uuml;ber eine Schnittstelle hereinkommenden Pakete,<br>
    - FORWARD: f&uuml;r alle Pakete, die von einer zur anderen Schnittstelle weitergeleitet werden,<br>
    - OUTPUT: f&uuml;r die &uuml;ber eine Schnittstelle herausgehenden Pakete.</p>

    <p>Der 'iptables'-Befehl erlaubt es, Regeln in jeder dieser Ketten hinzuzuf&uuml;gen, zu &auml;ndern oder zu entfernen, um das Filter-Verhalten zu modifizieren.<br>
    Weiterhin hat jede Kette eine Standard-Regelung, d.h. sie weiss, was zu tun ist, wenn keine Regel in der Kette auf ein Paket zutrifft.<br>
<br>
    Die vier h&auml;ufigsten Optionen sind:<br>
    - ACCEPT: das Paket kann passieren,<br>
    - REJECT: das Paket wird zur&uuml;ckgewiesen und das entsprechende Fehlerpaket wird gesendet (ICMP Port Unreachable, TCP RESET, je nach Fall),<br>
    - LOG: schreibt einen Paket-Hinweis in syslog,<br>
    - DROP: das Paket wird ignoriert und keine Antwort gesendet.<br>
    <br>
    </p>

    <center>
      <b>Paketflu&szlig; durch die Standard-Regelketten</b>
    </center>
    <br>

    <center>
      <img src="../../common/images/article289/packet-filter2.png"
      alt="Packet flow" height="311" width="723">
    </center>

    <p>Hier sind die Hauptoptionen von iptables, die die Manipulation ganzer Ketten erm&ouml;glichen. Wir werden sie sp&auml;ter noch erl&auml;utern:</p>

    <p>-N: erstellt eine neue Kette.<br>
    -X: entfernt eine leere Kette.<br>
    -P: &auml;ndert die Standardregel einer Kette.<br>
    -L: listet die Regeln einer Kette auf.<br>
    -F: entfernt alle Regeln in einer Kette.<br>
    -Z: l&ouml;scht die Byte- und Paketz&auml;hler, die die Kette durchlaufen haben.</p>

    <p>Zum &Auml;ndern einer Kette gibt es die folgenden Befehle:<br>
    -A: f&uuml;gt eine Regel am Ende einer Kette an.<br>
    -I: f&uuml;gt eine neue Regel in einer bestimmten Position in einer Kette ein.<br>
    -R: ersetzt eine bestimmte Regel in einer Kette.<br>
    -D: l&ouml;scht eine Regel in einer Kette, entweder &uuml;ber deren Nummer oder die Beschreibung der Regel.</p>

    <p>Ein kleines Beispiel: wir werden die PING-Antworten (das ist das ICMP-Paket 'echo-reply') blockieren, die von einer bestimmten Maschine kommen.<br>
    Zuerst testen wir, ob wir den Rechner mittels "ping" erreichen k&ouml;nnen:</p>
<pre class="code">
# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms

--- 172.16.6.74 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
</pre>
   Nun f&uuml;gen wir der INPUT-Kette eine Regel hinzu, die die ICMP-Reply-Pakete ('-p icmp --icmp-type echo-reply') abf&auml;ngt, die vom Rechner 172.16.6.74 ('-s 172.16.6.74') kommen. Diese Pakete werden ignoriert ('-j DROP').
<pre class="code">
# iptables -A INPUT -s 172.16.6.74 -p icmp --icmp-type echo-reply -j DROP
</pre>

    <p>Nun PINGeln wir diesen Rechner erneut an:</p>
<pre class="code">
# ping -c 3 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes

--- 172.16.6.74 ping statistics ---

3 packets transmitted, 0 packets received, 100% packet loss
</pre>

    <p>Wie wir erwarten konnten, wurden diese Antworten nicht durchgelassen. Wir k&ouml;nnen &uuml;berpr&uuml;fen, dass die 3 Antworten geblockt wurden (3 Pakete mit insgesamt 252 Byte):</p>
<pre class="code">
# iptables -L INPUT -v
Chain INPUT (policy ACCEPT 604K packets, 482M bytes)
 pkts bytes target     prot opt in    out     source       destination
  3   252   DROP       icmp --  any   any     172.16.6.74    anywhere
</pre>

    <p>Um zur Ausgangssituation zur&uuml;ckzukehren, m&uuml;ssen wir nur die erste Regel aus der INPUT-Kette entfernen:</p>

    <p><tt># iptables -D INPUT 1</tt></p>

    <p>Nun sollte PING wieder funktionieren:</p>
<pre class="code">
# ping -c 1 172.16.6.74
PING 172.16.6.74 (172.16.6.74): 56 data bytes
64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms

--- 172.16.6.74 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms
#
</pre>

    <p>Es klappt!</p>

    <p>Sie k&ouml;nnen weitere Regelketten zu den 3 vordefinierten hinzuf&uuml;gen (die Sie auf keinen Fall entfernen k&ouml;nnen) und Datenverkehr erzeugen, der diese Ketten durchl&auml;uft. Dies kann z.B. n&uuml;tzlich sein, um doppelte Regeln in verschiedenen Ketten zu vermeiden. </p>

    <p>Nun richten wir die erforderlichen Regeln f&uuml;r eine minimale Firewall ein. Diese wird die Dienste ssh, domain (DNS), http und smtp erlauben und sonst nichts.<br>
  Zur Vereinfachung schreiben wir die Einrichtungs-Befehle in ein Shell-Skript, um die Konfiguration zu erleichtern. Das Skript beginnt damit, die aktuelle Konfiguration zu l&ouml;schen, bevor die neue eingerichtet wird. Dieser kleine Trick erlaubt es, das Skript zu starten, wenn die Konfiguration aktiv ist, ohne doppelte Regeln zu riskieren. <br>
    <br>
    </p>
<pre class="code">
<b>rc.firewall</b>

#!/bin/sh

# Verwerfen der bisherigen Regeln
iptables -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD


# Die Regelkette wird entsprechend der Richtung erstellt.
# bad = eth0 (outside)
# dmz = eth1 (inside)
iptables -X bad-dmz
iptables -N bad-dmz
iptables -X dmz-bad
iptables -N dmz-bad
iptables -X icmp-acc
iptables -N icmp-acc
iptables -X log-and-drop
iptables -N log-and-drop

# Spezielle Regelkette zum Aufzeichnen von Paketen, bevor sie geblockt
# werden
iptables -A log-and-drop -j LOG --log-prefix "drop "
iptables -A log-and-drop -j DROP

# Pakete mit aktivierten TCP-Flags werden verworfen, ebenso diejenigen
# ohne irgendwelche Flags (oft mit Nmap-Scans genutzt)
iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j log-and-drop
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j log-and-drop

# Pakete von reservierten Adressen werden verworfen, ebenso multicast
iptables -A FORWARD -i eth+ -s 224.0.0.0/4 -j log-and-drop
iptables -A FORWARD -i eth+ -s 192.168.0.0/16 -j log-and-drop
iptables -A FORWARD -i eth+ -s 172.16.0.0/12 -j log-and-drop
iptables -A FORWARD -i eth+ -s 10.0.0.0/8 -j log-and-drop

# Zu einer bestehenden Verbindung geh&ouml;rende Pakete werden akzeptiert
iptables -A FORWARD -m state --state INVALID -j log-and-drop
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#  Die entsprechende Kette wird entsprechend der Paketquelle weitergeleitet
iptables -A FORWARD -s $DMZ_ADDR -i $DMZ_IFACE -o $BAD_IFACE -j dmz-bad
iptables -A FORWARD -o $DMZ_IFACE -j bad-dmz
# Der gesamte Rest wird ignoriert
iptables -A FORWARD -j log-and-drop

# Akzeptierte ICMPs
iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT
iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A icmp-acc -j log-and-drop

# Aussen -&gt; Innen-Regelkette
# mail, DNS, http(s) und SSH werden akzeptiert
iptables -A bad-dmz -p tcp --dport smtp -j ACCEPT
iptables -A bad-dmz -p udp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport domain -j ACCEPT
iptables -A bad-dmz -p tcp --dport www -j ACCEPT
iptables -A bad-dmz -p tcp --dport https -j ACCEPT
iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT
iptables -A bad-dmz -p icmp -j icmp-acc
iptables -A bad-dmz -j log-and-drop

# Innen -&gt; Aussen-Regelkette
# mail, DNS, http(s) und telnet werden akzeptiert
iptables -A dmz-bad -p tcp --dport smtp -j ACCEPT
iptables -A dmz-bad -p tcp --sport smtp -j ACCEPT
iptables -A dmz-bad -p udp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport domain -j ACCEPT
iptables -A dmz-bad -p tcp --dport www -j ACCEPT
iptables -A dmz-bad -p tcp --dport https -j ACCEPT
iptables -A dmz-bad -p tcp --dport telnet -j ACCEPT
iptables -A dmz-bad -p icmp -j icmp-acc
iptables -A dmz-bad -j log-and-drop

# Regelketten f&uuml;r den Rechner selbst
iptables -N bad-if
iptables -N dmz-if
iptables -A INPUT -i $BAD_IFACE -j bad-if
iptables -A INPUT -i $DMZ_IFACE -j dmz-if

# Externe Schnittstelle
# auf diesem Rechner wird nur SSH akzeptiert
iptables -A bad-if -p icmp -j icmp-acc
iptables -A bad-if -p tcp --dport ssh -j ACCEPT
iptables -A bad-if -p tcp --sport ssh -j ACCEPT
ipchains -A bad-if -j log-and-drop

# Interne Schnittstelle
iptables -A dmz-if -p icmp -j icmp-acc
iptables -A dmz-if -j ACCEPT

</pre>

    <p>Einige Worte zur Dienst-Qualit&auml;t ("quality of service"). Linux kann das
    ToS-("Type of Service")-Feld modifizieren und dessen Wert &auml;ndern, um dem Paket eine andere Priorit&auml;t zu geben. Z.B. &auml;ndert der folgende Befehl die ausgehenden SSH-Pakete, um die Verbindungs-Antwortzeit zu verbessern.</p>

    <p><tt>iptables -A OUTPUT -t mangle -p tcp --dport ssh -j TOS
    --set-tos Minimize-Delay</tt></p>

    <p>In gleicher Weise k&ouml;nnten Sie f&uuml;r FTP-Verbindungen die Option
    <tt>'--set-tos Maximize-Throughput'</tt> nutzen, um die &Uuml;bertragungsrate zum Nachteil der Sitzungs-Interaktivit&auml;t zu &auml;ndern.</p>

    <p>Das wars. Nun kennen Sie die Grundlagen, um ein effektives Paketfilter-System aufzusetzen. Denken Sie jedoch daran, dass eine Firewall kein Allheilmittel ist, wenn es um Sicherheit geht. Er ist nur eine weitere Vorsichtsma&szlig;nahme. Die Einrichtung einer Firewall entbindet Sie nicht davon, starke Passw&ouml;rter zu nutzen, die aktuellen Sicherheits-Patches, Einbruchs-Entdeckungssysteme usw.<br>
    <br>
    </p>

    <A NAME="289lfindex4">&nbsp;</A>
<H2>Referenzen</H2>


    <ul>
      <li>Proxy-ARP Mini-HOWTO: <a href=
      "http://www.linuxdoc.org/HOWTO/mini/Proxy-ARP-Subnet/index.html">
      http://www.linuxdoc.org/HOWTO/mini/Proxy-ARP-Subnet/index.html</a></li>

      <li>Netfilter: <a href=
      "http://netfilter.samba.org/">http://netfilter.samba.org/</a></li>
    </ul>
  



<!-- 2pdaIgnoreStart -->
<A NAME="talkback">&nbsp;</a>
<h2>Talkback f&uuml;r diesen Artikel</h2>
Jeder Artikel hat seine eigene Seite f&uuml;r Kommentare und R&uuml;ckmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen:
<center>
<table border="0"  CELLSPACING="2" CELLPADDING="1" summary="tb-button-outerpart">
 <tr BGCOLOR="#C2C2C2"><td align=center>
  <table border="3"  CELLSPACING="2" CELLPADDING="1" summary="tb-button">
   <tr BGCOLOR="#C2C2C2"><td align=center>
    <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=289"><b>&nbsp;Talkback Seite&nbsp;</b></a>
   </td></tr></table>
</td></tr></table>
</center>

<HR size="2" noshade>
<!-- ARTICLE FOOT -->
<CENTER><TABLE WIDTH="98%" summary="footer">
<TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%">
<A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A>
<BR><FONT COLOR="#FFFFFF">&copy; Vincent Renardias, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT>
</TD>
<TD BGCOLOR="#9999AA">
<!-- TRANSLATION INFO -->
<font size=2>Autoren und &Uuml;bersetzer:</font>
<TABLE summary="translators">
  <tr><td><font size="2">fr --&gt; -- : Vincent Renardias <small>&lt;vincent(at)renardias.com&gt;</small></font></td></tr>
  <tr><td><font size="2">fr --&gt; en: Georges Tarbouriech &lt;gt(at)linuxfocus.org&gt;</font></td></tr>
  <tr><td><font size="2">en --&gt; de: Hermann-Josef Beckers &lt;beckerst/at/lst-oneline.de&gt;</font></td></tr>
</TABLE>
</TD>
</TR></TABLE></CENTER>
<p><font size=1>2003-04-14, generated by lfparser version 2.35</font></p>
<!-- 2pdaIgnoreStop -->
</BODY>
</HTML>