traducere ver. 0.2 de catre Riddl
Multumiri tuturor celor care m-au ajutat, in special lui Gushterul.
Observatie f importanta: probabil ca exista unele greseli in acest document.
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de
traducere si pentru observatii pertinente trimiteti-mi mail pentru Riddl la
"discutzii at gmx dot net". Nu uitati sa precizati numele documentului.
Multumesc anticipat.
Aceasta versiune este putin modificata fata de original, deorece unii termeni
sunau foarte ciudat in ro.
Pentru ultima versiune a acestui document verifica
.
Lecturare placuta!
______________________________________________________________________
Linux 2.4 NAT HOWTO
Rusty Russell, lista de discutii netfilter@lists.samba.org
$Revision: 1.3 $ $Date: 2002/06/05 13:21:56 $
Acest document descrie cum sa realizezi masquerading, transparent proxy,
forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.
______________________________________________________________________
Cuprins
1. Introducere
2. Care este site-ul oficial si care sunt listele de discutii?
2.1. Ce inseamna NAT?
2.2. De ce as dori sa realizez NAT?
3. Doua tipuri de NAT
4. Trecere rapida de la kernelurile 2.0 si 2.2
4.1. Doresc sa realizez doar masquerading! Help!
4.2. Dar despre ipmasqadm?
5. Controlul a ceea ce dorim sa facem cu NAT?
5.1 Selectare simpla folosind iptables
5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim
modificate
6. Cum sa modificam pachetele
6.1 Folosirea NAT pentru modificarea adresei sursa (SNAT)
6.1.1 Masquerading
6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)
6.2.2 Redirectare
6.3 Mapare complexa
6.3.1. Selectarea de adrese multiple dintr-un sir
6.3.2. Realizarea de mapare NAT nula
6.3.3. Comportamentul NAT standard
6.3.4. Mapare implicita a porturilor sursa
6.3.5. Ce se intampla cand NAT-area nu reuseste
6.3.6. Mapari multiple, Suprapuneri si Conflicte
6.3.7. Schimbarea destinatiei conexiunilor generate local
7. Protocoale speciale
8. Avertizmente privind folosirea NAT
9. Folosirea SNAT si rutarea
10. Folosirea DNAT pentru adrese aflate in aceeasi retea.
11. Multumiri
______________________________________________________________________
1. Introducere
Bine ai venit!
Esti pe cale sa incepi sa inveti fascinanta (si uneori inspaimantatoare)
lume a NAT-ului: traducerea adreselor de retea. Acest Howto iti va fi
oarecum un ghid precis pentru kernelurile din linux ver. 2.4 si peste.
In kernelul de linux ver. 2.4, a fost introdus suport pentru modificarea
pachetelor, numit "netfilter". Un nivel deasupra acestuia pune la dispozitie
NAT (translatarea adreselor de retea), complet rescris fata de versiunile din
kernelurile anterioare.
(C) 2000 Paul "Rusty" Russell. Sub licenta GNU GPL.
2. Care este site-ul oficial si care sunt listele de discutii?
Sunt trei site-uri oficiale:
o Multumiri lui Filewatcher .
o Multumiri Echipei Samba si SGI .
o Multumiri lui Harald Welte .
Le poti accesa pe toate folosind round-robin DNS la:
si
Pentru lista de discutii oficiala de la netfilter, vezi:
.
2.1. Ce inseamna NAT?
In mod normal, pachetele intr-o retea se deplaseaza de la sursa (cum ar fi
computerul tau) la destinatia (cum ar fi www.securityorg.net) prin mai
multe legaturi de retea diferite: de exemplu cam 19 de la locatia in care ma
aflu eu. Nici una din aceste legaturi nu iti modifica pachetul, pur si simplu
este trimis mai departe.
Daca una din aceste legaturi ar fi facut NAT, atunci ar fi modificat sursa sau
destinatia pachetului ce intra. Dupa cum iti imaginezi nu asa a fost conceput
sistemul sa functioneze, si din aceasta cauza NAT este intodeauna ceva
in genul unui infirm. Deobicei legatura care a facut NAT va tine minte cum a
modificat pachetul, si cand un pachet replica vine din cealalta parte, va
realiza modificarea inversa a pachetului replica, asa ca totul va functiona.
2.2. De ce as dori sa realizez NAT?
Intr-o lume perfecta nu ai avea nevoie. Intre timp, principale motive sunt:
Conexiunile prin modem la internet
Cele mai multe ISP-uri iti dau doar o singura adresa IP cand te
conectezi la ei. Poti trimite pachete cu orice adresa sursa pe care o
doresti, dar doar pachetele cu aceasta adresa IP se vor intoarce la
tine. Daca doresti sa folosesti mai multe sisteme (cum ar fi reteaua
de acasa) pentru a le conecta la internet prin aceasta singura
legatura vei avea nevoie de NAT.
Aceasta este de departe cel mai raspandit mod de folosire al NAT-ului
din zilele noastre, cunoscut si sub numele de "masquerading" in lumea
Linuxului. Eu numesc aceasta SNAT, deoarece modifici adresa sursa a
primului pachet.
Servere multiple
Uneori doresti sa modifici directia in care sa se indrepte pachetele
ce intra in reteaua ta. In mod frecvent aceasta este (ca si mai sus)
deoarece ai doar o singura adresa IP, dar doresti ca oameni sa poata
sa ajunga la computerele din spatele sistemului cu adresa IP "reala".
Daca rescrii adresa destinatie a pachetelor care intra, poti realiza
acest lucru. Acest tip de NAT a fost numit forwardare (inaintare) de
porturi in versiunile anterioare de Linux.
O variatie des intalnita a acestei aplicatii al NAT-ului este
load-sharing-ul (incarcare partajata), unde se mapeaza mai multe
sisteme, permitand sistemelor sa ajung la aceste sisteme. Daca
realizezi acest lucru la o scara mare, ar fi bine sa te uiti pe
Linux Virtual Server .
Proxy transparent
Uneori doresti sa para ca fiecare pachet care trece prin sistemul tau
Linux este destinat pentru un program ruland chiar pe sistemul tau.
Acest lucru este folosit pentru a realiza proxy-uri transparente: un
proxy este un program care se interpune intre reteaua ta si lumea
exterioara, mediand comunicarea intre ele. Se numeste transparent
deoarece reteaua ta nici nu va realiza ca foloseste un proxy, doar daca
bineinteles, proxy-ul nu functioneaza.
Squid-ul poate fi configurat sa ruleze in acest mod, si aceasta era
numita redirectare sau realizare de proxy transparent in versiunile
anterioare de linux.
3. Doua tipuri de NAT
Am impartit NAT-ul in doua tipuri: NAT pentru sursa (SNAT) si NAT pentru
destinatie (DNAT).
SNAT este realizat atunci cand modifici adresa sursa al primului pachet:
schimbi sursa de unde porneste conexiunea. SNAT este intodeauna realizat dupa
procesul de rutare al pachetelor, chiar inainte de a pleca pe conexiune
pachetul. Masquerading este o forma particulara de SNAT.
DNAT este realizat cand modifici adresa destinatie al primului pachet: schimbi
destinatia unde va fi facuta conexiunea. DNAT este intodeauna realizat
inainte de rutarea pachetelor, cand pachetul tocmai a venit prin interfata.
Forwardare de porturi, load-sharing-ul, si proxy-ul transparent sunt toate
forme de DNAT.
4. Trecere rapida de la kernelurile 2.0 si 2.2
Imi pare rau pentru aceia dintre dumneavastra socati de trecerea de la
versiunea 2.0 (ipfwadm) la 2.2 (ipchains). Exista vesti bune si vesti proaste.
In primul rand, poti in mod simplu sa folosesti ipchains si ipfwadm ca mai
inainte. Pentru aceasta trebuie sa incarci (insmod) modulele pentru kernel
"ipchains.o" sau "ipfwadm.o" ce se gasesc in ultima distributie netfilter.
Acestea se exclud reciproc (ai fost avertizat), si nu ar trebui folosite cu
nici un alt modul din netfilter.
Odata ce unul din aceste module a fost incarcat, vei putea folos ipchains si
ipfwadm in mod normal, insa cu unele diferente:
- Setarea de timeout-uri pentru masquerading cu ipchains -M -S, sau ipfwadm
-M -s nu rezolva nimic. Cum timeout-urile sunt mai mari pentru noua
infrastructura NAT, acest lucru nu ar trebui sa conteze.
- Campurile init_seq, delta si previous_delta in listarea detaliata a
masqueradarii sunt intodeauna zero.
- Resetarea si listarea counter-elor simultana "-Z -L" nu mai este posibila:
countere-le nu vor fi resetate.
- Nivelul de compatibilitate nu este foarte bun pentru un numar de conexiuni
foarte mare: nu il folosi pentru gateway-ul corporatiei.
Hackerii pot deasemenea sa observe:
- Acum te poti lega si pe porturile 61000-65095 chiar daca realizezi
masquerading. Codul pentru masqueradare obisnuia sa considere ca nimic in
aceasta raza ar fi fost ceva corect, asa ca programele nu puteau sa o
foloseasca.
- "Hack-ul" (nedocumentat) "getsockname", pe care programele ce realizau proxy
transparent il puteau folosi pentru a afla adresa reala a conexiunilor nu
mai este disponibil.
- "Hack-ul" (nedocumentat) bind-to-foreign-address (atasare pe o adresa
straina) nu mai este deasemnea implementat; acesta era folosit pentru a
completa iluzia de proxy transparent.
4.1. Doresc sa realizez doar masquerading! Help!
Aceasta este ce vor majoritatea oamenilor. Daca ai o adresa PPP IP dinamica,
vrei in mod simplu sa spui sistemului tau ca toate pachetele ce vin din
reteaua interna ar trebui sa fie modificate astfel incat sa para ca vin de la
sistemul tau.
# Incarca modulul NAT (acesta introduce toate modulele necesare)
modprobe iptable_nat
# In tabela NAT (-t nat) in chain-ul POSTROUTING adauga o regula
# pentru toate pachetele care ies prin ppp0 (-p ppp0) care precizeaza
# sa masqueradeze conexiunea (-j MASQUERADE).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# Da drumul la forwardarea IP
echo 1 > /proc/sys/net/ipv4/ip_forward
Observatie: aici nu faci nici un fel de filtrare a pachetelor: pentru aceasta
citeste Packet Filtering HOWTO: capitolul "Folosirea impreuna a NAT-ului si a
filtrarii de pachete".
4.2. Dar despre ipmasqadm?
Nu este cazul sa ne facem probleme prea mari pentru compatibilitate. Poti
folosi in mod simplu "iptables -t nat" pentru a realiza forwardare de
porturi. De exemplu, in Linux 2.2 ai fi facut:
# Linux 2.2
# Forwardeaza pachetele TCP catre portul 8080, adresa 1.2.3.4, spre
# portul 80, adresa 192.168.1.1
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80
Acum ar trebui sa faci:
# Linux 2.4
# Adauga o regula inainte de procesul rutarii in chain-ul PREROUTING
# (-A PREROUTING) in tabela NAT (-t nat) pentru ca pachetele TCP
# (-p tcp) care vin spre adresa 1.2.3.4 (-d 1.2.3.4), portul 8080
# (--dport 8080) sa aiba destinatia mapata (-j DNAT) catre
# 192.168.1.1, portul 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
5. Controlul a ceea ce dorim sa facem cu NAT?
Ai nevoie sa scrii reguli NAT pentru a spune kernelului ce conexiuni sa
schimbe, si cum sa le schimbe. Pentru a realiza aceasta folosim comanda
iptables, si precizam ca dorim a schimba tabela NAT prin specificarea optiunii
"-t nat".
Tabela regulilor NAT cuprinde trei liste numite "chain-uri": fiecare regula
este examinata in chain pana cand una se potriveste. Doua chain-uri sunt
numite PREROUTING (pentru DNAT, pentru pachetele care tocmai au intrat) si
POSTROUTING (pentru SNAT, pentru pachetele care sunt pe cale sa iasa). Al
treilea chain (OUTPUT) va fi ignorat in cele ce urmeaza.
Urmatoarea diagrama ilustreaza destul de bine cum stau lucrurile:
_____ _____
/ \ / \
PREROUTING -->[Routing ]----------------->POSTROUTING----->
\D-NAT/ [Decision] \S-NAT/
| ^
| |
| |
| |
| |
| |
| |
--------> Local Process ------
La fiecare dintre punctele de mai sus, cand un pachet trece este determinat
carei conexiuni ii este asociat. Daca este o conexiune noua, este determinat
chain-ul corespunzator in tabela NAT pentru a determina ce sa facem cu acel
pachet. Raspunsul determinat va fi aplicat pentru toate pachetele viitoare
apartinand acelei conexiuni.
5.1 Selectare simpla folosind iptables
iptables admite un numar de optiuni standard dupa cum sunt listate mai jos.
Toate optiunile care incep cu "--" pot fi prescurtate, atat timp cat iptables
poate sa le deosebeasca de alte optiuni. Daca kernelul tau are iptables
compilat ca modul, este necesar sa incarci intai modulul iptables: "insmod
ip_tables".
Cea mai importanta optiune in acest caz este optiunea de selectare a tabelei,
"-t". Pentru toate actiune NAT, vei dori sa folosesti "-t nat" pentru tabela
NAT. A doua cea mai importanta optiune este "-A" pentru a adauga o noua regula
la sfarsitul unui chain ("-A POSTROUTING"), sau "-I" pentru a insera o regula
la inceputul unui chain ("-I PREROUTING").
Poti specifia sursa ("-s" sau "--source") si destinatia ("-d" sau
"--destination") pachetelor pe care le doresti sa le prelucrezi prin NAT.
Aceste optiuni pot fi urmate de o singura adresa IP (192.168.1.1), un nume
(www.securityorg.net), sau o adresa de retea (192.168.1.0/24 sau
192.168.1.0/255.255.255.0).
Poti specifica interfata cu care sa se potriveasca regula, de intrare ("-i"
sau "--in-interface") sau de iesire ("-o" sau "--out-interface"), dar ceea ce
poti specifica depinde si de chain-ul in care introduci regula: pentru
chain-ul PREROUTING poti selecta numai interfete prin care intra pachetele,
si in chain-ul POSTROUTING poti selecta numai interfete de iesire. Daca
folosesti o interfata gresita iptables iti va da eroare.
5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim modificate
Am spus mai sus ca poti preciza o adresa sursa si destinatie. Daca vei omite
optiunea privitoare la adresa sursa, atunci regula se va potrivi pentru
orice adresa sursa. Analog, daca omiti optiunea pentru adresa destinatie, atunci
regula se va potrivi pentru orice adresa destinatie.
Poti deasemenea indica un protocol specific ("-p" sau "--protocol"), cum ar fi
TCP sau UDP; doar pachetele de acest tip se vor potrivi cu regula. Principalul
motiv pentru a preciza unul dintre aceste protocoale permite apoi folosirea de
noi optiuni: in special optiunile "--source-port" si "--destination-port"
(prescurtate "--sport" si "--dport").
Aceste optiuni iti permite sa specifici ca numai pachetele cu anumite porturi
destinatie sau porturi sursa se vor potrivi cu regulii. Aceste optiuni sunt
folositoare, de exemplu, pentru redirectarea cererilor web (porturile TCP 80
sau 8080) si nemodificarea celorlalte pachete.
Aceste optiuni trebuie sa fie puse dupa optiunea "-p" (care are ca alt efect
incarcarea optiunilor extinse pentru acel protocol). Poti folosi pentru
porturi numere, sau nume cum sunt scrise in fisierul /etc/services.
Toate caracteristicile dupa care poti selecta un pachet sunt detaliate in
pagina de manual pentru iptables (man iptables).
6. Cum sa modificam pachetele
In concluzie, acum stim cum sa selectam pachetele pe care le dorim modificate.
Pentru a scrie regulile complete trebuie sa spunem kernelului cu exactitate
ceea ce dorim sa facem pachetelor.
6.1 Folosirea NAT pentru modificarea adresei sursa
Doresti sa faci SNAT; sa schimbi adresa sursa a conexiunilor cu ceva diferit.
Acesta este realizat in chain-ul POSTROUTING, chiar inainte de a fi trimis
pachetul; acesta este un detaliu important, deoarece inseamna ca orice alceva
in sistemul Linux (rutare, filtrare de pachete) va vedea doar pachetul
neschimbat. Mai inseamna deasemenea ca optiunea "-o" (interfata de iesire)
poate fi folosita.
SNAT este specificat folosind optiunea "-j SNAT"; si optiunea "--to-source"
specifica o adresa IP, un sir de adrese IP, si un port optional sau un sir de
porturi (doar in cazul protocoalelor UDP si TCP).
## Schimba adresa sursa cu 1.2.3.4
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
## Schimba adresa sursa cu 1.2.3.4, 1.2.3.5 sau 1.2.3.6
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
## Schimba adresa sursa cu 1.2.3.4, si porturile intre 1-1023
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4:1-1023
6.1.1 Masquerading
Exista un caz particular de SNAT numit masquerading: ar trebui sa fie folosit
numai pentru adrese IP asignate dinamic, cum ar fi in cazul celor ce se
conecteaza prin dial-up (pentru adrese IP statice, foloseste SNAT ca mai sus).
Nu este necesar cand faci masquerading sa specifici adresa sursa: deoarece va
folosi adresa sursa a interfetei prin care va iesi pachetul. Dar ce este mai
importat, daca legatura cu ISP-ul cade, conexiunile (care acum sunt pierdute
oricum) sunt uitate, acest lucru inseamnand mai putine probleme tehnice cand
legatura cu ISP-ul revine cu o noua adresa IP.
## masqueradare pentru ppp0
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)
Aceasta se realizeaza in chain-ul PREROUTING, exact dupa primirea
pachetului, aceasta insemna ca orice in sistemul Linux (rutare, filtrare de
pachete) va vedea pachetul cu noua adresa destinatie. Mai inseamna ca optiunea
"-i" (interfata de intrare) poate fi folosita.
Se specifica folosirea DNAT cu ajutorul optiunii "-j DNAT", iar optiunea
"--to-detination" specifica o adresa IP, un sir de adrese IP, si un port
optional sau un sir de porturi (acest lucru fiind valabil doar pentru
protocoalele UPD si TCP).
## Schimba adresa destinatie cu 5.6.7.8
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
## Schimba adresa destinatie cu 5.6.7.8, 5.6.7.9 sau 5.6.7.10.
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10
##Schimba adresa destinatie a traficului spre portul 80 cu 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
6.2.2 Redirectare
Exista un caz particular de DNAT numita redirectare: este o simpla conventie
care este echivalenta cu a realiza DNAT catre adresa interfetei prin care
intra pachetele.
## Trimite traficul care vine pe portul 80 catre squid (proxy-ul
transparent
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
Observatie: squid-ul trebuie sa fie configurat pentru a putea fi folosit ca
proxy transparent!
6.3 Mapare complexa
Sunt cateva lucruri rafinate in folosirea NAT pe care majoritatea oamenilor nu
vor avea nevoie sa le foloseasca. Aceste lucruri sunt documentate mai jos
pentru curiosi.
6.3.1. Selectarea de adrese multiple dintr-un sir
Daca un sir de adrese IP este specificat, adresa IP care va fi folosita este
bazata pe cea mai putin folosita la conexiuni adresa IP de care sistemul stie.
Acest comportament furnizeaza load-balancing primar.
6.3.2. Realizarea de mapare NAT nula
Poti folosi tinta "-j ACCEPT" pentru a permite realizarea conexiunii fara sa
fie realizat deloc NAT.
6.3.3. Comportamentul NAT standard
Comportamentul obisnuit este sa modifice conexiunea cat mai putin posibil, cu
exceptia regulilor date de catre utilizator. Aceasta inseamna ca nu vor fi
remapate porturile decat daca suntem obligati sa realizam acest lucru.
6.3.4. Mapare implicita a porturilor sursa
Chiar daca folosirea NAT nu este ceruta pentru o conexiune, translatarea
portului sursa poate fi facut automat, daca o alta conexiune a fost mapata
peste una noua. De exemplu considerati un caz care este comun in masquerading:
1. O conexiune web este realizata de la un sistem cu IP-ul 192.1.1.1 cu portul
sursa 1024 catre www.securityorg.net portul 80.
2. Aceasta conexiune este masqueradata de un sistem care se ocupa cu acest
lucru, pentru a folosi IP-ul sursa al sistemului ce realizeaza masqueradarea
(1.2.3.4)
3. Insusi sistemul ce realizeaza masquerading initiaza o conexiune catre
www.securityorg.net, portul 80, de la 1.2.3.4 (adresa interfetei externe)
portul 1024
4. Codul NAT va modifica portul sursa al celei de-a doua conexiuni cu 1025,
astfel ca sa nu existe conflict intre cele doua conexiuni.
Cand se realizeaza aceasta mapare automata a sursei, porturile sunt impartite
in trei clase:
o Porturile sub 512
o Porturile intre 512 si 1023
o Porturile de la 1024, inclusiv, in sus
Un port nu va fi niciodata mapat automat intr-o clasa diferita.
6.3.5. Ce se intampla cand NAT-area nu reuseste
Daca nu mai este disponibil nici un mod in care sa se relizeze maparea unica a
conexiunii cerute de catre utilizator, conexiunea va fi abandonata. Acest
comportament se aplica ai in cazurile in care pachetele nu au putut fi
clasificate ca parte a unei conexiuni, deoarece sunt malformate, sau sistemul
nu mai are memorie libera, etc.
6.3.6. Mapari multiple, Suprapuneri si Conflicte
Daca ai reguli care folosesc NAT pentru mapare de porturi aflate intr-o raza
comuna; codul NAT este destul de inteligent pentru a evita conflicte. Aceasta
pentru ca, avand doua reguli, este corecta maparea adresei sursa pentru
192.168.1.1 si respectiv 192.168.1.2 in adresa 1.2.3.4.
Mai mult, poti face mapare peste adrese IP reale folosite, atat timp cat
aceste adrese trec deasemenea prin masina care realizeaza maparea. Asa ca daca
ai o retea asignata (1.2.3.0/24), dar ai o retea interna care foloseste
aceasta clasa de IP-uri si inca o retea care foloseste o clasa de adrese IP
private 192.168.1.0/24, poti sa realizezi SNAT pentru adresele cu sursa IP
192.168.1.0/24 peste adresele din reteaua 1.2.3.0, fara sa iti fie teama de
conflicte:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
-j SNAT --to 1.2.3.0/24
Aceeasi logica se aplica adreselor folosite de insusi sistemul ce realizeaza
NAT: in acest fel functioneaza si masquerading-ul (prin folosirea impreuna a
adresei interfatei de catre pachetele masqueradate si pachetele "reale"
venite de la insusi sistemul ca realizeaza masquerading-ul).
De altfel, poti mapa aceleasi pachete pe mai multe sisteme diferite, si
acestea vor fi folosite in comun. De exemplu, daca nu doresti sa mappezi nimic
peste adresa 1.2.3.5, ai putea sa dai urmatoarea comanda:
# 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
6.3.7. Schimbarea destinatiei conexiunilor generate local
Codul NAT iti permite sa introduce reguli in chainul OUTPUT avand ca tinta
DNAT, dar acest lucru nu este in intregime suportat in kernelurile 2.4 (poate
fi programat dar are nevoie de noi optiuni, testari, si putina programare,
asa ca daca nimeni nu il contacteaza pe Rusty pentru al scrie, nu o sa fie
disponibil prea devreme).
Limitarea curenta este faptul ca poti sa schimbi destinatia pachetelor doar
catre sistemul local ( "-j DNAT --to 127.0.0.1"), nu si catre alte sisteme, in
caz contrar replicile nu vor fi primite in mod corect inapoi.
7. Protocoale speciale
Unele protocoale nu accepta sa fie NAT-uite. Pentru fiecare dintre aceste
protocoale, doua module speciale trebuiesc scrie; unul pentru urmarirea
conexiunilor si al doilea pentru operatia de NAT-are propriu-zisa.
In cadrul distributiei netfilter, exista module pentru ftp: ip_conntrack_ftp.o
si ip_nat_ftp.o. Daca le inserezi in kernel (insmod) sau le compilezi in
kernel, atunci realizarea oricarui tip de NAT pentru conexiuni ftp ar trebui
sa functioneze. Daca nu, atunci poti folosi ftp pasiv, si chiar si atunci s-ar
putea sa nu functioneze foarte sigur daca vrei sa realizezi alceva decat SNAT.
8. Avertizmente privind folosirea NAT
Daca realizezi NAT pentru o conexiune, pachetele venind din ambele sensuri
(din afara si din inauntrul retelei) trebuie sa treaca prin sistemul care
realizeaza NAT-area, in caz contrar lucrurile nu vor functiona sigur. In
special, codul urmarii conexiunilor reansambleaza fragmentele, care inseamna
ca nu numai depistarea conexiunilor nu va fi sigura, dar chiar si pachetele
s-ar putea sa nu treaca deloc, ca fragmente fiind retinute.
9. Folosirea SNAT si rutarea
Daca doresti sa realizezi SNAT, vei dori sa fii sigur ca fiecare masina la
care ajung pachete care sunt parte a unei conexiuni SNAT, vor trimite
pachetele replica inapoi la sistemul care realizeaza SNAT-ul.
De exemplu, daca mapezi niste pachete ce ies, cu adresa sursa 1.2.3.4, atunci
ruterul extern trebuie sa stie ca trebuie sa trimita pachetele replica inapoi
(care vor avea adresa destinatie 1.2.3.4) catre acest sistem.
Acest lucru poate fi realizat in urmatoarele moduri:
1. Daca realizezi SNAT peste adresa propriului sistem (pentru care rutarea si
toate celelalte merg deja), nu trebuie sa faci nimic
2. Daca realizezi SNAT peste o adresa nefolosita din propriul LAN (de exemplu,
mappezi peste 1.2.3.99, o adresa IP nefolosita din reteaua ta 1.2.3.0/24),
sistemul ce realizeaza NAT va trebui sa raspunda la cereri ARP pentru aceea
adresa ca si pentru propria sa adresa: cea mai simpla metoda de a rezolva
acest lucru este sa creezi un alias pentru adresa IP, de exemplu:
# ip address add 1.2.3.99 dev eth0
3. Daca realizezi SNAT peste o adresa complet diferita, va trebui sa te asiguri
ca masinile la care vor ajunge pachetele SNAT-atate vor ruta aceasta adresa
inapoi catre sistemul pe care se realizeaza SNAT-ul. Aceasta este realizata
deja daca sistemul care realizeaza SNAT-ul este gateway-ul lor default, in caz
contrar va trebui sa adaugi o ruta pe fiecare sistem prin care trec pachetele
modificate.
10. Folosirea DNAT pentru adrese aflate in aceeasi retea.
Daca realizezi forwardare de porturi inapoi in aceeasi retea, trebuie sa fii
sigur ca atat pachetele viitoare cat si pachetele ce vin in replica vor trece
prin sistemul ce realizeaza DNAT-ul (pentru ca acestea sa fie modificate).
Codul NAT va bloca (inca din ver. 2.4.0-test6) pachetele ICMP de redirectare
care rezulta atunci cand pachetele NAT-ate se indreapta catre aceeasi interfata
spre care au venit, dar serverul care primeste acele pachete va incerca in
continuare sa raspunda direct catre client (care nu va recunoaste pachetele
replica).
Cazul clasic este cand un sistem din reteaua interna incearca sa acceseze
serverul www "public", care este defapt DNAT-at de la adresa publica (1.2.3.4)
catre un sistem din reteaua interna (192.168.1.1), astfel:
# iptables -t nat -A PREROUTING -d 1.2.3.4 \
-p tcp --dport 80 -j DNAT --to 192.168.1.1
O cale este sa rulezi un server de DNS intern care sa stie adresa IP reala
(interna) al site-ului public de web, si sa inainteze toate celelate cereri
catre un server DNS extern. Aceasta inseamna ca va fi folosita o conexiune
directa catre server-ul de web, fara sa mai fie nevoie de a trece prin
sistemul care realizeaza NAT.
Cealalta cale este sa realizezi, pe sistemul care face DNAT, mapparea adresei
sursa spre propria lui adresa pentru conexiunile venind din reteaua interna,
pacalind serverul de web sa trimita pachetele replica spre masina ce se ocupa
cu NAT-area. Pentru acest exemplu vom proceda astfel (presupunem ca adresa IP
al sistemului care realizeaza NAT este 192.168.1.250):
# 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
Deoarece regula din chain-ul PREROUTING este executata prima, pachetele vor fi
deja destinate pentru server-ul de web intern: putem preciza care din pachete
sunt din reteaua interna dupa adresa IP sursa.
11. Multumiri
Multumirile sunt in primul rand pentru WatchGuard, si David Bonn, care a
crezut in ideea netfilter destul pentru a ma sustine sa o tranform in
realitate. Si pentru toti ceilalti, care m-au suportat cand faceam pe grozavul
cand am invatat despre uratenia NAT-ului, in special celor ce mi-au citit
jurnalul.
Rusty.