:: Home :: Computing :: Downloads :: Scooter :: 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.
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.
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.
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.
Zurück zur Main-Site |