Linux 2.4 NAT HOWTO <author>Rusty Russell, mailing list <tt>netfilter@lists.samba.org</tt> <date>$Revision: 487 $ $Date: 2002-01-14 10:35:13 +0100 (lun, 14 ene 2002) $ <p>Do češtiny přeložil Ivo Raisr (iq_soft@home.zcu.cz) <abstract> Tento dokument popisuje jak provádět masquerading, transparentní proxying, port forwarding a jiné druhy NAT - Network Address Translations (překlad síťových adres) s jádry Linuxu 2.4. </abstract> <!-- Obsah --> <toc> <!-- Začátek dokumentu --> <sect>Úvod<label id="intro"> <p> Vítej, vážený čtenáři. <p> Chystáš se ponořit do fascinujícího (a někdy strašlivého) světa NAT: Network Address Translation a tento HOWTO je něco jako tvůj návod k jádru Linuxu 2.4 a možná i dále. <p>V Linuxu 2.4 byla představena nová infrastruktura pro řízení paketů, nazývaná `netfilter'. NAT zprostředkovává vrstvu nad touto infrastrukturou, kompletně přepracovanou od minulých verzí jádra. <p>(C) 2000 Paul `Rusty' Russell. Licenced under the GNU GPL. <p>(C) 2001 Ivo Raisr. Česká verze. Licenced under the GNU GPL. <sect>Kde můžeš najít oficiální WWW stránky a konferenci? <p>Existují tři oficiální místa: <itemize> <item>Díky <url url="http://netfilter.filewatcher.org/" name="Filewatcher">. <item>Díky <url url="http://netfilter.samba.org/" name="The Samba Team and SGI">. <item>Díky <url url="http://netfilter.gnumonks.org/" name="Harald Welte">. </itemize> <p>Oficiální poštovní konference: <url url="http://www.netfilter.org/contact.html#list" name="Netfilter List">. <sect1>Co to je Network Address Translation? <p> Normálně putují pakety sítí ze zdroje (například z tvého počítače) ke svému cíli (například www.gnumonks.org) mnoha různými uzly: přibližně devatenácti z mého místa v Austrálii. Žádný z těchto mezilehlých uzlů nic nemění, jen pakety posílá dále. <p>Jestliže jeden z těchto uzlů provádí NAT (překlad síťových adres), pak může být změněn zdroj nebo cíl paketu, který tímto uzlem prochází. Určitě si domyslíš, že toto není způsob, jakým by měl systém pracovat; NAT je tudíž něco mezi. Obvykle si uzel provádějící NAT pamatuje, jakým způsobem změnil paket, a zpětně modifikuje ty pakety, které prochází nazpátek, takže vše funguje tak, jak má. <sect1>Proč mám chtít NAT? <p>V dokonalém světě nemusíš. V mezidobí jsou hlavními důvody: <descrip> <tag/Modemová připojení k Internetu/ Většina Internetových poskytovatelů ti poskytne pro připojení jednu IP adresu. Můžeš odesílat pakety s libovolnou zdrojovou adresou, ale budou se ti vracet jen odpovědi na pakety s touto přidělenou IP adresou. Jestliže chceš připojit více různých počítačů (domácí síť) k Internetu pomocí tohoto jednoho uzlu, potřebuješ NAT. <p>Toto je dnes nejběžnější použití NAT, v Linuxovém světě běžně nazývané `masquerading'. Nazývám jej SNAT, protože měníš <bf>zdrojovou</bf> (`source') adresu prvního paketu. <tag/Více serverů/ Někdy chceš změnit, kam budou směřovat pakety přicházející do tvé sítě. Často je to protože (viz výše) máš jedinou IP adresu, ale chceš, aby se lidi zvenčí dostali k tvým počítačům schovaným za tím jediným se `skutečnou' IP adresou. To lze provést, pokud budeš přepisovat cíl příchozích paketů. Tento druh NAT byl nazýván port-forwarding v předchozích verzích Linuxu. <p>Běžnou variantou je rozložení zatížení (load-sharing), při kterém je mapování rozloženo na množinu počítačů. Možná pro tebe bude stát za to se podívat na <url url="http://linuxvirtualserver.org/" name="Linux Virtual Server">, pokud zamýšlíš provádět load-sharing ve větším měřítku. <tag/Transparentní proxy/ Někdy můžeš chtít, aby každý paket, který prochází tvým Linuxovým počítačem, byl určen pro nějaký program na tomto počítači. Takto se dělá transparentní proxy: proxy je program uprostřed, který zprostředkovává komunikaci mezi tvou sítí a okolním světem. Transparentní proto, že tvá síť vůbec neví, že komunikuje s proxy (ovšem za předpokladu, že proxy funguje). <p>Squid může být takto nakonfigurován, v předchozích verzích Linuxu to bylo nazýváno přesměrování (redirection) nebo transparentní proxy. </descrip> <sect>Dva druhy NAT <p>Rozděluji NAT na dva různé druhy: <bf>Zdrojová NAT</bf> (SNAT) a <bf>Cílová NAT</bf> (DNAT). <p>Když modifikuješ zdrojovou adresu prvního paketu, pak je to Zdrojová NAT - například měníš zdroj vysílání. Zdrojová NAT je vždy prováděna až po dokončení směrování, těsně předtím než je paket vyslán po drátech. Masquerading je speciální forma SNAT. <p>Když modifikuješ cílovou adresu prvního paketu, pak je to Cílová NAT - například měníš cíl. Cílová NAT je vždy prováděna před započetím směrování, těsně po přijetí paketu z drátů. Port-forwarding, load-sharing a transparentní proxy jsou speciální formou DNAT. <sect>Rychlý přestup z 2.0 a 2.2 jádra <p>Sorry všem, kteří jsou stále ještě šokováni přechodem z 2.0 (ipfwadm) na 2.2 (ipchains). Jsou zde dobré a špatné zprávy. <p>Za prvé, můžeš používat ipchains a ipfwadm stejně jako předtím. Abys je mohl používat, musíš nejprve zavést moduly jádra `ipchains.o' nebo `ipfwadm.o', které najdeš v poslední distribuci netfilter. Tyto moduly se vzájemně vylučují (byl jsi varován) a neměly by být kombinovány s žádnými jinými moduly netfilteru. <p>Jakmile je jeden z těchto modulů zaveden, můžeš používat ipchains a ipfwadm zcela běžným způsobem, pouze s těmito odlišnostmi: <itemize> <item> Nastavení masquerading timeoutů pomocí ipchains -M -S nebo ipfwadm -M -s nic nedělá. Nevadí to, jelikož timeouty pro novou NAT infrastrukturu jsou delší. <item> Položky init_seq, delta a previous_delta v ukecaném masquerading výpisu jsou vždy nulové. <item> Nulování a výpis čítačů najednou pomocí `-Z -L' už dále nefunguje: čítače nebudou vynulovány. <item> Zpětně kompatibilní vrstva není dobře škálovatelná pro velký počet spojení - nepoužívej ji na exponovaném místě! </itemize> Pro hackery: <itemize> <item> Můžeš se nyní navázat na porty 61000-65095 i když provádíš masquerading. Kód pro masquerading byl zvyklý považovat všechny porty v tomto rozmezí za volné, takže je programy nemohly používat. <item> Již nefunguje (nedokumentovaný) `getsockname' hack, pomocí kterého programy používající transparentní proxy mohly zjistit skutečný cíl spojení. <item> Také (nedokumentovaný) hack `bind-to-foreign-address' již není implementován. Ten byl používán k dovršení iluze transparentní proxy. </itemize> <sect1> Chci jen masquerading! Pomoc! <p>To chce většina. Jestliže máš dynamicky přidělenou IP adresu PPP připojení (pokud nevíš, tak jsi to ty), chceš prostě sdělit svému počítači, že všechny pakety pocházející z tvé vnitřní sítě mají vypadat jako by pocházely z počítače s PPP připojením. <tscreen><verb> # Zavést NAT modul (to zavede všechny ostatní). modprobe iptable_nat # V tabulce NAT (-t nat) připoj pravidlo (-A), že po dokončení směrování # (POSTROUTING) má být u všech paketů odcházející z ppp0 (-o ppp0) prováděno # MASQUERADE spojení (-j MASQUERADE). iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # Zapnutí IP forwardování echo 1 > /proc/sys/net/ipv4/ip_forward </verb></tscreen> Povšimni si, že neprovádíš žádné filtrování paketů: k tomu si přečti Packet Filtering HOWTO: `Mixing NAT and Packet Filtering'. <sect1> A co ipmasqadm? <p>Neobtěžoval jsem se tolik se zachováním zpětné kompatibility, protože je to velmi choulostivá věc. Pro port forwarding můžeš jednoduše použít `iptables -t nat'. Tedy například v Linuxu 2.2 můžeš mít: <tscreen><verb> # Linux 2.2 # Směruj TCP pakety z 1.2.3.4, port 8080 na 192.168.1.1, port 80 ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80 </verb></tscreen> Nyní bys měl mít: <tscreen><verb> # Linux 2.4 # Připoj pravidlo před směrováním (-A PREROUTING) do NAT tabulky (-t nat), že # TCP pakety (-p tcp) z 1.2.3.4 (-d 1.2.3.4) port 8080 (--dport 8080) # mají cíl mapován (-j DNAT) na 192.168.1.1, port 80 # (--to 192.168.1.1:80). iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 \ -j DNAT --to 192.168.1.1:80 </verb></tscreen> <sect>Řízení provádění NAT <p>Potřebuješ vytvořit pravidla pro NAT, která řeknou jádru, jaká spojení a jakým způsobem se mají změnit. K tomu se používá velmi všestranný nástroj <tt>iptables</tt> s přepínačem `-t nat' pro modifikaci NAT tabulky. <p>Tabulka pravidel NAT obsahuje tři seznamy nazývané `řetězy' (`chains'); pravidla jsou postupně zkoumána, dokud se nenalezne nějaké vyhovujcící. Dva řetězy jsou nazývané PREROUTING (před směrováním, pro Cílovou NAT) a POSTROUTING (po směrování, pro Zdrojovou NAT). <p>Následující obrázek by to měl celkem dobře osvětlit, kdybych měl nějaké umělecké nadání: <tscreen><verb> _____ _____ / \ / \ PREROUTING -->[Směrování ]----------------->POSTROUTING-----> \D-NAT/ | \S-NAT/ | ^ | | | | | | | | | | | | --------> lokální proces ----- </verb></tscreen> Jak paket prochází, u každého bodu (viz výše) se nejdříve najde, s kterým spojením je asociován. Jestliže jde o nové spojení, nalezne se odpovídající řetěz v NAT tabulce a zkoumá se, co se dále provede. Pokud se bude něco provádět, bude to ovlivňovat všechny následující pakety. <sect1>Jednoduchý výběr s použitím iptables <p><tt>iptables</tt> má velké množství přepínačů, které jsou uvedeny dále. Všechny přepínače s dvojitou pomlčkou mohou být zkráceny pokud je zachována jednoznačnost. Pokud je podpora iptables zabudována v jádře jako modul, musí se tento modul nejdříve zavést: `insmod ip_tables'. <p>Nejdůležitějším přepínačem je výběr tabulky, `-t'. Pro všechny operace s NAT tabulkou tedy používej `-t nat'. Druhým nejdůležitějším přepínačem je použití `-A' k připojení pravidla na konec řetězu (např. `-A POSTROUTING') nebo vložení pravidla na začátek (např. `-I PREROUTING'). <p>Můžeš zadat zdroj (`-s' nebo `--source') a cíl (`-d' nebo `--destination') paketů, na které chceš aplikovat NAT. Za těmito volbami může být jediná IP adresa (např. 192.168.1.1), jméno (např. www.gnumonks.org) nebo adresa sítě (např. 192.168.1.0/24 nebo 192.168.1.0/255.255.255.0). <p>Můžeš zadat vstupní (`-i' nebo `--in-interface') nebo výstupní (`-o' nebo `--out-interface') rozhraní, které má odpovídat. Záleží ale na řetězu, do kterého dáváš pravidlo: u PREROUTING řetězu můžeš zadat pouze vstupní rozhraní, u POSTROUTING řetězu pak výstupní rozhraní. Jestliže zadáš špatné rozhraní, <tt>iptables</tt> zahlásí chybu. <sect1>Jemnější členění paketů pro modifikaci <p>Jak jsem již řekl, můžeš zadat zdrojovou a cílovou adresu. Jestliže vynecháš přepínač se zdrojovou adresou, pak budou odpovídat všechny zdrojové adresy. To samé platí i pro cílovou adresu. <p>Můžeš také označit specifický protokol (`-p' nebo `--protocol') jako TCP či UDP; jen pakety tohoto protokolu budou odpovídat pravidlu. Možnost zadání dalších speciálních přepínačů je hlavním důvodem, proč zadat protokol: speciálně můžeš zadat zdrojový port (`--source-port' nebo `--sport') a cílový port (`--destination-port' nebo `--dport'). <p>Tyto přepínače ti umožní zadat pravidlo, kterému budou odpovídat jen pakety s určitými zdrojovými a cílovými porty. To je užitečné pro přesměrovávání WWW požadavků (TCP port 80 nebo 8080), zatímco s ostatními pakety se nic neděje. <p>Tyto přepínače musí následovat přepínač `-p' (což má vedlejší efekt zavedení sdílené rozšiřující knihovny pro tento protokol). Můžeš užít čísla portů nebo jméno portu ze souboru /etc/services. <p>Všechny rozličné cesty, kterými můžeš vybrat paket, jsou velmi detailně popsány v manuálových stránkách (<tt>man iptables</tt>). <sect>Jak modifikovat pakety <p>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. <sect1>Zdrojová NAT <p>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í). <p>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). <tscreen><verb> ## 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 </verb></tscreen> <sect2>Masquerading <p>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). <p>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. <tscreen><verb> ## Prováděj masquerading na všem, co odchází z ppp0 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE </verb></tscreen> <sect1>Cílová NAT <p>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í). <p>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). <tscreen><verb> ## 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 </verb></tscreen> <sect2>Přesměrovávání <p>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í. <tscreen><verb> ## 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 </verb></tscreen> Nezapomeň, že squid musí být nakonfigurován jako transparentní proxy! <sect1> <sect1>Mapování detailně <p>S některé jemnůstkami NAT většina lidí vůbec nepřijde do styku. Jsou zde zdokumentovány pro zvídavé. <sect2>Výběr rozsahu adres <p>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í. <sect2>Vytváření prázdných NAT mapování <p>Můžeš použít `-j ACCEPT', což propustí spojení bez dalšího provádění NAT. <sect2>Normální chování NAT <p>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í). <sect2>Implicitní mapování zdrojových portů <p>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ý: <enum> <item>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. <item> 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). <item> Linuxový počítač naváže spojení s www.netscape.com, port 80 z 1.2.3.4 (adresa výstupního rozhraní), port 1024. <item> NAT změní zdrojový port druhého spojení na 1025, aby spolu nekolidovala. </enum> <p>Pokud nastane implicitní mapování zdrojových portů, tak jsou porty rozděleny do tří tříd: <itemize> <item> Porty pod 512, <item> porty mezi 512 a 1023 <item> porty nad 1024 včetně. </itemize> Port nebude nikdy implicitně mapován do jiné třídy. <sect2>Co se stane když NAT selže <p>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. <sect2>Vícenásobné mapování, překrývání a kolize <p>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. <p>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í: <tscreen><verb> # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \ -j SNAT --to 1.2.3.0/24 </verb></tscreen> <p>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). <p>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: <tscreen><verb> # 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 </verb></tscreen> <sect2>Měnění cílů lokálně vytvářených spojení <p>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). <p>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. <sect>Speciální protokoly <p>Některé protokoly nemají rády, pokud se na ně aplikuje NAT. Pro každý z těchto protokolů musí být napsána dvě rozšíření: jedno pro sledování spojení protokolu a druhé pro samotné NAT. <p>V distribuci netfilteru jsou zatím moduly pro ftp: ip_conntrack_ftp.o a ip_nat_ftp.o. Pokud tyto moduly zavedeš do jádra (nebo je do jádra zakompiluješ), pak by mělo pracovat jakékoli NAT na ftp spojení. Pokud tyto moduly nepoužiješ, můžeš použít pouze pasivní ftp a i to nemusí fungovat spolehlivě jestliže provádíš složitější SNAT. <sect>Upozornění k NAT <p>Pokud aplikuješ na spojení NAT, všechny pakety, které procházejí <bf>oběma</bf> směry (do a ze sítě), musí procházet NAT počítačem, jinak to nebude spolehlivě fungovat. Především, kód pro sledování spojení sestavuje fragmenty paketů, což znamená, že nejen sledování spojení nebude spolehlivé, ale i že pakety samotné nemusejí vůbec projít kvůli odmítnutým fragmentům. <sect>SNAT a směrování <p>U SNAT musíš dodržet to, že každý počítač musí na SNAT pakety odpovídat zpět počítači, který tyto pakety vyslal. Například mapuješ nějaké odchozí pakety na zdrojovou adresu 1.2.3.4. Pak venkovní směrovač musí vědět, že odpovědi (které mají <bf>cíl</bf> 1.2.3.4) musí posílat zpět tomuto počítači. Toto se dá provést následujícími způsoby: <enum> <item> Pokud provádíš SNAT na vlastní adresu počítače (pro kterého směrování a všechno ostatní už pracuje), nemusíš dělat nic. <item> Pokud provádíš SNAT na nepoužívanou adresu na lokální síti (například mapuješ na 1.2.3.99, volnou adresu na síti 1.2.3.0/24), musí tvůj NAT počítač odpovídat na ARP žádosti pro tyto adresy stejně tak jako pro svojí. Nejjednodušší je vytvořit IP alias, např.: <tscreen><verb> # ip address add 1.2.3.99 dev eth0 </verb></tscreen> <item> Pokud provádíš SNAT na úplně odlišnou adresu, musíš zajistit, aby počítače, které obdrží SNAT paket, směrovaly tuto adresu zpět k NAT počítači. To je splněno, pokud je NAT počítač přednastavená brána (gateway). Jinak musíš propagovat cestu (pokud používáš směrovací protokol) nebo ručně přidat cesty na každý takto `postižený' počítač. </enum> <sect>DNAT na tu samou síť <p>Pokud provádíš portforwarding zpět na tu samou síť, musíš zajistit, aby všechny následující pakety i odpovědi na ně procházely NAT počítačem (aby mohly být změněny). Kód NAT nyní (od verze 2.4.0-test6) dovoluje blokovat odchozí ICMP přesměrování, které je vysíláno pokud NAT paket odchází tím samým rozhraním, kterým přišel, a server stále zkouší odpovídat přímo klientovi (který nerozpozná odpověď). <p>Klasickým případem je když vnitřní počítače zkouší přistoupit k `veřejnému' WWW serveru, na kterém je ale prováděno DNAT z veřejné adresy (1.2.3.4) na vnitřní počítač (192.168.1.1): <tscreen><verb> # iptables -t nat -A PREROUTING -d 1.2.3.4 \ -p tcp --dport 80 -j DNAT --to 192.168.1.1 </verb></tscreen> <p>Jeden způsob je rozběhnout DNS server, který zná opravdovou (vnitřní) IP adresu veřejného WWW serveru a směrovat všechny ostatní žádosti na vnější DNS server. To znamená, že na WWW serveru se budou vnitřní IP adresy zobrazovat správně. <p>Při druhém způsobu NAT počítač mapuje také zdrojovou IP adresu na svoji vlastní pro tato WWW spojení a klame tak server tím, že skrz něj odpovídá. V tomto příkladě předpokládáme, že IP adresa NAT počítače je 192.168.1.250: <tscreen><verb> # iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 \ -p tcp --dport 80 -j SNAT --to 192.168.1.250 </verb></tscreen> Protože <bf>PREROUTING</bf> pravidlo se zkoumá jako první, pakety budou již určeny pro vnitřní WWW server a můžeme tak určit, které z nich mají vnitřní zdrojovu adresu. <sect>Poděkování <p>Rád bych poděkoval především firmě WatchGuard a Davidu Bonnovi, který věřil v ideu netfilteru natolik, že mě podporoval v mé práci. <p>Také všem ostatním, kteří klidně snášeli moje nadávky, když jsem objevoval škaredosti NAT, a obzvláště těm, kteří přečetli můj deník. <p>Rusty. </article>