Next Previous Contents

6. Jak modifikovat pakety

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.

6.1 Zdrojová NAT

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

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

6.2 Cílová NAT

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í

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!

6.3

6.4 Mapování detailně

S některé jemnůstkami NAT většina lidí vůbec nepřijde do styku. Jsou zde zdokumentovány pro zvídavé.

Výběr rozsahu adres

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í.

Vytváření prázdných NAT mapování

Můžeš použít `-j ACCEPT', což propustí spojení bez dalšího provádění NAT.

Normální chová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í).

Implicitní mapování zdrojových portů

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ý:

  1. WWW spojení je navázáno z nějakého počítače 192.1.1.1, port 1024 na www.netscape.com, port 80.
  2. Na toto spojení je aplikováno masquerading pomocí Linuxového počítače tak, aby používalo jeho zdrojovou IP adresu (1.2.3.4).
  3. Linuxový počítač naváže spojení s www.netscape.com, port 80 z 1.2.3.4 (adresa výstupního rozhraní), port 1024.
  4. NAT změní zdrojový port druhého spojení na 1025, aby spolu nekolidovala.

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.

Co se stane když NAT selže

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.

Vícenásobné mapování, překrývání a kolize

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

Měnění cílů lokálně vytvářených spojení

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.


Next Previous Contents