Besser Filtern mit IP Tables
Seite 2: Regelgerecht
Trifft bei der Bearbeitung eines Paketes eine Regel in der gerade zuständigen Chain zu, bestimmt ein so genanntes Ziel, das man über -j angibt, über das weitere Schicksal des Paketes. Das Ziel kann entweder eine benutzerdefinierte oder eine vordefinierte Aktion sein. ACCEPT lässt ein Paket passieren, DROP verwirft es. REJECT lässt Pakete ähnlich wie DROP verschwinden, informiert den Absender des Paketes jedoch mit einer Fehlermeldung über das Internet Control Message Protocol (ICMP). Nach einem ACCEPT, DROP oder REJECT ist die Arbeit in einer Chain beendet, alle folgenden Regeln werden ignoriert. Trifft keine der Regeln zu, bestimmt die Default-Einstellung der Regelkette das weitere Schicksal des IP-Paketes, die Voreinstellung für INPUT und OUTPUT ist ACCEPT, sollte in der Praxis aber besser auf DROP gesetzt werden. Default Policy der FORWARD-Chain ist DROP, ist gar kein Ziel angegeben, wird nur der Paketzähler inkrementiert.
Regelgerecht
Um eine Filterregel in einer Chain zu erstellen, verwendet man das Kommando iptables:
iptables command <Chain> <match> -j <Ziel>
Der Befehl add (iptables -A) hängt eine eine neue Regel an das Ende einer Regelkette an. Löschen kann man sie mit delete (iptables -D <Regelnummer>), replace ersetzt (iptables -R <Regelnummer>) und insert (iptables -I <Regelnummer>) fügt Regeln ein. iptables -L listet die Regeln einer Chain auf; iptables -F (flush) löscht analog alle Einträge einer oder aller Regelketten. Meist schreibt man sich ohnehin ein Shell-Skript zum Erzeugen der Regeln. Am Anfang löscht man alle Regeln mit flush und fügt dann alle erforderlichen Regeln mit add hinzu.
Zu den Regeln gehören so genannte Matches, die darüber entscheiden, ob die regel anzuwenden ist. Will man Pakete mit bestimmten IP-Adressen ausfiltern, so gibt man den Absender mit -s (source) oder den Empfänger mit -d (destination) an. Statt einzelner Adressen kann man auch ganze Subnetze blockieren:
iptables -A INPUT -s 192.168.1.0/24 -j DROP
Die Tabelle muss hier nicht explizit angegegen werden, da filter die Default-Table ist. Die IP-Protokolle lassen sich über -p tcp, -p udp oder -p icmp ansprechen. TCP- und UDP-Ports gibt man mit den Optionen --sport (source port) und --dport (destination port) an. Auch Port-Bereiche sind möglich: Bei mehreren aufeinander folgenden Ports nennt man einfach Anfang und Ende des Bereiches, getrennt durch einen Doppelpunkt. So verbietet beispielsweise der Befehl
iptables -A INPUT -p tcp --dport 1:1023 -j DROP
alle eingehenden Verbindungen auf privilegierten Ports.
Die meisten Argumente lassen sich durch ein vorangestelltes ! invertieren: Die Regel trifft dann auf alle Pakete zu, die den formulierten Bedingungen nicht entsprechen.
iptables -A INPUT -d ! 192.168.1.0/24 -j DROP
verweigert die Annahme aller Pakete, die nicht für den Adressbereich 192.168.1.0 bis 192.168.1.255 bestimmt sind. Bei der Eingabe direkt auf der Shell muss man dem ! meist ein\ voranstellen. Durch die Angabe von "-i ppp0" kann man solche Regeln auch auf ein bestimmtes Interface beschränken.