iptables -- System vom Kernelmodulen (ab Kernel 2.4), Teil des Netzwerkcodes (IP-Stack) im Kernel. Bietet die Möglichkeit, IP-Pakete anhand von statischen Regeln zu filtern/manipulieren usw. Filterung geschieht durch deklarativ in kernel-internen Datenstrukturen festgehaltene Regeln. Änderung dieser Datenstrukturen geschieht vom Userspace aus mit dem Programm iptables(8). IP-Forwarding wird aktiviert durch echo 1 >/proc/sys/net/ipv4/ip_forward RTFM: man iptables, IP-Masquerading-Howto Die Datenstrukturen sehen grob so aus: //Auf oberster Ebene gibt es Tabellen : list <> //Jede Tabelle hat einen Namen und eine Sequenz von Chains Table: name: string chains: list[Chain] //Eine Chain enthält eine Policy (Default-Paketverarbeitungsregel, siehe unten) //und eine Sequenz von Regeln Chain: name: string policy: ACCEPT | DROP | QUEUE | RETURN | user_defined_chain_name: string //policy nur in vordefinierten Chains, nicht in vom Benutzer erzeugten Chains rules: list[Rule] Defaultmaessig existieren folgendende Instanzen der Datenstrukturen: Table: name="filter" chains=( Chain: name="INPUT" policy= ACCEPT rules= () Chain: name="FORWARD" policy= ACCEPT rules= () Chain: name="OUTPUT" policy= ACCEPT rules= () ) Table: name="nat" chains=( Chain: name="PREROUTING" policy= ACCEPT rules= () Chain: name="POSTROUTING" policy= ACCEPT rules= () Chain: name="OUTPUT" policy= ACCEPT rules= () ) Table: name="mangle" chains=( Chain: name="PREROUTING" policy: ACCEPT rules: () Chain: name="OUTPUT" policy= ACCEPT rules= () ) Ein zu verarbeitendes Paket wird zunächst nach Standardregeln in best. Chains in best. Tabellen eingeordnet. Die Standardregeln sind: - Pakete, von diesem Rechner stammen (von einem Prozess auf diesem Rechner erzeugt wurden), kommen nach filter/OUTPUT - Pakete, die an diesen Rechner adressiert sind, kommen nach filter/INPUT - zu routende Pakete (stammen von einem anderen Rechner, sind adressiert an einen anderen Rechner) kommen nach filter/FORWARD TODO: Die Tabellen "nat" und "mangle" muss ich mir noch näher anschauen. Anschließend werden die Regeln in der Chain der Reihe nach abgesucht, bis eine gefunden wird, die auf das zu verarbeitende Paket "matcht" (wird über Attribute der Regel besteimmt -- s.u.). Wird eine solche Regel gefunden, entscheidet sie über das weitere Schicksal des Pakets. Wird keine solche Regel gefunden, entscheidet die Policy der Chain über das Paket: ACCEPT bedeutet "Paket akzeptieren, d.h. durchlassen", DROP bedeutet "Paket wegwerfen", QUEUE bedeutet "im Userspace weiterverarbeiten (TODO: elaborate)", RETURN bedeutet "in aufrufender Chain (muss existieren) mit der Verbeitung fortfahren (Regeln in einer Chain können Pakete an andere Chains weiterschicken -- s.u.)". //Eine Regel Rule: ///////////////////////////////////////////////////// //--- Attribute, die zur Entscheidung, ob diese Regel // ein geg. Paket "matcht", herangezogen werden //Protokoll des zu verarbeitenden Pakets (IP definiert //ein "protocol"-Headerfeld). Default: all protocol: tcp | udp | icmp | all //Quelladresse, Zieladresse source: IPAdddress destination: IPAdddress //NW-Interface, über das das Paket hereinkam in_iface: NWInterface //NW-Interface, über das das Paket hinausgehen wird in_iface: NWInterface //erweiterte Matching-Regeln, die die Entscheidung an //andere Kernelmodule writerleiten (da gibt es etliche -- //siehe "man iptables" und Kernelkonfiguration) extended_matching_rules: list[(match_module, module_options)] ///////////////////////////////////////////////////// //--- Weiterverarbeitung des Pakets im Falle eines // erfolgreichen Matches //Paket kann akzeptiert, weggeschmissen, an andere Chain //(derselben Tabelle?) weitergeleitet, ..... werden //Siehe Dokumentation target: chainname: string | ACCEPT | DROP | LOG | TOS | ... Manipulation der Datenstrukturen mit iptables(8): -- Alle Chains einer Tabelle mit allen ihren Regeln listen: iptables [-t
] -L -v wird die table nicht angegeben, wird "filter" angenommen. Gilt auch für alle anderen iptables-Aufrufe. -- Alle Chains einer Tabelle löschen: iptables [-t
] -F -- Policy einer Chain setzen (nur in vordefinierten Chains) iptables [-t
] -P == ACCEPT | DROP | QUEUE | RETURN | -- neue Regel an eine Chain anhaengen iptables [-t
] -A spezifiziert die Attribute der Regel, z.B. -p -s -d -i -o -m -j == ACCEPT | DROP | QUEUE | RETURN | (siehe oben) -- neue Regel irgendwo in eine Chain einfuegen iptables [-t
] -I [] : 1-basierter Index der Regel, *vor* der die neue Regel eingefuegt werden soll. Default: 1 (neue Regel an den Anfang setzen) -- Regel irgendwo in einer Chain loeschen iptables [-t
] -D [] -- Regel ersetzen... -- neue benutzerdefinierte Chain anlegen iptables [-t
] -N