Fw: několik questionů

Milan Krčmář milan.krcmar na seznam.cz
Úterý Leden 6 00:13:47 CET 2004


Tak já uvedu ty NATy na pravou míru...

NAT, network address translation, čili překlad síťové adresy, je obecně
technika, při které routery (a podobná zařízení) mění u průchozího
paketu jeho zdrojovou nebo cílovou (IP) adresu. Obecný NAT dokonce mění
i další údaje v hlavičce paketu, najčastěji číslo portu.

Pokusím se vysvětlit důvod, proč NAT vzniknul a jaké jsou jeho
nejčastější formy. Použitá terminologie není zcela ustálena, vycházím z
toho, co nejčastěji slýchám od svých kolegů resp. co čtu v odborné
literatuře.

V době, kdy pan Postel a lidé kolem něj navrhovali síť "Internet", byl
to projekt propojení dvou škol. Odpovídaly tomu možnosti adres, kdy se
zhruba miliarda kombinací zdála býti nedosažitelným a do budoucna
dostatečně vysokým číslem. Dnes se celosvětově řeší problém vyčerpání
těchto adres. Dlouhodobé a náročné řešení je změna formátu adres,
chystaná verze 6 (IPv6) by měla mít dostat
1000
ek adres pro zasíťování kusu
našeho okolního vesmíru. Druhým (nouzovým a krátkodobým) řešením je NAT.

V NATu jde o to, že připojíme velký počet počítačů (celou firmu) přes
jedinou IP adresu. To je adresa výstupního routeru. Ostatní počítače
používají vyhrazený neveřejný rozsah IP adres (například 192.168.x.x).
Protože neveřejné adresy se na venkovním Internetu nepoužívají, mohou je
používat firmy uvnitř opakovaně a nezávisle na sobě. Když potom počítač
s neveřejnou adresou přistupuje na Internet, posílá pakety přes ten
výstupní router. Výstupní router se chová, jako by se připojoval do
Internetu místo tohoto počítače, neveřejnou zdrojovou adresu paketu
vymění za svoji vlastní veřejnou adresu a paket pošle. Když přijde z
Internetu paket odpovědi (na veřejnou adresu routeru), tak u ní router změní
cílovou adresu na adresu původního vnitřního počítače a paket mu pošle.
Vnitřnímu počítači se to jeví, jako by komunikoval s Internetem přímo,
naopak z pohledu Internetu se komunikace jeví jako když existuje pouze
router. Toto je hlavní klasická forma NATu, ze všeho, čemu se říká NAT,
je to nejkomplikovanější technika.

Pro vysvětlení komplikací si představme sva počítače uvnitř firmy, které
najednou komunikují třeba se serverem www.seznam.cz. Zevnitř do routeru
chodí pakety ze dvou vnitřních adres, on obě adresy překládá na stejnou
venkovní a posílá pakety na www.seznam.cz. Když ze Seznamu přijde
odpověď, musí router z nějaké další informace poznat, komu z těch dvou
má odpověď poslat. Toto je specifické podle použitého protokolu.
Například protokol TCP vytváří "spojení", spojení je určeno zdrojovou
a cílovou adresou a dále zdrojovým a cílovým portem. Cílový port pro WWW
je 80. V našem příkladu se vnitřní klient 192.168.0.1 napojí z portu
10001 na server www.seznam.cz port 80, klient 192.168.0.2 se napojí z
portu 10002 na www.seznam.cz port 80. Na www.seznam.cz přijdou dvě
spojení z routeru, jedno z portu 10001, druhé z 10002, Seznam odpovídá
na porty 10001 a 10002 a náš router podle čísla portu pozná, že pakety
odpovědi přicházející na jeho port 10001 má přeposlat klientovi 192.168.0.1 a
10002 směrovat na 192.168.0.2.

Našim dvěma klientům ale nemůže nikdo bránit v tom, aby se připojili na
www.seznam.cz port 80 oba ze stejného portu 10001 (čísla portů si volí
počítač nezávisle na ostatních a může se tedy s jinými v číslech
shodnout). V tom případě router vybaví první požadavek klasickým
překladem zdrojové adresy, ale u druhého požadavku změní kromě adresy
také port na nějaké dosud volné číslo (dejme tomu 10003), protože jinak
by nepoznal, na který vnitřní počítač má směrovat odpovědi. Zde tedy NAT
nemění pouze IP adresy, ale i čísla portů. U dalších protokolů (UDP,
ICMP, GRE a pod.) se používají podobné doplňkové informace jako je port
u TCP a tyto informace router v paketech většinou zachovává, ale při
konfliktech je musí měnit.

Další komplikací je časové hledisko. Kdyby například pro protokol TCP
router při každém novém spojení obsadil dosud volný port, brzy by mu
porty došly (je jich něco přes 60000). Při vyslání požadavku si router
zapamatuje potřebné informace o překladu (jaká vnitřní IP požadavek
iniciovala, jak byly změněny porty a pod.) a tyto informace si pamatuje
pouze nějakou dobu. Pokud do této doby neprojde přes router žádný paket
patřící do toho konkrétního překladu, router překlad zapomene a port
uvolní. Tato doba je u protokolu TCP několik minut, u UDP jsou to
obvykle desítky sekund. I toto může vadit, když pošleme do Internetu
dotaz a odpověď nestihne přijít před vypršením časového limitu, tak se
informace o překladu odstraní z opožděná odpověď se ignoruje, protože se
neví, jakému vnitřnímu počítači patří.

Veškerá komunikace, kterou tento klasický NAT řeší, je iniciována
počítačem s neveřejnou adresou uvnitř firmy směrem ven do Internetu.
Obrácený směr nefunguje, protože z Internetu se celá firma tváří jako
jeden jediný router a u nových paketů poslaných tomuto routeru z venku
router nepozná, kterému vnitřnímu počítači patří. To je jedna z mála
výhod NATu, jako vedlejší produkt jeho jednosměrovost poskytuje j
1000
istý
stupeň ochrany vnitřní sítě, protože se dovnitř není možno napojit.
Jakákoliv komunikace musí začínat vzruchem generovaným uvnitř sítě, bez
něj se žádný paket do vnitřní sítě nedostane.

V síti kLfREE používáme tento klasický NAT pro většinu komunikace s
Internetem. Vnitřní adresa routeru je snat.klfree.net (aktuálně IP
212.24.157.197). Mezi počítači uvnitř sítě je ale zakázán.

Jednosměrovost NATu je ale na závadu, pokud vyžadujeme, aby bylo možné
připojení z Internetu dovnitř. Za tímto účelem se na NAT routeru vyhradí
konkrétní TCP nebo UDP porty, které se při přístupu z Internetu směrují
na konkrétní vnitřní počítač. Můžeme definovat, že když se někdo připojí
z Internetu na firemní router port 8080, bude se požadavek dovnitř
překládat na adresu 192.168.0.3, port 80. Toto se nazývá jednoduše "díra
dovnitř", u některých produktů se používá zkratka PAT (port address
translation). V kLfREE je pro díry vyhrazena venkovní adresa
dnat.klfree.net (IP 212.24.157.196). Na požádání vyrobíme jakoukoliv
díru, Vy si určíte vnitřní IP, port a protokol (TCP nebo UDP) a já
zvolím volný port na dnat.klfree.net, ze kterého se budou spojení na Váš
počítač dovnitř překládat.

Poslední zmiňovanou formou NATu je NAT 1:1. Ten používáme při udělování
veřejných IP adres uživatelům. Uživateli je za stanovený poplatek
přidělena jedna IP adresa veřejně dostupná na Internetu, která je pod
jeho kontrolou. Mohl by si ji nastavit přímo na svém počítači, ale to by
velmi komplikovalo konfigurace routerů uvnitř kLfREE, protože každý
router by musel znát umístění všech uživatelů s veřejnými adresami.
Místo toho si na svém počítači uživatel nastaví vnitřní adresu typu
192.168.x.x. Když pošle paket do Internetu, tak výstupní router změní
jeho zdrojovou adresu na jemu přidělenou venkovní adresu. Když na jeho
venkovní adresu někdo pošle z Internetu paket, tak ten paket dojde do
našeho routeru, tak změní cíl na vnitřní uživatelovu adresu a paket mu
pošle. Vypadá to stejně jako výšeuvedený NAT, ale není. Rozdíl je v
tom, že tu jednu veřejnou IP adresu používá právě jeden jediný vnitřní
počítač a router vždy ví, komu má paket poslat. Nepotřebuje tedy
využívat ani měnit žádné další údaje v paketu, pouze překládá IP adresu.
Protože se obsah paketu kromě adresy nemění, zažilo se označení NAT 1:1.

---

Vysvětlil jsem hodně podrobně techniku klasického NATu a nyní se ještě
jednou vrátím k jeho zákazu uvnitř kLfREE.

NAT má v podstatě dvě výhody. První je využití jediné adresy mnoha
počítači. Protože máme uvnitř kLfREE dostatek neveřejných IP adres, není
jimi potřeba takto šetřit. Druhou výhodou je vedlejší ochrana způsobená
jednosměrovostí paketů. Ta funguje na všechny pakety a nedá se omezit
jen na některé (tj. nelze splnit požadavek průchozích ICMP paketů, který
kLfREE vyžaduje), je prostě jednoduchá, ale nelze ji nijak
přizpůsobovat. Ekvivalent ochrany, kterou dělá NAT a která je upravena
pro splnění požadavků v kLfREE, lze provést pomocí linuxového netfilteru
(iptables) pomocí asi tak tří pravidel, zkusím je na konci uvést.

Na druhou stranu je tu plno nevýhod NATu, které mě přivedly k jeho
zákazu. Počítač, který se přes NAT napojuje ven, nedokáže odhadnout, z
jaké adresy a portu jeho spojení ve skutečnosti půjde
(adresa by ještě odhadnout šla, port nikoliv). To je velký problém u
služeb, které si tyto údaje předávají. Dále není možno s počítačem za
NATem navázat komunikaci, velký problém internetové telefonie. Dalším
problémem jsou časové limity, které vynutily zásah do služeb a
zvyšují tok dat (je potřeba občas posílat bezvýznamné pakety jen proto,
aby se oddálilo vypršení časovače). Některé problémy NATu nejsou dodnes
uspokojivě vyřešeny, tak proč si tohle všechno zavádět do kLfREE, když
nemusíme, proč později vysvětlovat uživateli, že některé služby mu
nepoběží, neboť špatně "zasel"...

Celkem jsem se o NATu rozepsal, někdo to klidně slohově upravte, vyřešte
můj obvyklý častý výskyt zájmena "který", doplňte a vydejte jako
článeček na náš web...

---

Zmíněná pravidla pro iptables... Předpokládám domácí router, linux 2.4.
Rozhraní wlan0 je bezdrátová ka
1000
rta zapojená do kLfREE, na eth0 je
vnitřní domácí síť. Tabulky iptables jsou prázdné, obsahují jen
následující pravidla:

# z eth0 přijmu cokoliv, pravidla píšu jen pro pakety příchozí z wlan0;
# netfilter je stavový firewall, využiju toho, že první paket ven 
# způsobí označení stavu ESTABLISHED pro následující pakety stejné
# relace
iptables -A FORWARD -i wlan0 -m state --state ESTABLISHED -j ACCEPT
# dále propustím vše, co je ICMP
iptables -A FORWARD -i wlan0 -p icmp -j ACCEPT
# a vše ostatní z wlan0 zahodím
iptables -A FORWARD -i wlan0 -j DROP

Skutečně 3 pravidla. Pro funkci aktivního FTP, kdy se vzdálený server
napojuje dovnitř, se ještě hodí před poslední pravidlo vložit:

iptables -I FORWARD 3 -i wlan0 -p tcp --syn --sport ftp-data -m state \
         --state RELATED -j ACCEPT

A dále pokud poslední pravidlo bylo drastické ignorování (DROP) a ne
slušnější zamítnutní (REJECT), je vhodné zamítnout spojení na AUTH
server, zrychlí se tím připojení k IRC a FTP serverům:

iptables -I FORWARD 3 -i wlan0 -p tcp --syn --dport auth -j REJECT \
         --reject-with tcp-reset

TCP-RESET nefunguje v některých jádrech 2.4.2x, například v jádře
dodávaném s RedHat 9, tam volíme jednodušší varinatu bez druhé řádky,
která řeší problémy tuším u IRC/FTP serverů běžících na starších
Windows. Jádro 2.4.23 má chybu již opravenu. Dvě doplňková pravidla řeší
věci, které nefungují ani na NATu (ale dají se dalším vylepšováním
NATu také řešit).

Pokud máš, D.M., nějaký článek, rád ho ještě projdu a doopravím.

Milan

On Mon, Jan 05, 2004 at 09:47:06PM +0100, JAPAN wrote:
>     
>    ----- Original Message -----
>    From: Darth Moula
>    To: kladno na klfree.net
>    Sent: Monday, January 05, 2004 9:32 PM
>    Subject: několik questionů
>    Přeji krásný nový rok a hned se ptám:
>     
>    postavil jsem si se starého počítače router a nakonfiguroval jsem si na
>    něm firewall a vyzkoušel, že funguje jak má na malé počítačové síti.
>    Návaznost na klfree jsem nehohl vyzkoušet, protože nemám přiděleny
>    potřebné IP adresy.
>     
>    Předesílám, že mi poměrně dost dlouho trvalo, než jsem vymámil z lidí po
>    celém světě, jak nakonfigurovat router, aby splňoval požadavek sdružení,
>    že se nemají překládat adresy, ale povedlo se. Sice nad tím každý kroutil
>    hlavou a naopak mi doporučoval překlad adres, ale to už se tu jednou
>    řešilo a já tento požadavek sdružení hodlám respektovat a nemíním někomu
>    komplikovat život speciálními požadavky.
>     
>    Než se ale zeptám, chtěl bych se ujistit, že se shodneme v použité
>    terminologii jak funguje router čili směrovač:
>     
>    Obecné principy směrování:
>    A) Základní předpoklad (neplatí pro některé specifické případy): směrovač
>    nesmí mít vždy na žádném ze svých rozhraní dvě (nebo více) stejných IP
>    adres. Každé rozhraní musí být v jiném subnetu. Rozsahy subnetů se
>    samozřejmě nesmí překrývat.
>     
>    B) Pokud směrovač pouze přeposílá IP pakety na základě informací ze své
>    směrové tabulky z jednoho svého rozhraní na jiné (pomiňme specifické
>    "chytřejší" implementace a implementace jiných protokolů) a obsah paketu
>    mění v nezbytně nutné míře, pak se tato činnost zove IP-routing, česky pak
>    IP-směrování.
>     
>    C) Překlad adres, nebo-li NAT předpokládá, že směrovač má na WAN rozhraní
>    navázánu jednu nebo více vnějších IP adres, přičemž na LAN rozhraní(ch)
>    jsou stanice, které mají být přes tyto vnější IP adresy z WANu dostupné,
>    ač samy mají IP adresy zcela jiné (vnitřní, lokální). Směrovač pak
>    zajistí, že IP paket mířící z LAN do WAN opustí směrovač nikoli s lokální
>    IP adresou, alebrž s vnější IP adresou, která je této lokální IP adrese
>    přiřazena (NAT 1:1). V opačném směru dochází k témuž ("veřejná" IP adresa
>    je v paketu nahrazena IP adresou lokální). Toto se zove NAT 1:1 (Network
>    Address Translation).
>     
>    D) V případě, že směrovač funguje jako brána bez NAT 1:1, pak má na straně
>    WAN rozhraní pouze jednu vnější IP adresu na které se hlásí pouze on sám a
>    tudíž nelze z WAN osl
1000
ovovat počítače v LAN(ech). V tomto případě v IP
>    paketu mířícího z LAN do WAN nahradí odesílatele (původní lokální IP
>    adresu) za svou IP adresu a lokální IP adresu odesílatele zapamatuje spolu
>    s jeho požadavkem. Odpověď na tento IP paket pak projde podobnou
>    procedurou: příjemce (IP adresa routeru) je nahrazen původním odesílatelem
>    (ze zapamatovaných údajů) a je odeslán přes příslušné LAN rozhraní do LAN
>    sítě, kde ho obdrží původní odesílatel, jako kdyby byl paket od
>    "odpovídatele" poslán přímo jemu. Toto se zove PAT (Port Address
>    Translation). Je logické, že PAT je podmnožinou NAT.
>     
>    V Provozním řádu uveřejněném na www.klfree.net jsou tyto dva body, které
>    se problematiky dotýkají:
>     
>    Povinnosti uživatele:
>    7. Na síti je zakázáno použití techniky překladu adres (změna IP adres v
>    hlavičce paketu při jeho průchodu sítí, tzv. NAT). Pokud potřebuje
>    uživatel k síti připojit více zařízení, bude mu přidělen potřebný počet IP
>    adres.
>    8. Uživatel může používat prostředky pro filtrování síťového provozu
>    (firewall). Těmito prostředky ale nesmí filtrovat IP pakety typu ICMP,
>    např. musí zajistit, aby byla služba ping u všech zařízení dostupná z celé
>    sítě. 
>    Pokud se budu držet toho, co jsem vyzvěděl o routování, pak vypadává
>    ze hry NAT, NAT 1:1 a PAT a použít lze pouze body A) a B), aby bylo
>    vyhověno bodu 7 řádu. Bod 8 se týká firewallu, takže k němu otázky nemám.
>     
>    A nyní má nejdůležitější otázka: na koho se mám obrátit, aby mi přidělil
>    IP adresy pro můj subnet na LAN rozhraní rozhraní? Požaduji subnet s
>    maskou o šíři 28 bitů, tedy 255.255.255.240, který mi umožní připojit max.
>    13 stanic (což nehodlám v plné míře využívat, ale 5 je málo ->
>    8-subnet-broadcast-router=5 adres pro stanice, aby bylo úplně jasné, jak
>    jsem k tomuto číslu došel). Tak nějak předpokládám, že zároveň zařídí
>    doplnění routovacích tabulek na bronxu, ke kterému jsem připojen, aby
>    městská síť o mém subnetu věděla.
>     
>    A ještě na závěr: mám připravený poměrně podrobný článek na téma "postav
>    si svůj vlastní router" a pokud jsem nebyl uveden v omyl či něco z
>    problematiky špatně nepochopil, měl by být i věcně správný a zájemcům o
>    tuto problematiku prospěšný. Rád bych proto někoho v této problematice
>    zdatného, kdo by dokázal případné nesrovnalosti odhalit a eventuelně
>    poradit, co tam ještě připsat.
>     
>    Pokud jsi to dočetl až sem a nevíš která bije, pak se tím netrap,
>    příspěvek není určen pro tebe ;-)
>     
>    s úctou D.M.


Další informace o konferenci Kladno