Du musst NAT-Regeln erstellen, die dem Kernel sagen, was fuer Verbindungen
er aendern soll, und wie er sie aendern soll. Um das zu tun, setzen wir
das vielseitige iptables
Tool ein und sagen ihm durch das Angeben
der '-t nat' Option, dass es die NAT-Tabelle aendern soll.
Die Tabelle der NAT-Regeln enthaelt drei Listen, die 'Ketten' genannt werden: Alle Regeln werden der Reihe nach untersucht, bis eine davon zutrifft. Die drei Ketten heissen PREROUTING (fuer Destination NAT, da die Pakete hereinkommen), POSTROUTING (fuer Source NAT, da die Pakete ausgehen) und OUTPUT (fuer Destination NAT von lokal generierten Paketen).
Wenn ich irgendein kuenstlerisches Talent haette, wuerde dieses Diagramm es ganz gut zeigen:
_____ _____
/ \ / \
PREROUTING -->[Routing ]----------------->POSTROUTING----->
\D-NAT/ [Entscheidung] \S-NAT/
| ^
| __|__
| / \
| | OUTPUT|
| \D-NAT/
| ^
| |
-------->Lokaler Prozess------
Wenn ein Paket durchgeht, schauen wir an jedem der obigen Punkte nach, zu was fuer einer Verbindung es gehoert. Wenn es eine neue Verbindung ist, sehen wir in der entsprechenden Kette der NAT-Tabelle nach, was zu tun ist. Die Antwort, die wir erhalten, wird auf alle weiteren Pakete dieser Verbindung angewendet.
iptables
benoetigt eine Reihe von Standardoptionen, die weiter unten
aufgelistet werden. Die Optionen mit einem doppelten Gedankenstrich
koennen abgekuerzt werden, solange iptables
sie danach noch von den
anderen Optionen unterscheiden kann. Wenn Dein Kernel iptables
als
Modul unterstuetzt, wirst Du das 'iptables.o' Modul zuerst laden
muessen: 'insmod iptables.o'.
Die wichtigste Option ist hier die, mit der man die Tabelle auswaehlen kann, '-t'. Fuer alle NAT Operationen wirst Du '-t nat' verwenden wollen, um in die NAT-Tabelle zu schreiben. Die zweitwichtigste Option ist das `-A', mit dem man eine neue Regel an das Ende einer Kette anhaengen kann (z.B. '-A POSTROUTING'), oder '-I', um eine Regel am Anfang einer Kette einzufuegen (z.B. '-I PREROUTING').
Du kannst die Quelle ('-s' oder '--source') und das Ziel ('-d' oder ('--destination') eines Pakets bestimmen, auf das Du NAT anwenden willst. Diesen Angaben kann eine einzelne IP-Adresse (z.B. 192.168.1.1), ein Name (z.B. www.gnumonks.org) oder ein Netzwerkadresse (z.B. 192.168.1.0/24 oder 192.168.1.0/255.255.255.0) folgen.
Du kannst die Schnittstelle bestimmen, an der Pakete eingehen ('-i'
oder '--in-interface') oder ausgehen ('-o' oder '--out-interface'),
aber welche von beiden haengt davon ab, in welche Kette Du diese
Regel einfuegst: Bei der PREROUTING-Kette kannst Du nur die eingehende
Schnittstelle waehlen, und bei der POSTROUTING-Schnittstelle (OUTPUT)
nur die ausgehende. Wenn Du die falsche waehlst, wird iptables
Dir eine Fehlermeldung geben.
Ich habe weiter oben gesagt, dass Du eine Quell- und eine Zieladresse bestimmen kannst. Wenn Du die Quelladresse weglaesst, wird jegliche Adresse zutreffend sein. Wenn Du die Zieladresse weglaesst, wird jegliche Zieladresse zutreffend sein.
Du kannst auch ein bestimmtes Protokoll ('-p' oder '--protocol') angeben, so wie TCP oder UDP; nur auf Pakete dieses Typs wird die Regel zutreffen. Der Hauptgrund hierfuer besteht darin, dass das Bestimmen eines Protokolls Extra-Optionen erlaubt: insbesondere die '--source-port' und die `--destination-port' Optionen (abgekuerzt als '-sport' und '-dport').
Diese Optionen erlauben Dir, zu bestimmen, dass eine Regel nur auf Pakete mit einem bestimmten Quell- oder Zielport zutrifft. Dies ist nuetzlich fuer umgeleitete Web-Anfragen (TCP-Port 80 und 8080) und laesst andere Pakete ausser Acht.
Diese Optionen muessen der '-p' Option folgen (welche den Nebeneffekt hat, dass die Erweiterungen fuer die shared libraries fuer das ent- sprechende Protokoll geladen werden). Du kannst Portnummern verwenden oder Namen aus der /etc/services Datei.
All die verschiedenen Eigenschaften, nach denen Du Pakete auswaehlen
kannst, werden in schmerzhaften Einzelheiten detailliert in der
Man-Page beschrieben (man iptables
).