./root/iptables.txt

download original
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
<topmost>: list<Table> <<singleton>>


//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 <table>] -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 <table>] -F


-- Policy einer Chain setzen (nur in vordefinierten Chains)

  iptables [-t <table>] -P <chainname> <policy>

  <policy> == ACCEPT | DROP | QUEUE | RETURN | <user-defined chain name>


-- neue Regel an eine Chain anhaengen

  iptables [-t <table>] -A <chainname> <rule-specification...>


  <rule-specification> spezifiziert die Attribute der Regel, z.B.

  -p <port>
  -s <source-address>
  -d <dest-address>
  -i <in-interface>
  -o <out-interface>
  -m <match-extension-module> <module-specific options...>

  -j <target-spec>

    <target-spec> == ACCEPT | DROP | QUEUE | RETURN | <user-defined chain name>
      (siehe oben)


-- neue Regel irgendwo in eine Chain einfuegen

  iptables [-t <table>] -I <chainname> [<rulenum>] <rule-specification...>

  <rulenum>: 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 <table>] -D <chainname> [<rulenum>] 


-- Regel ersetzen...


-- neue benutzerdefinierte Chain anlegen

  iptables [-t <table>] -N <chainname>

  
back to root

(C) 1998-2017 Olaf Klischat <olaf.klischat@gmail.com>