Teď už tedy víme, jak vybrat pakety, které se budou modifikovat. K dokončení našeho pravidla zbývá říci jádru co přesně chceme s těmito pakety provádět.
Chceš provádět SNAT, tzn. měnit zdrojovou adresu spojení na nějakou jinou. To se dělá v POSTROUTING řetězu, těsně předtím než je paket konečně vyslán. To je velice důležitý detail; znamená to, že cokoliv dalšího (směrování, filtrování paketů) na samotném Linuxovém počítači bude pracovat s nezměněným paketem. Znamená to také, že může být použit přepínač `-o' (výstupní rozhraní).
Zdrojová NAT je zadána použitím `-j SNAT' a přepínač `--to-source' určuje IP adresu, rozsah IP adres a případně port nebo rozsah portů (jen pro protokoly TCP a UDP).
## Změň zdrojové adresy na 1.2.3.4
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
## Změň zdrojové adresy na 1.2.3.4, 1.2.3.5 nebo 1.2.3.6
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
## Změň zdrojové adresy na 1.2.3.4, porty 1-1023
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023
Masquerading je speciální případ SNAT a mělo by být použito jen pro dynamicky přidělované IP adresy, jako například standardní telefonní vytáčení (pro statické IP adresy použij SNAT viz výše).
Pro masquerading nemusíš explicitně určovat zdrojovou adresu: použije se zdrojová adresa rozhraní, ze kterého odchází paket. Důležitější je ovšem fakt, že když spadne linka, tak jsou spojení (která jsou tak jako tak stejně ztracena) zapomenuta, což znamená méně rušivých změn jakmile je spojení opět nahozeno s novou IP adresou.
## Prováděj masquerading na všem, co odchází z ppp0
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Provádí se v PREROUTING řetězu, ihned jakmile je paket přijat. Znamená to, že cokoliv dalšího (směrování, filtrování paketů) na samotném Linuxovém počítači bude pracovat se `skutečným' cílem. Znamená to také, že může být použit přepínač `-i' (vstupní rozhraní).
Cílová NAT je zadána použitím `-j DNAT' a přepínač `--to-destination' určuje IP adresu, rozsah IP adres a případně port nebo rozsah portů (jen pro protokoly TCP a UDP).
## Změň cílové adresy na 5.6.7.8
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
## Změň cílové adresy na 5.6.7.8, 5.6.7.9 nebo 5.6.7.10.
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10
## Změň cílové adresy WWW na 5.6.7.8, port 8080.
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
-j DNAT --to 5.6.7.8:8080
Přesměrovávání je speciálním případem DNAT a je to čistě jen konvence, protože je navlas stejné s prováděním DNAT na adresu vstupního rozhraní.
## Posílej příchozí pakety s portem 80 (WWW) na naši transparentní proxy
## (squid)
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
Nezapomeň, že squid musí být nakonfigurován jako transparentní proxy!
S některé jemnůstkami NAT většina lidí vůbec nepřijde do styku. Jsou zde zdokumentovány pro zvídavé.
Jestliže je zadán rozsah IP adres, pak IP adresa, která se použije, je vybrána na základě nejméně používané IP adresy pro počítači známá spojení. Dosahuje se tím primitivního rozložení zatížení.
Můžeš použít `-j ACCEPT', což propustí spojení bez dalšího provádění NAT.
Předem nastavené chování je měnit spojení co možná nejméně, s dodržováním omezení, které pravidly zadal uživatel. To znamená, že se nepřemapovávají porty (dokud se nemusí).
I když pro spojení není požadováno provádění NAT, může nastat překlad zdrojových portů, jestliže jiné spojení bylo mapováno přes nové. Uvaž případ s masquerading, který je celkem běžný:
Pokud nastane implicitní mapování zdrojových portů, tak jsou porty rozděleny do tří tříd:
Port nebude nikdy implicitně mapován do jiné třídy.
Jestliže není žádná možnost, jak jednoznačně namapovat spojení na uživatelovu žádost, je spojení zahozeno. To také platí pro pakety, které nemohou být přiřazeny k žádnému spojení, ať už kvůli jejich poškození nebo pro nedostatek paměti počítače apod.
Mohou existovat pravidla NAT, která mapují pakety do toho samého rozsahu; kód NAT je natolik chytrý, aby zabránil kolizím. Tudíž dvě pravidla, která mapují zdrojovou adresu 192.168.1.1 a 192.168.1.2 na 1.2.3.4 jsou v pořádku.
Co více, můžeš mapovat přes opravdové, používané IP adresy tak dlouho, dokud tyto adresy projdou přes mapovací počítač. Tedy, pokud máš přiřazenou síť (1.2.3.0/24), ale jedna vnitřní síť používá tyto adresy a druhá privátní Internetové adresy 192.168.1.0/24, můžeš aplikovat NAT ze zdrojových adres 192.168.1.0/24 na síť 1.2.3.0 bez obav z kolizí:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
-j SNAT --to 1.2.3.0/24
Podobný postup platí i pro adresy používáné samotným NAT počítačem: to je způsob, jakým pracuje masquerading (sdílením adresy rozhraní mezi `opravdovými 'pakety z NAT počítače a pakety, na které bylo provedeno masquerading).
Dále můžeš mapovat ty samé pakety na mnoho různých cílů s tím, že budou sdílené. Pokud nechceš například mapovat nic na 1.2.3.5, můžeš zadat:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
-j SNAT --to 1.2.3.0-1.2.3.4 --to 1.2.3.6-1.2.3.254
NAT ti dovoluje vložit pravidla DNAT do výstupního řetězu, což ale není plně podporováno v 2.4 (může být, vyžaduje to ale nové přepínače, trochu testování a trochu větší kus programování, takže dokud se někdo nedohodne s Rustym, neočekával bych to brzy).
Současným omezením je nemožnost změnit cíl na jiné počítače než localhost (tedy `-j DNAT --to 127.0.0.1'), protože jinak jsou odpovědi špatně překládány.