Mit Hilfe des Userspacetools iptables wird der Linux IP-Paketfilter netfilter konfiguriert. Dieser beinhaltet Tabellen, die die Ketten (chains) und Regeln (rules) zur Filtrierung des Datenstroms bereitstellen.
iptables unterscheidet dabei zwischen vier (bzw. eigentlich fünf) wichtigen Tabellen:
Jede Tabelle enthält verschiedene Regelketten (Chains). Diese bestimmen dabei, wann ein Paket geprüft wird und unterscheiden, woher ein Paket stammt und bzw. oder wohin es gesendet werden soll. Zusätzlich zu den 5 Default Chains können den Tabellen weitere Chains hinzugefügt werden. Mit einem Jump kann man anschließend zu einem der eigenen Chains springen.
Die 5 Default Chains sind:
| Chain | Table | Beschreibung / Zweck |
|---|---|---|
| PREROUTING | raw, mangle, nat | von einem Interface empfangene Pakete |
| INPUT | mangle, nat, filter | an eine lokale IP gerichtete Pakete |
| FORWARD | mangle, filter | Pakete von einem anderen an einen anderen |
| OUTPUT | raw, mangle, nat, filter | von einem lokalen Prozess stammende Pakete |
| POSTROUTING | mangle, nat | alle Pakete vor Übergabe an das vorgesehene Interface |
Jede Chain hat grundsätzlich eine Default Policy. Diese bestimmt, welche Regel angewandt wird, falls keine Regeln der Chain gematcht werden konnten.
Regeln können mit folgenden Aktionen sowie einem Jump in eine andere Chain versehen werden.
aus: Iptables packet flow (and various others bits and bobs), abg. am 14.12.2023
Nutze niemals das Kommando iptables -F [chain_name | table_name], außer du willst es riskieren, versehentlich alle Regeln in allen Tabellen zu löschen!
Für <src> und <dst> kann jeweils eine IP Adresse (auch in CIDR Notation) oder ein ipset mittels -m set --match-set <set_name> src | dst eingesetzt werden.
Zur Konfiguration von NAT, siehe: NAT via iptables
iptables -S [<chain_name>] [<line_no>]
iptables -I <chain_name> <line_no> -s <src> -d <dst> -p <proto> --dport <ports> [-m comment --comment <comment_content>] -j <action>
Diese Regel wird in der genannten Chain in Zeile <line_no> eingefügt. Die Zeilennummer ist 1, falls nicht gesetzt. Alle unter der Zeilennummer liegenden Regeln werden eine Zeile runter gerückt.
iptables -A <chain_name> -s <src> -d <dst> -p <proto> --dport <ports> [-m comment --comment <comment_content>] -j <action>
Dadurch wird die Regel am Ende der Chain hinzugefügt.
iptables -D <chain_name> <line_no>
Die Regel im genannten Chain in der genannten Zeile wird gelöscht.
Es ist jedoch auch möglich, die mittels -S ermittelte Regel durch Eingabe des Regels zu löschen:
iptables -D <chain_name> <rule>
iptables -R <chain_name> <line_no> <new_rule>
iptables -N <chain_name>
Dies funktioniert nur dann, wenn in der Chain auch keine Regeln mehr bestehen. Ansonsten wäre die davon abgeratene Methode iptables -F [chain_name] zu verwenden.
iptables -X <chain_name>
iptables --table <table_name> --delete-chain
iptables -E <chain_name> <new_chain_name>
iptables -Z [chain_name] [line_no]
iptables kann durch Module ergänzt werden. Hier sind einige davon aufgezählt.
-m set --match-set <set_name> src | dst
-m multiport --dports <ports_or_port-range>
-m comment --comment <content>
Die Uhrzeit ist in UTC+0 anzugeben
-m time --datestop <yyyy-mm-dd>T<hh:mm:ss>
Wie unter den Modulen zuvor ersichtlich, kann die Quelle oder das Ziel einer Regel auch mit dem set Modul angegeben werden. Dazu ist mittels ipset ein set aus den jeweiligen Adressen bzw. Netzen zu erstellen.
ipset l -n
ipset l <set_name>
Statt hash:netkönnen auch andere Set Typen wie bitmap:ip, hash:ip, hash:ip,port, hash:ip,mac, etc. verwendet werden. Jeder der nach dem Doppelpunkt genannten kommagetrennten Parameter sind erforderlicherweise beim Hinzufügen eines Eintrages ins Set anzugeben.
ipset create <set_name> hash:net [comment] [counters]
ipset rename <set_name> <new_set_name>
ipset add <set_name> <ip> [--comment <comment>]
ipset del <set_name> <ip>
ipset flush <set_name>
ipset destroy <set_name>