NAT

Jenik mracek na stromc.cz
Středa Leden 21 09:46:37 CET 2004


Clanek viz konference MilanK 6.1.2004
text:
Urcite ztoho pochopis proc to tak je.
-----------------------------------------------------------------------
Tak já uvedu ty NATy na pravou míru...

NAT, network address translation, c(ili pr(eklad sít(ové adresy, je obecne(
technika, pr(i které routery (a podobná zar(ízení) me(ní u pru*chozího
paketu jeho zdrojovou nebo cílovou (IP) adresu. Obecný NAT dokonce me(ní
i další údaje v hlavic(ce paketu, najc(aste(ji c(íslo portu.

Pokusím se vysve(tlit du*vod, proc( NA
1000
T vzniknul a jaké jsou jeho
nejc(aste(jší formy. Použitá terminologie není zcela ustálena, vycházím z
toho, co nejc(aste(ji slýchám od svých kolegu* resp. co c(tu v odborné
literatur(e.

V dobe(, kdy pan Postel a lidé kolem ne(j navrhovali sít( "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
dostatec(ne( vysokým c(íslem. Dnes se celosve(tove( r(eší problém vyc(erpání
te(chto adres. Dlouhodobé a nároc(né r(ešení je zme(na formátu adres,
chystaná verze 6 (IPv6) by me(la mít dostatek adres pro zasít(ování kusu
našeho okolního vesmíru. Druhým (nouzovým a krátkodobým) r(ešením je NAT.

V NATu jde o to, že pr(ipojíme velký poc(et poc(ítac(u* (celou firmu) pr(es
jedinou IP adresu. To je adresa výstupního routeru. Ostatní poc(ítac(e
používají vyhrazený never(ejný rozsah IP adres (napr(íklad 192.168.x.x).
Protože never(ejné adresy se na venkovním Internetu nepoužívají, mohou je
používat firmy uvnitr( opakovane( a nezávisle na sobe(. Když potom poc(ítac(
s never(ejnou adresou pr(istupuje na Internet, posílá pakety pr(es ten
výstupní router. Výstupní router se chová, jako by se pr(ipojoval do
Internetu místo tohoto poc(ítac(e, never(ejnou zdrojovou adresu paketu
vyme(ní za svoji vlastní ver(ejnou adresu a paket pošle. Když pr(ijde z
Internetu paket odpove(di (na ver(ejnou adresu routeru), tak u ní router zme(ní
cílovou adresu na adresu pu*vodního vnitr(ního poc(ítac(e a paket mu pošle.
Vnitr(nímu poc(ítac(i se to jeví, jako by komunikoval s Internetem pr(ímo,
naopak z pohledu Internetu se komunikace jeví jako když existuje pouze
router. Toto je hlavní klasická forma NATu, ze všeho, c(emu se r(íká NAT,
je to nejkomplikovane(jší technika.

Pro vysve(tlení komplikací si pr(edstavme sva poc(ítac(e uvnitr( firmy, které
najednou komunikují tr(eba se serverem www.seznam.cz. Zevnitr( do routeru
chodí pakety ze dvou vnitr(ních adres, on obe( adresy pr(ekládá na stejnou
venkovní a posílá pakety na www.seznam.cz. Když ze Seznamu pr(ijde
odpove(d(, musí router z ne(jaké další informace poznat, komu z te(ch dvou
má odpove(d( poslat. Toto je specifické podle použitého protokolu.
Napr(íklad protokol TCP vytvár(í "spojení", spojení je urc(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 pr(íkladu se vnitr(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 pr(ijdou dve(
spojení z routeru, jedno z portu 10001, druhé z 10002, Seznam odpovídá
na porty 10001 a 10002 a náš router podle c(ísla portu pozná, že pakety
odpove(di pr(icházející na jeho port 10001 má pr(eposlat klientovi 
192.168.0.1 a
10002 sme(rovat na 192.168.0.2.

Našim dve(ma klientu*m ale nemu*že nikdo bránit v tom, aby se pr(ipojili na
www.seznam.cz port 80 oba ze stejného portu 10001 (c(ísla portu* si volí
poc(ítac( nezávisle na ostatních a mu*že se tedy s jinými v c(íslech
shodnout). V tom pr(ípade( router vybaví první požadavek klasickým
pr(ekladem zdrojové adresy, ale u druhého požadavku zme(ní krome( adresy
také port na ne(jaké dosud volné c(íslo (dejme tomu 10003), protože jinak
by nepoznal, na který vnitr(ní poc(ítac( má sme(rovat odpove(di. Zde tedy NAT
neme(ní pouze IP adresy, ale i c(ísla portu*. U dalších protokolu* (UDP,
ICMP, GRE a pod.) se používají podobné dopln(kové informace jako je port
u TCP a tyto informace router v paketech ve(tšinou zachovává, ale pr(i
konfliktech je musí me(nit.

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

Veškerá komunikace, kterou tento klasický NAT r(eší, je iniciována
poc(ítac(em s never(ejnou adresou uvnitr( firmy sme(rem ven do Internetu.
Obrácený sme(r nefunguje, protože z Internetu se celá firma tvár(í jako
jeden jediný router a u nových paketu* poslaných tomuto routeru z venku
router nepozná, kterému vnitr(nímu poc(ítac(i patr(í. To je jedna z mála
výhod NATu, jako vedlejší produkt jeho jednosme(rovost poskytuje jistý
stupen( ochrany vnitr(ní síte(, protože se dovnitr( není možno napojit.
Jakákoliv komunikace musí zac(ínat vzruchem generovaným uvnitr( síte(, bez
ne(j se žádný paket do vnitr(ní síte( nedostane.

V síti kLfREE používáme tento klasický NAT pro ve(tšinu komunikace s
Internetem. Vnitr(ní adresa routeru je snat.klfree.net (aktuálne( IP
212.24.157.197). Mezi poc(ítac(i uvnitr( síte( je ale zakázán.

Jednosme(rovost NATu je ale na závadu, pokud vyžadujeme, aby bylo možné
pr(ipojení z Internetu dovnitr(. Za tímto úc(elem se na NAT routeru vyhradí
konkrétní TCP nebo UDP porty, které se pr(i pr(ístupu z Internetu sme(rují
na konkrétní vnitr(ní poc(ítac(. Mu*žeme definovat, že když se ne(kdo pr(ipojí
z Internetu na firemní router port 8080, bude se požadavek dovnitr(
pr(ekládat na adresu 192.168.0.3, port 80. Toto se nazývá jednoduše "díra
dovnitr(", u ne(kterých produktu* 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 urc(íte vnitr(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áš
poc(ítac( dovnitr( pr(ekládat.

Poslední zmin(ovanou formou NATu je NAT 1:1. Ten používáme pr(i ude(lování
ver(ejných IP adres uživatelu*m. Uživateli je za stanovený poplatek
pr(ide(lena jedna IP adresa ver(ejne( dostupná na Internetu, která je pod
jeho kontrolou. Mohl by si ji nastavit pr(ímo na svém poc(ítac(i, ale to by
velmi komplikovalo konfigurace routeru* uvnitr( kLfREE, protože každý
router by musel znát umíste(ní všech uživatelu* s ver(ejnými adresami.
Místo toho si na svém poc(ítac(i uživatel nastaví vnitr(ní adresu typu
192.168.x.x. Když pošle paket do Internetu, tak výstupní router zme(ní
jeho zdrojovou adresu na jemu pr(ide(lenou venkovní adresu. Když na jeho
venkovní adresu ne(kdo pošle z Internetu paket, tak ten paket dojde do
našeho routeru, tak zme(ní cíl na vnitr(ní uživatelovu adresu a paket mu
pošle. Vypadá to stejne( jako výšeuvedený NAT, ale není. Rozdíl je v
tom, že tu jednu ver(ejnou IP adresu používá práve( jeden jediný vnitr(ní
poc(ítac( a router vždy ví, komu má paket poslat. Nepotr(ebuje tedy
využívat ani me(nit žádné další údaje v paketu, pouze pr(ekládá IP adresu.
Protože se obsah paketu krome( adresy neme(ní, zažilo se oznac(ení NAT 1:1.

---

Vysve(tlil jsem hodne( podrobne( techniku klasického NATu a nyní se ješte(
jednou vrátím k jeho zákazu uvnitr( kLfREE.

NAT má v podstate( dve( výhody. První je využití jediné adresy mnoha
poc(ítac(i. Protože máme uvnitr( kLfREE dostatek never(ejných IP adres, není
jimi potr(eba takto šetr(it. Druhou výhodou je vedlejší ochrana zpu*sobená
jednosme(rovostí paketu*. Ta funguje na všechny pakety a nedá se omezit
jen na ne(které (tj. nelze splnit požadavek pru*chozích ICMP paketu*, který
kLfREE vyžaduje), je proste( jednoduchá, ale nelze ji nijak
pr(izpu*sobovat. Ekvivalent ochrany, kterou de(lá NAT a která je upravena
pro splne(ní požadavku* v kLfREE, lze provést pomocí linuxového netfilteru
(iptables) pomocí asi tak tr(í pravidel, zkusím je na konci uvést.

Na druhou stranu je tu plno nevýhod NATu, které me( pr(ivedly k jeho
zákazu. Poc(ítac(, který se pr(es NAT napojuje ven, nedokáže odhadnout, z
jaké adresy a portu jeho spojení ve skutec(nosti pu*jde
(adresa by j
1000
ešte( odhadnout šla, port nikoliv). To je velký problém u
služeb, které si tyto údaje pr(edávají. Dále není možno s poc(ítac(em za
NATem navázat komunikaci, velký problém internetové telefonie. Dalším
problémem jsou c(asové limity, které vynutily zásah do služeb a
zvyšují tok dat (je potr(eba obc(as posílat bezvýznamné pakety jen proto,
aby se oddálilo vypršení c(asovac(e). Ne(které problémy NATu nejsou dodnes
uspokojive( vyr(ešeny, tak proc( si tohle všechno zaváde(t do kLfREE, když
nemusíme, proc( pozde(ji vysve(tlovat uživateli, že ne(které služby mu
nepobe(ží, nebot( špatne( "zasel"...

Celkem jsem se o NATu rozepsal, ne(kdo to klidne( slohove( upravte, vyr(ešte
mu*j obvyklý c(astý výskyt zájmena "který", dopln(te a vydejte jako
c(lánec(ek na náš web...

---

Zmíne(ná pravidla pro iptables... Pr(edpokládám domácí router, linux 2.4.
Rozhraní wlan0 je bezdrátová karta zapojená do kLfREE, na eth0 je
vnitr(ní domácí sít(. Tabulky iptables jsou prázdné, obsahují jen
následující pravidla:

# z eth0 pr(ijmu cokoliv, pravidla píšu jen pro pakety pr(íchozí z wlan0;
# netfilter je stavový firewall, využiju toho, že první paket ven
# zpu*sobí oznac(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

Skutec(ne( 3 pravidla. Pro funkci aktivního FTP, kdy se vzdálený server
napojuje dovnitr(, se ješte( hodí pr(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šne(jší zamítnutní (REJECT), je vhodné zamítnout spojení na AUTH
server, zrychlí se tím pr(ipojení k IRC a FTP serveru*m:

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

TCP-RESET nefunguje v ne(kterých jádrech 2.4.2x, napr(íklad v jádr(e
dodávaném s RedHat 9, tam volíme jednodušší varinatu bez druhé r(ádky,
která r(eší problémy tuším u IRC/FTP serveru* be(žících na starších
Windows. Jádro 2.4.23 má chybu již opravenu. Dve( dopln(ková pravidla r(eší
ve(ci, které nefungují ani na NATu (ale dají se dalším vylepšováním
NATu také r(ešit).

Pokud máš, D.M., ne(jaký c(lánek, rád ho ješte( projdu a doopravím.

Milan



louda napsal(a):
> Nasel jsem si ustanoveni o NAT a pride mi to trochu podivne - co je komu 
> do toho jestli si delam doma NAT ci PAT? Zjimal by mne argumenty 
> podlozeny duvod.
> 



Daląí informace o konferenci Kladno