1. Introducere
Daca una dintre aceste legaturi ar face NAT, atunci ea va altera sursa sau
destinatia pachetului cand trece prin ea. Dupa cum va puteti
imagina, nu asa a fost sistemul proiectat sa functioneze, si NAT este un fel
de crocodil. De obicei, legatura care a facut NAT va tine
minte cum a alterat pachetul, ca atunci cand un pachet se reintoarce pe
cealalta cale, va face alterarea inversa a pachetului, astfel
incat totul sa functioneze.
Servere multiple
Cateodata vrei sa schimbi destinatia pachetelor care intra in reteaua ta.
Frecvent asta se intampla daca ai doar un singur IP (ca in
exemplul de mai sus), dar vrei ca persoanele din afara sa poata accesa
computerele din spatele celui cu IP real. Daca poti sa rescrii
destinatia pachetelor, atunci vei reusi sa faci asta.
O variatie pe tema asta este balansarea incarcaturii, atunci cand maparea are
loc pentru mai multe masini. Acest tip de NAT se numea
'port-forwarding' n versiunile mai vechi de linux.
Proxy transparent
Cateodata vrei sa pretinzi ca fiecare pachet ce trece prin masina ta pe care
rulezi linux este destinat pentru un program de pe ea
insesi. Acest lucru se poate folosi pentru a crea proxy-uri transparente: un
proxy e un program care sta intre reteua ta si restul lumii,
aand grija de traficul dintre cele doua. Partea transparenta se rezuma la
faptul ca reteua nici nu va sti ca se conecteaza la proxy, acest
lucru intamplandu-se numai in momentul in care proxy-ul nu functioneaza.
Squid poate fi configurat sa lucreaza in acest fel, si se numeste
redirectare sau proxy transparent in versiunile mai vechi de linux.
3. Tipurile de NAT
3.1 Eu impart NAT in doua categorii diferite. Source NAT (SNAT) si Destination
NAT (DNAT) (SNAT = Translatarea sursei, DNAT = Translatarea destinatiei)
Translatarea sursei (SNAT) se intampla atunci cand vrei sa modifici adresa
unui pachet. Ex: Schimbi sur0a de unde vine conexiuea. SNAT se face
intotdeauna dupa routare (POSTROUTING), inainte ca pachetul sa plece pe fir.
Masquerading'ul este o forma speciala de NAT.
Imi pare rau pentru cei inca socati de tranzitia de la kernel 2.0 (ipfwadm)
si kernel 2.2 (ipchains). Sunt vesti bune si vesti rele.
Pentru inceput, poti folosi ipchains sau ipfwadm ca inainte. Pentru a face
asta, trebuie doar rulata comanda insmod ipchains.o sau insmod ipfwadm.o,
module care se gasesc in ultima distributie netfilter.
Acestea sunt excluse mutual (ai fost avertizat), si nu trebuie sa fie
combinate cu nici un modul de netfilter.
Dupa ce aceste module s-au instalat, poti folosi ipchains sau ipfw la fel ca
inainte, cu urmatoarele diferente:
* Setare time-out'ului la masquerading cu ipchains -M -S, sau ipfwadm
-M -s nu va face nimic, deoarce time-out'urile vor fi mai lungi sub noua
structura NAT, dar oricum nu conteaza.
* Campurile init_seq, delta si previous_delta vor fi intotdeauna zero
cand in listingul masquerading'ului in mod 'verbose'
* Listarea si trecerea pe zero a contoarelor n acelasi timp nu va mai
fi posibila cu '-Z -L': contoarele nu vor fi resetatea la zero
Nota: Aici nu faci nici un fel de filtrare a pachetelor, pentru asta citeste
HOWTO pentru filtrarea pachetelor: "Mixing NAT and Packet Filtering"
#Linux 2.2
#Forwardarea pachetelor TCP care se duc pe portul 8080 catre 1.2.3.4
la 192.168.1.1 port 80
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80
# Linux 2.4
# Adauga o regula inainte de routare (-A PREROUTING) tabelei NAT (-t
nat) ca pachetele
# TCP (-p tcp) care se duc spre 1.2.3.4 (-d 1.2.3.4) port 8080 (--
dport 8080)
# sa aiba destinatia mapata (-j DNAT) spre 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
# Linux 2.4
iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080 \
-j DNAT --to 192.168.1.1:80
Tabela cu regulile NAT contine trei liste numite 'lanturi'. Fiecare regula
este examinata in ordine pana una se potriveste. Cele trei lanturi sunt
numite: PREROUTING (pentru DNAT, cum intra pachetele prima data), POSTROUTING
(pentru SNAT, cum ies pachetele) si OUTPUT (pentru DNAT sau pachete generate
local).
_____ _____
/ \ / \
PREROUTING -->[Decizie ]----------------->POSTROUTING----->
\ D-NAT/ [Routare] \S-NAT/
| ^
| __|__
| / \
| | OUTPUT|
| \D-NAT/
| ^
| | |
--------> Procesare locala ---
Cea mai importanat optiune aici este cea de selectare a tabelei, -t. Pentru
toate operatiile NAT vei vrea sa folosesti -t nat, pentru tabela NAT. A doua,
cea mai importanat optiune pe care o folosesti este -A pentru a adauga o noua
regula la capatul lantului (ex: -A POSTROUTING) sau -I pentru a adauga una la
inceputul lantului (ex: -I PREROUTING).
Poti specifica sura ('-s' sau '--source') si destinatia ('-d' sau '--
destination') pentru pachetele pentru care vrei sa faci NAT. Aceste optiuni
pot fi urmate de o singura adresa ip (ex: 192.168.1.1), un nume (ex:
www.kernelnotes.org) sau o adresa de retea (ex: 192.168.1.0/24 sau
192.168.1.0/255.255.255.0).
Poti specifica interfata pe care vin ('-i' sau '--in-interface') sau cea pe
care pleaca ('-o' sau '--out-interface') pentru care se ca potrivi, dar
interfata specificata depinde de lantul la care este pusa regula: pentru
PREROUTING se poate specifica numai interfata pe care vin pachetele, iar
pentru POSTROUTING si OUTPUT cea pe care pleaca pachetele. Daca folosesti
interfata gresita, iptables va da o eroare.
Aceste optiuni trebuie sa fie dupa '-p' (care are ca efect secundar incarcarea
librarie pentru acel protocol). Poti folosi numerele porturilor sau un nme din
fisierul /etc/services.
Toate calitatile diferite pe care le poti selecta pt. un pachet sunt detaliate
in paginile de manual (man iptables).
Deci, acum stim cum sa selectam pachetele pe care vrem sa le alteram. Pentru a
completa regula trebuie sa-i spunem kernelului exact ce vrem sa facem cu
pachetele.
Vrei sa faci SNAT; schimba adresa sursei conexiunilor la ceva diferit. Acest
lucru se face in lantul POSTROUTING, chiar inainte sa fie trimis; acesta este
un detaliu important, avnad in vedere ca orice altceva pe masina care ruleaza
linux (rouatare, filtrarea pachetelor) va vedea pachetul neschimbat. Inseamna
ca si optiunea '-o' poate fi folosita.
Masquerading
Acest lucru este facut in lantul PREROUTING, imediat cum vine pachetul, asta
inseamna ca orice altceva de pe masina care ruleaza linux (routare, filtrare
pachete) va vedea ca pachetul se duce la destinatia 'reala'. De asemenea
inseamna ca se poate folosi si optiunea '-i'.
DNAT se specifica folosind optiunea '-j DNAT', iar optiunea '--to-destination'
specifica o adresa IP, o plaja de adrese IP, un port sau o plaja de porturi
(numai pentru TCP si UDP).
Redirectare
Exista un caz special de DNAT numit redirectare: este o simpla conventie care
este exact echivalenta cu a face DNAT pe adresa interfetei de intrare.
Exista niste subtilitati la NAT pe care cei mai multi nu le vor intalni
niciodata. Ele sunt documentate aici pentru cei curiosi.
Poti folosi tinta '-j ACCEPT' pentru a lasa o conexiune sa treaca fara a face
nici un fel de NAT.
Poti sa ai reguli NAT care mapeaza pachetele pe aceeasi plaja; codul NAT este
destul de inteligent ca sa evite ciocnirile. Poti sa ai doua reguli care
mapeaza sursa adresi 192.168.1.1 si 192.168.1.2 la 1.2.3.4 ... ceea ce este in
ordine.
Mai mult, poti sa mapezi peste adrese reale, folosite, atata timp cat si ele
trec prin masina care face maparea. Deci, daca ai o retea asignata
(1.2.3.0/24), dar ai o retea interna care foloseste acele adrese si una care
foloseste adrese private 192.168.1.0/24 poti sa faci NAT foarte simplu mapand
adresele sursa din 192.168.1.0/24 peste reteaua 1.2.3.0/24 fara riscul de a se
ciocni:
Aceeasi logica se aplica si adreselor folosite chiar de masina care face NAT,
asa functioneaza masqueradingul (imparte aceeasi adresa a interfetei inte
pachetele masqueradata si pachetele 'reale' care vin de la insesi masina
respectiva).
Chiar mai mult, poti mapa aceleasi pachete pe mai multe tinte, iar ele vor fi
impartite. De exemplu, daca nu vrei sa mapezi nimic peste 1.2.3.5 ai putea sa
faci asa:
7. Protocoale speciale
Unele protocoale nu le place sa treaca prin NAT. Pentru fiecare dintre aceste
protocoale doua extensii trebuie scrise; unul pentru urmarirea conexiunilor,
iar unul chiar pentru NAT.
Daca faci NAT pentru o conexiune, toate pachetele care trec in ambele sensuri
(in si din interiorul retelei) trebuie sa treaca prin masina care face NAT,
altfel nu va functiona corespunzator. In particular, codul de urmarire a
conexiunilor reasambleaza pachetele, ceea ce inseamna ca nu numai urmarirea
conexiunilor nu va fi de incredere, dar pachetele s-ar putea sa nu treaca
deloc, deoarece fragmentele vor fi oprite.
9. SNAT si routarea
Daca faci SNAT, vei vrea sa te asiguri ca fiecare masina la care se duc
pachetele care trec prin SNAT trimit reply'uri inapoi la masina care face
SNAT. De exemplu, daca mapezi niste pachete la adresa sursa 1.2.3.4, atunci
routerul din afara trebuie sa stie sa trimita reply'uri (care vor avea
destinatia 1.2.3.4) inapoi la aceasta masina. ACest lucru se poate face in
felul urmator:
Cazul clasic este atunci cand personalul intern vrea sa acceseze serverul web
public, care de fapt este de fapt un DNAT de la adresa publica 1.2.3.4 la o
masina interna (192.168.1.1), adica asa:
11. Multumiri
Rusty.