Firewall

iptables

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.

Tabellen

iptables unterscheidet dabei zwischen vier (bzw. eigentlich fünf) wichtigen Tabellen:

  • filter: enthält alle reinen Filterregeln
  • nat: wird für NAT und spezielle Port-Weiterleitungen eingesetzt
  • mangle: Tabelle zur Markierung & Manipulation von Datenpaketen
  • raw: ermöglicht, Ausnahmen vom normalerweise aktiven Connection Tracking (z.B. zu TCP Connections) zu definieren oder dieses sogar ganz auszuschalten
  • security: ungenutzt

Chains

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.

Regel-Aktionen

Regeln können mit folgenden Aktionen sowie einem Jump in eine andere Chain versehen werden.

  • ACCEPT: Paket akzeptieren und weitergeben
    • Verarbeitung wird in der aktuellen Tabelle beendet
  • DROP: Paket droppen, nicht weiterleiten
  • REJECT: Paket droppen und den Absender darüber informieren
  • LOG: Einen Logeintrag hinterlegen und weitermachen (nächste Regel prüfen)
  • RETURN: Return an den Caller / Aufrufer
    • Verarbeitung in der aktuellen Chain beenden
    • Zurück zur vorigen Chain, falls die aktuelle Chain via Jump aufgerufen
    • Falls die aktuelle Chain eine Default Chain ist: Default Policy der Chain anwenden

Packet Flow

Iptables-Flow aus: Iptables packet flow (and various others bits and bobs), abg. am 14.12.2023

iptables CLI

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

Show Script of Rule

iptables -S [<chain_name>] [<line_no>]

Insert Rule

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.

Append Rule

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.

Delete Rule

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>

Replace Rule

iptables -R <chain_name> <line_no> <new_rule>

Add New Chain

iptables -N <chain_name>

Delete Chain

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>

Delete Chains in Table

iptables --table <table_name> --delete-chain

Edit Chain Name

iptables -E <chain_name> <new_chain_name>

Reset Counters

iptables -Z [chain_name] [line_no]

Module

iptables kann durch Module ergänzt werden. Hier sind einige davon aufgezählt.

Match Set (ipset)

-m set --match-set <set_name> src | dst

Multiple Ports

-m multiport --dports <ports_or_port-range>

Comment

-m comment --comment <content>

Expiration Time

Die Uhrzeit ist in UTC+0 anzugeben

-m time --datestop <yyyy-mm-dd>T<hh:mm:ss>

ipset

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.

List Sets

ipset l -n

List Set Entries

ipset l <set_name>

Create Set

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]

Rename Set

ipset rename <set_name> <new_set_name>

Add Entry

ipset add <set_name> <ip> [--comment <comment>]

Delete Entry

ipset del <set_name> <ip>

Flush Set

ipset flush <set_name>

Destroy Set

ipset destroy <set_name>