Thema:
Firewall-regeln unter dem Kernel 2.4 (iptables)
Inhaltsverzeichnis
Was sind Iptables ? Seite 3
Übersicht über die Module von IP-Tables Seite 4
Grundsätzliche Funktionsweise Seite 5
Die drei Tabellen der Netfilter-Architektur Seite 6
Die Tabelle filter Seite 7 51198rte58rbz8y
Was wird praktisch mit den Tabellen gemacht ? Seite 8
Aufruf-Konventionen
Liste der Kommandos Seite 9
Generelle, begleitende Optionen tb198r1558rbbz
Filteroption
Aktion bei erfolgreicher Maskierung Seite 10
Welche Ziele sind wo erlaubt ? Seite 11
Protokolle Seite 12
Fazit Seite 14
Quellenangabe Seite 17
Was sind iptables ?
Bei "iptables" handelt es sich um einen Paketfilter.
Und zwar um einen Paketfilter unter der Linux- Kernel - Version 2.4.
Bei einem Paketfilter handelt es sich um eine Software zur Überwachung von eingehenden und ausgehenden Paketen.
Dabei wird anhand
des Paket - Headers,
der IP - Adresse
des Protokolls
des Ports
vom Senders bzw. vom Empfängers entschieden was mit dem Paket passieren soll.
Es kann akzeptiert werden oder auch verworfen werden (ACCEPT oder DROOPEN).
Dies wird in Form von Regeln in die jeweiligen Tabellen eingetragen (Dazu später mehr).
In Linux sind seit der 1.1 Kernel - Version Paketfilter enthalten.
Die erste Version (basierend auf "ipfw" von BSD) wurde 1994 portiert.
Diese Version wurde dann weiter entwickelt und mit Hilfe des Tools "ipfwadm" im Kernel 2.0 verwendet.
Ab dem Kernel 2.2 kam "ipchains" zum Einsatz und Mitte 1999 mit der neu überarbeiteten Kernel - Version 2.4 das Tool "iptables".
Iptables besteht aus 2 Komponenten :
den Kernel Modulen
den Userspace-Kommandos
Wenn man Iptables verwenden will muss man die Userspace-Kommandos installieren. Bei Mandrake, RedHat, SuSE und anderen Verwandten Linux-Distributionen liegt diese Software meistens als rpm-Paket vor.
z.B bei Mandrake bei einem erst ab i586-kompatiblen Rechner:
iptables-1.2.5-1mdk.i586.rpm
Ob sie schon installiert ist überprüft man einfach mit dem Befehl:
rpm -q iptables
Wenn das nicht der Fall sein sollte, einfach installieren
Man wechsle also am besten zuerst in das Verzeichnis wo sich das rpm-Paket befindet (Wichtig: Als Root ).In unserem Falle z.B ins Verzeichnis
/mnt/nfs/mdk-82/i586/Mandrake/RPMS/
Und installiert das Programm Paket
rpm -i iptables-1.2.5-1mdk.i586.rpm
und dazu muss man noch das Modul "ip_tables" laden,
wenn es denn noch nicht geladen ist.
Überprüfen kann man das mit dem Befehl:
lsmod | grep –i ip
und falls es dann nötig ist, kann man das Modul mit folgendem Befehl laden:
insmod ip_tables
Wenn es dann zu Fehlermeldungen kommt muss man den Kernel neu konfigurieren.
Und sollte man einen Rechner als Firewall einsetzen wollen dann,
muss IP-Forwarding aktiviert sein.
Dies macht man (als Root) mit dem Befehl:
echo1> /proc/sys/net/ipv4/ip_forward
Iptables enthält auch ein Kompatibilitäts-Modul für ipchains
(Name des Moduls: ipchains)
und auch eins für ipfwadm (Name des Moduls: ipfwadm).
Diese Module schließen sich aber gegenseitig aus. Das zuerst geladene Modul "gewinnt". Bei SuSE 7.2 zum Beispiel wird in einem Initialisierungs-Skript das Kernel-Modul "ipchains" geladen. Dann funktioniert "iptables" nicht.
Übersicht über die Standard-Module von IP-Tables
Modul |
Beschreibung |
Modul |
Beschreibung |
iptable_nat |
Implementiert die Tabelle nat |
iptable_mangle |
implementiert Tabelle mangle |
iptable_filter |
Implementiert die Tabelle filter |
ipt_unclean |
noch nicht getestet (experimental) |
ipt_tos |
Filter für type of service |
ipt_state |
Filter für Verbindungsstatus |
ipt_owner |
Filter auf erzeugenden Nutzer (lokal) |
ipt_multiport |
Filter für mehrere Ports auf einmal |
ipt_mark |
Filter auf MARK-Symbole von Paketen |
ipt_mac |
MAC-Filter |
ipt_limit |
Begrenzerfilter |
ipt_TOS |
type of service setzen |
ipt_REJECT |
Zurückweisen von Paketen |
ipt_REDIRECT |
transparentes Umleiten von Paketen |
ipt_MIRROR |
paket mirroring (source, destination) |
ipt_ MASQUERADE |
Masquerading |
ipt_MARK |
packet marking |
ipt_LOG |
packet logging (Target LOG) |
ipfwadm |
ipfwadm Kompatibilitaets-modul |
ipchains |
ipchains Kompatibilitaets-modul |
ip_queueing |
packet queueing (Weiterreichen an Userspace) |
ip_nat_ftp |
NAT-Support für FTP |
ip_contrack_ftp |
dasselbe für FTP |
ip_conntrack |
Verbindungsverfolgung (connection tracking) |
Diese so genannten Kernel-Module befinden sich in den Verzeichnissen :
/lib/modules/2.4.*/kernel/net/ipv4/netfilter/
/lib/modules/2.4.*/kernel/net/ipv6/netfilter/
Bei der C’t-HEISE-Knoppix-Version (4/2003) z.B in den Verzeichnissen:
/lib/modules/2.4.20-xfs/kernel/net/ipv4/netfilter/
/lib/modules/2.4.20-xfs/kernel/net/ipv6/netfilter/
Grundsätzliche Funktionsweise
Am Weg den ein Datenpaket durch den Kernel macht, möchte ich die Funktion verständlicher machen.
INPUT |
Alle Pakete die an einen lokalen Prozess gerichteten sind landen hier. |
OUTPUT |
Alle Pakete die von einem lokalen Prozess ausgehen sind laufen hier durch. |
PREROUTING |
Kurz bevor eine Routing-Entscheidung getroffen wird, müssen die Pakete hier durch (Erstes Paket). |
FORWARD |
Hier müssen alle zu routenden Pakete durch. |
POSTROUTING |
Alle zu routenden Pakete laufen nach dem Routing hier durch. |
In diesen Chains sind entsprechende Regeln einzutragen, um bestimmte Zwecke zu erreichen bzw. bestimmte Schutzvorrichtungen aufzubauen.
Man kann aber noch benutzerdefinierte Chains hinzufügen.
Die drei Tabellen(tables) in der Netfilter-Architektur
In IPtables gibt es drei Arten von Tabellen:
Diese "tables" haben den Zweck, die verschiedenen Arten der Paketbehandlung auf Module zu verteilen und nur die Module zu laden, die grade bzw. für die gestellte Anforderung benötigt werden.
Jeder dieser Tabellen erthält eigene Regeln.
filter
Die Standard-Tabelle ist filter, die immer dann verwendet wird, wenn keine andere Tabelle ausdrücklich angegeben wird, deswegen schauen wir sie uns auf der nächsten Seite genauer an.
Diese Tabelle besteht aus den Chains (Ketten): INPUT, FORWARD, OUTPUT.
Man kann aber noch (wie gesagt) benutzerdefinierte Chains hinzufügen.
nat
Die Tabelle nat dient der Network Adress Translation bzw. dem Port-Forwarding.
Sie besteht aus den chains: PREROUTING, OUTPUT und POSTROUTING.
Diese Chains werden für jedes erste Paket einer neuen Verbindung aufgerufen und führen Änderungen an den Port-Nummern oder an den IP-Nummern der Pakete durch.
mangle
In der Tabelle mangle können tiefer greifende Änderungen an den Paketen vorgenommen werden. Die Pakete können markiert werden oder eine TOS (Type of Service Bits) Manipulation kann vorgenommen werden.
Diese Tabelle besteht aus den Chains: PREROUTING und OUTPUT.
Diese Tabellen gibt es nur wenn Regeln in diesen Tabellen angelegt worden sind.
Das bedeutet, dass die Effizienz eines solchen Paketfilters eventl. sehr hoch sein kann.
Denn wenn man nur einfache Filterfunktionen nutzt, müssen die nicht vorhandenen Tabellen gar nicht erst geladen und durchlaufen werden. Das spart halt Zeit.
Ex muss aber sehr auf den Zusammenhang zwischen Tabellen und Ketten (tables/Chains) geachtet werden. Um darüber Überblick zu schaffen habe ich diesem Thema eine Seite gewidmet, später mehr dazu.
Die Tabelle filter
Wenn ein Paket eine Kette erreicht, wir diese Kette untersucht und das Schicksal des Paketes bestimmt. Wenn die Kette besagt dass das Paket zu verwerfen ist ,wird es verworfen (gelöscht). Wenn die Kette es akzeptiert wird das Paket weitergeleitet.
Jede Kette besteht aus Regeln, in den Regeln ist festgelegt was mit den jeweiligen Paketen passieren soll. Diese Regeln werden solange untersucht bis die Regel die auf das Paket zutrifft gefunden ist. Wenn keine Regel gefunden wird, wird der Kernel sich die Policy der Kette ansehen und entscheiden was passieren soll.
In diesem Fall sollte das Paket verworfen werden (Die Policy sollte so gesetzt sein).
1.Der Kernel sieht sich die Zieladresse des eingehenden Paketes an (Routing).
2.Wenn das Paket für diesen Rechner bestimmt ist, kommt es in die INPUT-Kette.
Danach bekommt der wartende Prozess das Paket .
3.Wenn aber das Paket für eine anderes Interface gedacht ist geht direkt zur
FORWARD- Kette.
Wenn es dort akzeptiert wird, kann es weiter geleitet werden
(IP-Forwarding muss aktiviert sein).Wenn nicht werden die Pakete einfach verworfen.
4.Pakete die von diesem Rechner verschickt werden sollen, kommen direkt in die
OUTPUT-Kette. Falls diese Pakete dann akzeptiert werden, können sie zu anderen
Schnittstellen weitergeleitet werden.
Was wird praktisch mit den Tables/Chains gemacht ?
Nochmal auf ein Blick:
Table/Chain |
|
filter/INPUT |
hier landen alle Pakete, die an einen lokalen Prozess gerichtet sind. Damit lassen sich Zugriffe auf lokale Prozesse hier perfekt regulieren, z.B.:
Zugriff auf einen lokal laufenden Server nur aus bestimmten Netzen
Nur Pakete durchlassen, die zu einer bestehenden Verbindung gehören
|
filter/OUTPUT |
hier gehen alle Pakete durch, die von einem lokalen Prozess erzeugt wurden. Damit lassen sich lokale Prozesse nach außen schützen, z.B.:
|
filter/FORWARD |
durch diese Chain gehen alle Pakete durch, die durch diese Maschine geroutet werden. Hiermit lassen sich also alle Rechner in jeweils dem Zielnetz des Routing schützen, z.B.:
kein UDP nach außen, außer DNS
keine öffnenden Verbindungen nach innen
Pakete, die zu keiner Verbindung gehören, werden gefiltert
|
nat/PREROUTING |
Wenn Adress-Übersetzungen durchgeführt werden, müssen alle Pakete vor dem Routing hier durch.
Hier lassen sich von zu routende Pakete verändern:
die Ziel-IP-Adresse
der Ziel-Port
|
nat/OUTPUT |
vom lokalen Rechner stammende Pakete
gehen hier durch;
Änderungen genauso wie bei nat/PREROUTING. |
nat/POSTROUTING |
Hier gehen nochmals alle Pakete, die geroutet worden sind, durch (auch lokal erzeugte Pakete). Hier werden Angaben über die Herkunft eines Paketes verändert,wie:
|
mangle/PREROUTING
mangle/OUTPUT |
ähnlich den "nat" Chains, nur mit dem Unterschied,
dass hier spezielle Paket-Parameter geändert werden können, wie:
|
Aufruf-Konventionen
Die Kommandos werden in Groß-Buchstaben geschrieben. z.B. -A
Die Ziele werden mit großen Wörtern geschrieben z.B. ACCEPT
Die Chains auch aus einen Wort in groß. z.B. INPUT
Tabellen werden aus einen Wort in klein geschrieben. z.B. filter
Kommandos*
-A |
<Chain-Name> |
<regel > |
Eine Regel an das ENDE einer Chain/Tabelle anfügen |
-D |
<Chain-Name> |
<regel > |
Eine Regel aus einer Chain/Tabelle löschen |
-C |
<Chain-Name> |
<regel > |
Ein Paket testen mit bestimmten Bedingungen auf eine Chain/Tabelle |
-R |
<Chain-Name> |
<Nr> <regel > |
Ersetzen einer Regel durch eine neue Regeln |
-I |
<Chain-Name> |
<Nr> <regel > |
Eine Regel am ANFANG einer Tabelle/Chain einfügen |
-L |
[<Chain-Name>] |
|
Die Regeln einer Tabelle/Chain auflisten |
-F |
[<Chain-Name>] |
|
Alle Regeln einer Tabelle/Chain löschen.
Wenn keine Chain angegeben wird ,werden alle Chains geleert. |
-Z |
[<Chain-Name>] |
|
Stellt Paket- und Bytezähler einer Chain auf Null |
-N |
<Chain-Name> |
|
Erstellt eine benutzerdefinierte Chain |
-X |
<Chain-Name> |
|
Löscht eine benutzerdefinierte Chain |
-P |
<Chain-Name> |
<Ziel> |
Legt die Policy einer Chain fest |
-E |
<Chain-Name> |
<Neuer Chain-Name> |
|