Seit dem Kernel 2.4 wird über die sogenannte Netfilter-Infrastruktur im Linux-Kernel das manipulieren des Netzwerkverkehrs ermöglicht (Firewall). Die Konfiguration des Netfilters im Kernel 2.4/2.6 wird über des Tool iptables
(/sbin/iptables
) durchgeführt.
Das Regelwerk dem die Netfilter-Infrastruktur folgt, ist in sogenannte „Tabellen“ (Tables) aufgebaut, die wiederum „Ketten“ (Chains) enthalten, die wiederum „Regeln“ (Rules) enthalten.
Die Art der Verarbeitung ist in verschiedene „Tabellen“ (Tables) unterteilt. iptables
besitzt standardmäßig drei Tabellen
Die Tabelle mangle (übersetzt: zerhauen) ermöglicht es dem Kernel, Daten im „Paket-Header“ zu verändern.
Die Tabelle nat ermöglicht es interne und externe IP-Adressen zu übersetzen. Regeln in dieser Tabelle ändern die IP-Adresse und/oder den Port des Ziels.
Die Tabelle filter prüft alle für die Firewall ankommenden Pakete und entscheidet, ob diese durchgelassen oder geblockt werden.
Die „Ketten“ (Chains) sind innerhalb der Tabellen und können aus fünf verschiedenen Typen bestehen
Die „Regeln“ (Rules) entscheiden darüber, was mit einem Paket passieren soll. Jede „Regel“ besitzt bestimmte „Parameter“, mit denen sie ermittelt, wie mit dem Paket verfahren werden soll. Für die „Regeln“ gibt es sechs „Ziele“ oder „Methoden“ für alle „Ketten“ und drei zusätzliche für die „Tabelle“ nat
, die angewandt werden.
syslog
Zusätzliche „Ziele“ und „Methoden“ der „Tabelle“ nat
.
Die Tabellen enthalten immer folgende Ketten
Die folgenden Ketten
besitzen immer eine „Standard-Regel“.
Nun stellt sich die Frage, in welcher Reihenfolge ein Paket die „Tabellen“ (Tables), „Ketten“ (Chains) und „Regeln“ (Rules) durchläuft? Die Antwort sieht so aus:
Paket | | | +—————————→Routing +—————————→lokaler Prozess | ↑ ↓ ↑ | +————————→+ | | +———————+———————+ | | ↑ | ↓ | ↓ ↓ | ↓ | ↓ mangle | mangle mangle | mangle | mangle PREROUTING | FORWARD INPUT | OUTPUT | POSTROUTING | | | | | | | | | | | | | | | | ↓ | | | | ↓ | ↓ nat | | | | nat | nat PREROUTING | | | | OUTPUT | POSTROUTING | | | | | | | | ↓ | | | | | | | +————————→+ ↓ ↓ | ↓ | | filter filter | filter | | FORWARD INPUT | OUTPUT | | | | | | | | | | | | | | | +————————→+ ↓ | | +——————————————————————————————————————————→+————————→+ | | ↓ Paket
Mit iptables
ist es nun möglich „Regeln“ (Rules) innerhalb der Ketten (Chains), welche in den Tabellen (Tables) sind, zu erstellen, zu ändern und zu löschen.
Befehl | Kürzel | Beschreibung |
---|---|---|
–append | -A | Hängt eine neue Regel an |
–delete | -D | Löscht eine bestehende Regel |
-D pos | Löscht eine bestehende Regel an der Position pos | |
–insert | -I | Fügt eine neue Regel hinzu |
-I pos | Fügt eine neue Regel an der Position pos hinzu | |
–replace | -R pos | Ändert eine bestehende Regel an der Position pos |
–list | -L | Listet alle Regeln auf |
-L chain | Listet alle Regeln der Kette chain auf | |
–flush | -F | Löscht alle Regeln |
-F chain | Löscht alle Regeln der Kette chain | |
–zero | -Z | Löscht den Aufrufzähler der Regeln |
-Z chain | Löscht den Aufrufzähler der Regeln in der Kette chain | |
–new | -N chain | Erstellt eine benutzerdefinierte Kette chain |
–delete-chain | -X | Löscht eine benutzerdefinierte Kette |
-X chain | Löscht eine benutzerdefinierte Kette chain | |
–policy | -P chain target | Setzt in einer Kette chain die Methode target |
–rename-chain | -E old new | Umbenennen einer Kette old nach new inkl. Ref. |
–version | -V | Version von iptables . |
Option | Kürzel | Beschreibung |
---|---|---|
–proto | -p proto | Das Protokoll auf das die Regel angewendet werden soll. Oft werden hier für proto z.B. tcp, udp, icmp, oder all benutzt. Es können auch die numerischen Werte für IP benutzt werden. Eine Aufstellung finden Sie meist in der Datei /etc/protocols vor. |
–source | -s address[/mask] | Die Quelladresse des Pakets. Benutzt werden kann für adress/[mask] ein Hostnamen, IP-Adresse oder Netzwerkadresse. Falls kein Wert angegeben wird, wird -s 0/0 benutzt (= alle Adressen). Von der Verwendung eines Hostnamens ist aus Gründen der Performance abzuraten, da dieser erst aufgelöst werden müsste! |
–destination | -d address[/mask] | Die Zieladresse des Pakets. Ansonsten siehe –source |
–in-interface | -i input-name[+] | Die Netzwerkschnittstelle, die das Paket empfängt. Als Argument für input-name[+] gilt der Name der Schnittstelle z.B. eth0 .Ein + nach dem Namen gilt als Platzhalter (eth+ gilt für eth0, eth1, usw.)Nur die Ketten PREROUTING, FORWARD und INPUT haben eine Input-Schnittstelle! |
–jump | -j target | Hier wird festgelegt, was mit dem Paket geschieht, wenn die Regel zutrifft. Als Argument target werden meist die bekannten Methoden der „Regeln“ verwendet. z.B. -j ACCEPT |
–goto | -g chain | Sprung aus einer aktuellen „Kette“ in die angegeben „Kette“ chain ohne Rücksprung in die Usprungskette. |
–match | -m match | Angabe einer match Erweiterung, siehe auch –proto |
–numeric | -n | Ausgabe von IP-Adressen und Ports in numerischer Darstellung z.B. 0.0.0.0/0 |
–out-interface | -o output-name[+] | Die Netzwerkschnittstelle, über die das Paket gesendet wird. Als Argument für input-name[+] gilt der Name der Schnittstelle z.B. eth0 .Ein + nach dem Namen gilt als Platzhalter (eth+ gilt für eth0, eth1, usw.)Nur die Ketten FORWARD, OUTPUT und POSTROUTING haben eine Output-Schnittstelle! |
–table | -t table | Hier wird die „Tabelle“ angegeben, auf die sich die „Regel“ bezieht. Die „Tabelle“ filter ist die „Standard-Tabelle“. |
–line-numbers | Ausgabe von Zeilennummern, bei einer Ausgabe z.B. -L | |
–exact | -x | Ausgabe von exakten Zahlenangaben z.B. nicht 437K sondern 437456 |
–fragment | -f | Wenn ein Paket zu groß ist um es an einem Stück zu versenden, dann wird dies in mehrere Teile (Fragmente) aufgeteilt. Der erste Teil enthält die kompletten Header-Informationen und wird wie ein vollständiges Paket behandelt. Die nachfolgenden Teile, enthalten nur noch Teilinformationen. Mit diesem Parameter können Regeln auf die nachfolgenden Teilstücke erstellt werden. |
Durch voranstellen des Zeichens ! können bei fast allen Befehlen (nur da wo es natürlich Sinn macht) die „Regeln“ negiert werden!
Eine ausführliche und weiterführende Dokumentation kann unter folgendem Link nachgeschlagen werden: