menu.jpg  ::  Home ::  Computing ::  Downloads ::  Harley Davidson ::  Links ::  Music ::  Nonsense ::  Mail :: 

Der Paketfilter im Linux-Kernel 2.4.X kann im Gegensatz zu seinen Vorgängern "stateful" filtern - das bedeutet, dass er ein- oder ausgehende bzw weitergeleitete Pakete zusätzlich zu den bisher schon gegebenen Möglichkeiten auch nach ihrem möglichem Status

filtern kann. Auf Grund dieses Features ist es möglich, wesentlich knappere und gleichzeitig übersichtlichere Regeln für Paketfilter zu schreiben.

Sollte Netfilter nicht schon im distributionseigenen Kernel enthalten sein, muss man sich einen eigenen Kernel kompilieren. Dazu wird Netfilter im Kernel folgendermassen aktiviert:

Es folgen zur Darstellung des Zugriffs auf den Kernel-Paketfilter drei Beispiele, die den Aufbau

Paketfilters mittels "iptables" darstellen.

1. Ein einfaches Beispiel

Das folgende Beispiel habe ich aus dem hier erhältlichen Linux-2.4-Packet-Filtering-HOWTO gestohlen. Es setzt einen einfachen, aber dennoch wirksamen Paketfilter für eine standalone betriebene Maschine, die auf das Internet zugreifen soll, auf

.
   # IPT=/sbin/iptables
   # EXTIF=ppp0
   # insmod ip_conntrack
   # insmod ip_conntrack_ftp

Das externe Interface wird in der Variable "EXTIF" gespeichert und zwei Module, nachgeladen, die den Traffic, der auf anderen Ports hereinkommt als er herausgeht, regeln.


   # $IPT -N block
   # $IPT -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
   # $IPT -A block -m state --state NEW -i ! ${EXTIF} -j ACCEPT
   # $IPT -A block -j DROP

Mit diesen Anweisungen wird ein neuer Regelsatz namens "block" definiert (1. Zeile), die alle bestehenden oder von innen initiierten Verbindungen akzeptiert (2. Zeile) und alle neuen Verbindungen akzeptiert, sofern sie nicht von aussen (-i ! ${EXTIF}) kommen (3. Zeile). Alles andere wird verworfen (4. Zeile). Diese Kette ist der eigentliche Filter, der entscheidet, welche Pakete durchgelassen oder verworfen werden.


   # $IPT -A INPUT -j block
   # $IPT -A FORWARD -j block

Der gesamte eingehende und weitergeleitete Verkehr wird an die Kette "drop" weitergeleitet.


2. Ein etwas verfeinerter Ansatz

Der folgende Paketfilter schützt im Gegensatz zum 1. Beispiel vor Spoofing und hat zwei selbst definierte Filterregeln, die es ermöglichen, offensichtlich unerwünschte Pakete im Schnell-Durchgang zu verwerfen und den übrigen Traffic stateful zu filtern. Grundsätzlich werden alle eingehenden IP-Pakete verworfen.


   # IPT=/sbin/iptables
   # EXTIF=ppp0
   # CLASS_A="10.0.0.0/8"
   # CLASS_B="172.16.0.0/16"
   # CLASS_C="192.168.0.0/24"
   # CLASS_D="224.0.0.0/4"
   # CLASS_E="240.0.0.0/5"
   # LOOPBACK="127.0.0.0/8"

Am Anfang werden Variablen für das externe Interface und verschiedene Netzwerk-Klassen definiert, auf die später zugegriffen wird.


   # for FILE in /proc/sys/net/ipv4/ ip_forward /proc/sys/net/ipv4/tcp_syncookies
   # do
   #   if [ -e ${FILE} ]
   #     then # echo "1" > ${FILE}
   #   fi
   # done

   # if [ -e /proc/sys/net/ipv4/ip_dynaddr ]
   # then
   #   echo "7" > /proc/sys/net/ipv4/ip_dynaddr
   # fi

   # insmod ip_conntrack
   # insmod ip_conntrack_ftp

Mit den ersten beiden Schleifen wird das NATting (das in diesem Bespiel noch nicht benötigt wird, aber ich mag die Schleife einfach zu gern ;-), der Spoofing-Schutz und das Übersetzen von IP-Paketen bei erneutem Zuweisen einer anderen IP-Adresse eingeschaltet. Zuletzt werden noch zwei Module (Erklärung im 1. Beispiel) nachgeladen.


   # $IPT -P INPUT DROP
   # $IPT -P OUTPUT ACCEPT
   # $IPT -P FORWARD DROP

Die Default-Policy des Paketfilters wird gesetzt.


   # $IPT -F
   # $IPT -F INPUT
   # $IPT -F OUTPUT
   # $IPT -F FORWARD
   # $IPT -F -t mangle
   # $IPT -X
   # $IPT -F -t nat

Etwaig vorhandene Filterregeln werden geflusht und alle Regelsätze (ausser den Default-Ketten) gelöscht.


   # $IPT -N dump > /dev/null
   # $IPT -F dump
   # $IPT -A dump -p tcp -j LOG --log-prefix "iptables: "
   # $IPT -A dump -p udp -j LOG --log-prefix "iptables: "
   # $IPT -A dump -p tcp -j REJECT --reject-with tcp-reset
   # $IPT -A dump -p udp -j REJECT --reject-with icmp-port-unreachable
   # $IPT -A dump -j DROP

Ein neuer Regelsatz "dump" wird definiert, der ihn erreichende IP-Pakete dem Syslog übergibt und dann abweist oder verwirft. Dieser Regelsatz lässt keinerlei Traffic durch.

Im Syslog kann man dann nach Kernel-Meldungen mit dem Zusatz "iptables:" greppen, um zu sehen, was der Paketfilter alles abgewiesen hat.


   # $IPT -N stateful > /dev/null
   # $IPT -F stateful
   # $IPT -I stateful -m state --state ESTABLISHED,RELATED -j ACCEPT
   # $IPT -A stateful -m state --state NEW -i ! $EXTIF -j ACCEPT
   # $IPT -A stateful -j dump

Ein neuer Regelsatz "stateful" wird definiert, der - wie im 1. Beispiel - die Pakete stateful überprüft und annimmt bzw. bei neuen Verbindungsversuchen von aussen auf das externe Device an den Regelsatz "drop" übergibt, der dann loggt und entsorgt.


   # $IPT -A INPUT -i lo -j ACCEPT
   # $IPT -A OUTPUT -o lo -j ACCEPT

Diese Regeln lassen allen Verkehr auf dem Loopback-Device zu.


   # $IPT -A INPUT -i $EXTIF -p icmp --icmp-type destination-unreachable -j ACCEPT
   # $IPT -A INPUT -i $EXTIF -p icmp --icmp-type time-exceeded -j ACCEPT
   # $IPT -A INPUT -i $EXTIF -p icmp --icmp-type echo-reply -j ACCEPT
   # $IPT -A INPUT -i $EXTIF -p icmp --icmp-type echo-request -j ACCEPT

Einige eingehende ICMP-Pakete werden akzeptiert, um bei Fehlernmeldungen der absendenden Hosts nicht auf das Ende endlose Verbindungsversuche eigener Klienten und Dienste warten zu müssen.


   # $IPT -A INPUT -p tcp -i $EXTIF --dport 113 -j REJECT --reject-with tcp-reset

Eingehende Ident-Anfragen werden generell zurückgewiesen.


   # for i in ${CLASS_A} ${CLASS_B} ${CLASS_C} ${CLASS_D} ${CLASS_E} ${LOOPBACK}
   # do
   #   $IPT -A INPUT -i $EXTIF -s $i -j DROP
   # done

Externe Verbindungsversuche von Netzwerkadressen, die sich nur in LANs befinden sollten, werden sofort "gedropt", da ein "REJECT" die gespoofte Adresse ohnehin nicht erreichen würde.


   # $IPT -A INPUT -j stateful

Dies ist die Catch-All-Regel: Aller andere eingehende Verkehr wird an den Regelsatz "stateful" übergeben, um akzeptiert oder entsorgt zu werden.


3. NAT (Network Adress Translation)

Unter NAT versteht man die Tätigkeit eines Routers: Dieser ermöglicht es einem hinter ihm befindlichen LAN, durch eines seiner Interfaces auf ein anderes Netzwerk-Segment zuzugreifen, in diesem Fall auf das Internet. Man kann dazu einfach das 2. Beispiel verwenden, dass man an geeigneter Stelle noch mit folgenden Regeln aufbohrt:


   # LOCALMASK=`ifconfig $INTIF | awk '/inet addr:/ {sub("Mask:","",$4);print $4}'`
   # NETWORK=`ifconfig $INTIF | awk '/inet addr:/ {sub("Bcast:","",$3);sub("255","0");print $3}'`
   # LOCALNET="${NETWORK}/${LOCALMASK}"

Eingangs des Skriptes sollten noch folgende Variablen definiert werden, die die IP des lokalen Netzes in der Form "192.168.1.0/ 255.255.255.0" zurückliefern.


   # $IPT -P FORWARD ACCEPT

Die Default-Policy für die Kette "FORWARD" wird auf "Akzeptieren" gestellt.


   # $IPT -t nat -A POSTROUTING -s ${LOCALNET} -o $EXTIF -j MASQUERADE

Diese Regel sollte vor der Catch-All-Regel eingefügt werden und führt zur Übersetzung und Weiterleitung aller aus dem LAN kommenden IP-Pakete ins Internet.


Auf einem Router könnte möglicherweise auch noch sinnvoll ein transparenter Proxy integriert werden (bei mir läuft beispielsweise ein "wwwoffle" zum Cachen durch einen "junkbuster" zum Filtern). Dies würde wiederum eine REDIRECt-Regel erfordern, aber dazu gibt es wirklich[tm] gute Dokumentationen. Ich stelle vielleicht später noch 'mal hierzu etwas ins Web.


Valid XHTML 1.0

Zurück zur Main-Site
Impressum
Created with GNU-Emacs on Wed Oct 30 14:21:21 CET 2002

Valid CSS