NAT HOWTO: Diferență între versiuni

De la Wiki.lug.ro
Salt la: navigare, căutare
m
(aVCPHsoECney)
Linia 1: Linia 1:
Aceasta este o traducere a NAT HOWTO publicată de proiectul netfilter la
+
My hat is off to your astute cmmoand over this topic-bravo!
http://www.netfilter.org/documentation/HOWTO//NAT-HOWTO.html
 
 
 
Documentul este publicat sub licenţă GNU GPL, (C) 2002 Paul `Rusty' Russell.
 
 
 
Traducera originală a fost preluată de la
 
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/ro/text/NAT-HOWTO
 
şi începe cu următorul text:
 
 
 
 
 
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.
 
 
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 să realizezi masquerading, transparent proxy, forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.
 
 
 
 
 
=Introducere=
 
 
 
Bine ai venit!
 
 
 
Eşti pe cale să începi să înveţi fascinanta (şi uneori înspăimântătoare)
 
lume a NAT-ului: traducerea adreselor de reţea. Acest Howto îţi va fi
 
oarecum un ghid pentru kernelurile din linux ver. 2.4 şi peste.
 
 
 
În kernelul de linux ver. 2.4, a fost introdus suport pentru modificarea
 
pachetelor, numit "netfilter". Un nivel deasupra acestuia pune la dispoziţie
 
NAT (translatarea adreselor de reţea), complet rescris fata de versiunile din
 
kernelurile anterioare.
 
 
 
(C) 2000 Paul "Rusty" Russell.  Sub licenţă GNU GPL.
 
 
 
 
 
 
 
=Care este site-ul oficial şi care sunt listele de discuţii?=
 
 
 
Exiată trei site-uri oficiale:
 
 
 
o      Mulţumiri lui Filewatcher <http://netfilter.filewatcher.org/>.
 
o      Mulţumiri Echipei Samba şi SGI <http://netfilter.samba.org/>.
 
o      Mulţumiri lui Harald Welte <http://netfilter.gnumonks.org/>.
 
 
 
Le poţi accesa pe toate folosind round-robin DNS la:
 
http://www.netfilter.org/ şi  http://www.iptables.org/
 
 
 
Pentru lista de discuţii oficiala de la netfilter, vezi:
 
http://www.netfilter.org/contact.html#list
 
 
 
 
 
 
 
==Ce înseamnă NAT?==
 
 
 
În mod normal, pachetele într-o reţea se deplasează de la sursă  (cum ar fi
 
computerul tău) la destinaţie  (cum ar fi www.securityorg.net) prin mai
 
multe legături de reţea diferite: de exemplu cam 19 de la locaţia în care mă
 
aflu eu. Nici una din aceste legături nu îţi modifica pachetul, care pur şi simplu
 
este trimis mai departe aşa cum este.
 
 
 
Dacă una din aceste legături ar fi făcut NAT, atunci ar fi modificat sursa sau
 
destinaţia pachetului ce intră. După cum îţi imaginezi nu aşa a fost conceput
 
sistemul să funcţioneze, şi din această cauză NAT este întotdeauna ceva
 
neobişnuit. De obicei legătura care a făcut NAT va ţine minte cum a
 
modificat pachetul, şi când un pachet replică vine din cealaltă parte, va
 
realiza modificarea inversă a pachetului replică, aşa că totul va funcţiona.
 
 
 
 
 
 
 
==De ce aş dori să realizez NAT?==
 
 
 
Într-o lume perfectă nu ai avea nevoie. Principale motive sunt:
 
 
 
===Conexiunile prin modem la internet===
 
 
 
Cele mai multe ISP-uri îţi dau doar o singura adresă IP când te
 
conectezi la ei. Poţi trimite pachete cu orice adresă sursă pe care o
 
doreşti, dar doar pachetele cu adresa IP specificată de ISP se vor întoarce la
 
tine. Dacă doreşti să foloseşti mai multe sisteme (cum ar fi reţeaua
 
de acasă) pentru a le conecta la internet prin aceasta singură
 
legătură vei avea nevoie de NAT.
 
 
 
Aceasta este de departe cel mai răspândit mod de folosire al NAT-ului
 
din zilele noastre, cunoscut şi sub numele de "masquerading" în lumea
 
Linuxului. Eu numesc aceasta SNAT, deoarece modifici adresa sursă a
 
primului pachet.
 
 
 
===Servere multiple===
 
 
 
Uneori doreşti să modifici direcţia în care să se îndrepte pachetele
 
ce intră în reţeaua ta. În mod frecvent aceasta este (ca şi mai sus)
 
deoarece ai doar o singură adresă IP, dar doreşti ca oameni să poată
 
să ajungă la computerele din spatele sistemului cu adresa IP "reala".
 
 
 
Dacă rescrii adresa destinaţie a pachetelor care intra, poţi realiza
 
acest lucru. Acest tip de NAT a fost numit forwardare (înaintare) de
 
porturi în versiunile anterioare de Linux.
 
 
 
O variaţie des întâlnită a acestei aplicaţii a NAT-ului este
 
load-sharing-ul (încărcare partajată), unde se mapează mai multe
 
sisteme pe o singură adresă IP. Dacă
 
realizezi acest lucru la o scară mare, ar fi bine să te uiţi pe
 
Linux Virtual Server <http://linuxvirtualserver.org/>.
 
 
 
===Proxy transparent===
 
 
 
Uneori doreşti să pară că fiecare pachet care trece prin sistemul tău
 
Linux este destinat pentru un program rulând chiar pe sistemul tău.
 
Acest lucru este folosit pentru a realiza proxy-uri transparente: un
 
proxy este un program care se interpune între reţeaua ta şi lumea
 
exterioară, mediând comunicarea între ele. Se numeşte transparent
 
deoarece reţeaua ta nici nu va realiza că foloseşte un proxy, doar dacă
 
bineînţeles, proxy-ul nu funcţionează.
 
 
 
Squid poate fi configurat să ruleze în acest mod, şi aceasta era
 
numită redirectare sau realizare de proxy transparent în versiunile
 
anterioare de linux.
 
 
 
=Doua tipuri de NAT=
 
 
 
Am împărţit NAT-ul în două tipuri: NAT pentru sursă (SNAT) şi NAT pentru
 
destinaţie (DNAT).
 
 
 
SNAT este realizat atunci când modifici adresa sursă a pachetului
 
(schimbi sursa conexiunii). SNAT are întotdeauna loc după
 
procesul de rutare a pachetelor, chiar înainte ca acestă să fie trimis pe conexiune.
 
Masquerading este o forma particulară de SNAT.
 
 
 
DNAT este realizat când modifici adresa destinaţie a pachetului
 
(schimbi destinaţia conexinunii). DNAT are întotdeauna loc
 
înainte de rutarea pachetelor, când pachetul tocmai a venit prin interfaţă.
 
Forwardare de porturi, load-sharing-ul, şi proxy-ul transparent sunt toate
 
forme de DNAT.
 
 
 
 
 
 
 
=Trecere rapida de la kernelurile 2.0 şi 2.2=
 
 
 
Îmi pare rău pentru aceia dintre dumneavastră şocaţi de trecerea de la
 
versiunea 2.0 (ipfwadm) la 2.2 (ipchains). Există veşti bune şi veşti proaste.
 
 
 
În primul rând, poţi în mod simplu să foloseşti ipchains şi ipfwadm ca mai
 
înainte. Pentru aceasta trebuie să încarci (insmod) modulele pentru kernel
 
"ipchains.o" sau "ipfwadm.o" ce se găsesc în ultima distribuţie netfilter.
 
Acestea se exclud reciproc (ai fost avertizat), şi nu ar trebui folosite cu
 
nici un alt modul din netfilter.
 
 
 
Odată ce unul din aceste module a fost încărcat, vei putea folosi ipchains şi
 
ipfwadm în mod normal, însă cu unele diferenţe:
 
 
 
- 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 să conteze.
 
 
- Câmpurile init_seq, delta şi previous_delta în listarea detaliată a
 
      masqueradarii sunt întotdeauna zero.
 
 
- Resetarea şi listarea counter-elor simultană "-Z -L" nu mai este posibilă:
 
      countere-le nu vor fi resetate.
 
 
 
- Nivelul de compatibilitate nu este foarte bun pentru un număr de conexiuni
 
      foarte mare: nu îl poţi foloşi pentru gateway-ul corporaţiei.
 
 
 
Hackerii pot de asemenea să observe:
 
 
 
- Acum te poţi lega şi pe porturile 61000-65095 chiar dacă realizezi
 
      masquerading. Codul pentru masqueradare obişnuia să considere ca nimic în
 
      aceasta raza ar fi fost ceva corect, aşa ca programele nu puteau să o
 
      folosească.
 
 
- "Hack-ul" (nedocumentat) "getsockname", pe care programele ce realizau proxy
 
      transparent îl puteau foloşi pentru a afla adresa reala a conexiunilor nu
 
      mai este disponibil.
 
 
- "Hack-ul" (nedocumentat) bind-to-foreign-address (ataşare pe o adresă
 
      străină) nu mai este de asemnea implementat; acesta era folosit pentru a
 
      completa iluzia de proxy transparent.
 
 
 
 
 
 
 
==Doresc să realizez doar masquerading! Help!==
 
 
 
Aceasta este ce vor majoritatea oamenilor. Dacă ai o adresă PPP IP dinamică,
 
vrei în mod simplu să spui sistemului tău că toate pachetele ce vin din
 
reţeaua internă ar trebui să fie modificate astfel încât să pară că vin de la
 
sistemul tău.
 
 
 
# Încarcă modulul NAT (acesta introduce toate modulele necesare)
 
modprobe iptable_nat
 
 
# În tabela NAT (-t nat) în chain-ul POSTROUTING adaugă o regula
 
# pentru toate pachetele care ies prin ppp0 (-p ppp0) care precizează
 
# să 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
 
 
 
Observaţie: aici nu faci nici un fel de filtrare a pachetelor: pentru aceasta
 
citeşte Packet Filtering HOWTO: capitolul "Folosirea împreună a NAT-ului şi a
 
filtrării de pachete".
 
 
 
 
 
 
 
==Dar despre ipmasqadm?==
 
 
 
Nu este cazul să ne facem probleme prea mari pentru compatibilitate. Poţi
 
folosi în mod simplu  "iptables -t nat" pentru a realiza forwardare de
 
porturi. De exemplu, în Linux 2.2 ai fi făcut:
 
 
# Linux 2.2
 
# Forwardeaza pachetele TCP către 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 să faci:
 
 
 
# Linux 2.4
 
# Adaugă o regula înainte de procesul rutării în chain-ul PREROUTING
 
# (-A PREROUTING) în 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) să aibă destinaţia mapată (-j DNAT) către
 
# 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
 
 
 
 
 
 
 
=Controlul a ceea ce dorim să facem cu NAT?=
 
 
 
Ai nevoie să scrii reguli NAT pentru a spune kernelului ce conexiuni să
 
schimbe, şi cum să le schimbe. Pentru a realiza aceasta folosim comanda
 
iptables, şi precizam ca dorim să schimbăm tabela NAT prin specificarea opţiunii
 
"-t nat".
 
 
 
Tabela regulilor NAT cuprinde trei liste numite "chain-uri": fiecare regulă
 
este examinată în chain până când una se potriveşte. Două chain-uri sunt
 
numite PREROUTING (pentru DNAT, pentru pachetele care tocmai au intrat) şi
 
POSTROUTING (pentru SNAT, pentru pachetele care sunt pe cale să iasă). Al
 
treilea chain (OUTPUT) va fi ignorat în cele ce urmează.
 
 
 
Următoarea diagrama ilustrează destul de bine cum stau lucrurile:
 
 
 
            _____                                    _____
 
            /    \                                  /    \
 
          PREROUTING -->[Routing ]----------------->POSTROUTING----->
 
            \D-NAT/    [Decision]                    \S-NAT/
 
                            |                            ^
 
                            |                            |
 
                            |                            |
 
                            |                            |
 
                            |                            |
 
                            |                            |
 
                            |                            |
 
                            --------> Local Process ------
 
 
 
 
 
La fiecare dintre punctele de mai sus, când un pachet trece este determinat
 
cărei conexiuni îi este asociat. Dacă este o conexiune nouă, este determinat
 
chain-ul corespunzător în tabela NAT pentru a determina ce să facem cu acel
 
pachet. Răspunsul va fi aplicat pentru toate pachetele viitoare
 
aparţinând acelei conexiuni.
 
 
 
 
 
 
 
==Selectare simpla folosind iptables==
 
 
 
iptables admite un număr de opţiuni standard care sunt listate mai jos.
 
Toate opţiunile care încep cu "--" pot fi prescurtate, atât timp cât iptables
 
poate să le deosebească de alte opţiuni. Dacă kernelul tău are iptables
 
compilat ca modul, este necesar să încarci întâi modulul iptables: "insmod
 
ip_tables".
 
 
 
Cea mai importanta opţiune în acest caz este opţiunea de selectare a tabelei,
 
"-t". Pentru toate acţiune NAT, vei dori să foloseşti "-t nat" pentru tabela
 
NAT. A doua cea mai importanta opţiune este "-A" pentru a adaugă o nouă regulă
 
la sfârşitul unui chain ("-A POSTROUTING"), sau "-I" pentru a insera o regulă
 
la începutul unui chain ("-I PREROUTING").
 
 
 
Poţi specifica sursa ("-s" sau "--source") şi destinaţia ("-d" sau
 
"--destination") pachetelor pe care le doreşti să le prelucrezi prin NAT.
 
Aceste opţiuni pot fi urmate de o singura adresă IP (192.168.1.1), un nume
 
(www.securityorg.net), sau o adresă de reţea (192.168.1.0/24 sau
 
192.168.1.0/255.255.255.0).
 
 
 
Poţi specifica interfaţa cu care să se potrivească regula, de intrare ("-i"
 
sau "--in-interface") sau de ieşire ("-o" sau "--out-interface"), dar ceea ce
 
poţi specifica depinde şi de chain-ul în care introduci regula: pentru
 
chain-ul PREROUTING poţi selecta numai interfeţe prin care intra pachetele,
 
şi în chain-ul POSTROUTING poţi selecta numai interfeţe de ieşire. Dacă
 
foloseşti o interfaţă greşită iptables îţi va da eroare.
 
 
 
 
 
 
 
==Aspecte delicate în privinţă selectării pachetelor ce le dorim modificate==
 
 
 
Am spus mai sus ca poţi preciza o adresă sursă şi destinaţie. Dacă vei omite
 
opţiunea privitoare la adresa sursă, atunci regula se va potrivi pentru
 
orice adresă sursă. Analog, dacă omiţi opţiunea pentru adresa destinaţie, atunci
 
regula se va potrivi pentru orice adresa destinaţie.
 
 
 
Poţi de asemenea 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 este de a selecta porturi specifice:
 
"--source-port" şi "--destination-port"
 
(prescurtate "--sport" şi "--dport").
 
 
 
Aceste opţiuni îţi permite să specifici că numai pachetele cu anumite porturi
 
destinaţie sau porturi sursă se vor potrivi cu regulii. Aceste opţiuni sunt
 
folositoare, de exemplu, pentru redirectarea cererilor web (porturile TCP 80
 
sau 8080) şi nemodificarea celorlalte pachete.
 
 
 
Aceste opţiuni trebuie să fie introduse după opţiunea "-p" (care are ca alt efect
 
încărcarea opţiunilor extinse pentru acel protocol). Poţi foloşi pentru
 
porturi numere, sau nume precum cele din fişierul /etc/services.
 
 
 
Toate caracteristicile după care poţi selecta un pachet sunt detaliate în
 
pagina de manual pentru iptables (man iptables).
 
 
 
 
 
 
 
=Cum modificăm pachetele=
 
 
 
În concluzie, acum ştim cum selectăm pachetele pe care le dorim modificate.
 
Pentru a scrie regulile complete trebuie să spunem kernelului cu exactitate
 
ceea ce dorim să facem pachetelor.
 
 
 
 
 
 
 
==Folosirea NAT pentru modificarea adresei sursă==
 
 
 
Doreşti să faci SNAT; să schimbi adresa sursă a conexiunilor cu ceva diferit.
 
Acesta este realizat în chain-ul POSTROUTING, chiar înainte de a fi trimis
 
pachetul; acesta este un detaliu important, deoarece înseamnă că orice altceva
 
în sistemul Linux (rutare, filtrare de pachete) va vedea doar pachetul
 
neschimbat. Mai înseamnă de asemenea că opţiunea "-o" (interfaţa de ieşire)
 
poate fi folosită.
 
 
 
SNAT este specificat folosind opţiunea "-j SNAT"; iar opţiunea "--to-source"
 
specifică o adresă IP, un şir de adrese IP, şi un port opţional sau un şir de
 
porturi (doar în cazul protocoalelor UDP şi TCP).
 
 
 
## Schimba adresa sursă cu 1.2.3.4
 
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
 
 
## Schimba adresa sursă 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 sursă cu 1.2.3.4, şi porturile intre 1-1023
 
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4:1-1023
 
 
 
 
 
 
 
===Masquerading===
 
 
 
Există un caz particular de SNAT numit masquerading: ar trebui să fie folosit
 
numai pentru adrese IP asignate dinamic, cum ar fi în cazul celor ce se
 
conectează prin dial-up (pentru adrese IP statice, foloseşte SNAT ca mai sus).
 
 
 
Nu este necesar când faci masquerading să specifici adresa sursă: deoarece vei
 
folosi adresa sursă a interfeţei prin care va ieşi pachetul. Dar ce este mai
 
importat, dacă legătura cu ISP-ul cade, conexiunile (care acum sunt pierdute
 
oricum) sunt uitate, acest lucru generând mai puţine probleme tehnice când
 
legătura cu ISP-ul revine cu o nouă adresă IP.
 
 
 
## masqueradare pentru ppp0
 
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
 
 
 
 
 
 
 
==Folosirea NAT pentru modificarea adresei destinaţie (DNAT)==
 
 
 
Aceasta se realizează  în chain-ul PREROUTING, exact  după primirea
 
pachetului, aceasta însemnă că orice în sistemul Linux (rutare, filtrare de
 
pachete) va vedea pachetul cu noua adresă destinaţie. Mai înseamna că opţiunea
 
"-i" (interfaţă de intrare) poate fi folosita.
 
 
 
Se specifică folosirea DNAT cu ajutorul opţiunii "-j DNAT", iar opţiunea
 
"--to-detination" specifică o adresă IP, un şir de adrese IP, şi un port
 
opţional sau un şir de porturi (acest lucru fiind valabil doar pentru
 
protocoalele UPD şi TCP).
 
 
 
  ## Schimba adresa destinaţie cu 5.6.7.8
 
  # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8
 
 
  ## Schimba adresa destinaţie 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 destinaţie 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
 
 
 
 
 
 
 
===Redirectare===
 
 
 
Există un caz particular de DNAT numit redirectare: este o simplă convenţie
 
care este echivalentă cu realizarea DNAT către adresa interfeţei prin care
 
intră pachetele.
 
 
 
## Trimite traficul care vine pe portul 80 către squid (proxy-ul transparent
 
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
 
          -j REDIRECT --to-port 3128
 
   
 
Observaţie: squid trebuie să fie configurat pentru a putea fi folosit ca
 
proxy transparent!
 
 
 
 
 
 
 
==Mapare complexă==
 
 
 
Există câteva lucruri rafinate în folosirea NAT pe care majoritatea oamenilor nu
 
vor avea nevoie să le folosească. Aceste lucruri sunt documentate mai jos
 
pentru curioşi.
 
 
 
 
 
 
 
===Selectarea de adrese multiple dintr-un sir===
 
 
 
Dacă un şir de adrese IP este specificat, adresa IP care va fi folosită este
 
cea cu cele mai puţine coexiuni active.
 
Acest comportament furnizează load-balancing primar.
 
 
 
 
 
 
 
===Realizarea de mapare NAT nulă===
 
 
 
Poţi folosi ţinta "-j ACCEPT" pentru a permite realizarea conexiunii fără NAT
 
 
 
 
 
 
 
===Comportamentul NAT standard==
 
 
 
Comportamentul obişnuit este să modifice conexiunea cât mai puţin posibil, cu
 
excepţia regulilor date de către utilizator. Aceasta înseamna că nu vor fi
 
remapate porturile decât dacă suntem obligaţi să realizăm acest lucru.
 
 
 
 
 
 
 
===Mapare implicită a porturilor sursă===
 
Chiar dacă folosirea NAT nu este ceruta pentru o conexiune, translatarea
 
portului sursă poate fi făcut automat, dacă o alta conexiune a fost mapată
 
peste una nouă. De exemplu consideraţi un caz care este comun în masquerading:
 
 
 
1. O conexiune web este realizată de la un sistem cu IP-ul 192.1.1.1 cu portul
 
sursă 1024 către www.securityorg.net portul 80.
 
 
 
2. Aceasta conexiune este masqueradată de un sistem care se ocupa cu acest
 
lucru, pentru a folosi IP-ul sursă al sistemului ce realizează masqueradarea
 
(1.2.3.4)
 
 
 
3. Însuşi sistemul ce realizează masquerading iniţiază o conexiune către
 
www.securityorg.net, portul 80, de la 1.2.3.4 (adresa interfeţei externe)
 
portul 1024
 
 
 
4. Codul NAT va modifica portul sursă al celei de-a doua conexiuni cu 1025,
 
astfel ca să nu existe conflict între cele două conexiuni.
 
 
 
Când se realizează aceasta mapare automată a sursei, porturile sunt împărţite
 
în trei clase:
 
 
 
o Porturile sub 512
 
o Porturile între 512 şi 1023
 
o Porturile de la 1024, inclusiv, în sus
 
 
 
Un port nu va fi niciodată mapat automat într-o clasă diferită.
 
 
 
 
 
 
 
===Ce se întâmplă când NAT-area nu reuşeşte===
 
 
 
Dacă nu mai este disponibil nici un mod în care să se realizeze maparea unică a
 
conexiunii cerute de către utilizator, conexiunea va fi abandonată. Acest
 
comportament se aplica şi în cazurile în care pachetele nu au putut fi
 
clasificate ca parte a unei conexiuni, deoarece sunt malformate, sau sistemul
 
nu mai are memorie libera, etc.
 
 
 
 
 
 
 
===Mapari multiple, Suprapuneri şi Conflicte===
 
 
 
Dacă ai reguli care folosesc NAT pentru mapare de porturi aflate într-o rază
 
comună, codul NAT este destul de inteligent pentru a evita conflicte. Aceasta
 
pentru că, având doua reguli, este corectă maparea adresei sursă pentru
 
192.168.1.1 şi respectiv 192.168.1.2 în adresa 1.2.3.4.
 
 
 
Mai mult, poţi face mapare peste adrese IP reale folosite, atât timp cât
 
aceste adrese trec de asemenea prin maşina care realizează maparea. Aşa că dacă
 
ai o reţea asignată (1.2.3.0/24), dar ai o reţea interna care foloseşte
 
aceasta clasa de IP-uri şi încă o reţea care foloseşte o clasă de adrese IP
 
private 192.168.1.0/24, poţi să realizezi SNAT pentru adresele cu sursă IP
 
192.168.1.0/24 peste adresele din reţeaua 1.2.3.0, fără să îţi fie teamă de
 
conflicte:
 
 
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
 
          -j SNAT --to 1.2.3.0/24
 
 
 
Aceeaşi logică se aplică adreselor folosite de însuşi sistemul ce realizează
 
NAT: în acest fel funcţionează şi masquerading-ul (prin folosirea împreună a
 
adresei interfaţei de către pachetele masqueradate şi pachetele "reale"
 
venite de la însuşi sistemul ca realizează masquerading-ul).
 
 
 
De altfel, poţi mapa aceleaşi pachete pe mai multe sisteme diferite, şi
 
acestea vor fi folosite în comun. De exemplu, dacă nu doreşti să mappezi nimic
 
peste adresa 1.2.3.5, ai putea să dai următoarea comandă:
 
 
 
# 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
 
 
 
 
 
 
 
===Schimbarea destinaţiei conexiunilor generate local===
 
 
 
Codul NAT îţi permite să introducî reguli în chainul OUTPUT având ca ţintă
 
DNAT, dar acest lucru nu este în întregime suportat în kernelurile 2.4 (poate
 
fi programat dar are nevoie de noi opţiuni, testări, şi putină programare,
 
aşa că dacă nimeni nu îl contactează pe Rusty pentru al scrie, nu o să fie
 
disponibil prea devreme).
 
 
 
Limitarea curenta este faptul că poţi să schimbi destinaţia pachetelor doar
 
către sistemul local ( "-j DNAT --to 127.0.0.1"), nu şi către alte sisteme, în
 
caz contrar replicile nu vor fi primite în mod corect înapoi.
 
 
 
 
 
 
 
=Protocoale speciale=
 
 
 
Unele protocoale nu accepta să fie NAT-uite. Pentru fiecare dintre aceste
 
protocoale, două module speciale trebuiesc scrie; unul pentru urmărirea
 
conexiunilor şi al doilea pentru operaţia de NAT-are propriu-zisă.
 
 
 
În cadrul distribuţiei netfilter, exista module pentru ftp: ip_conntrack_ftp.o
 
şi ip_nat_ftp.o. Dacă le inserezi în kernel (insmod) sau le compilezi în
 
kernel, atunci realizarea oricărui tip de NAT pentru conexiuni ftp ar trebui
 
să funcţioneze. Dacă nu, atunci poţi foloşi ftp pasiv, şi chiar şi atunci s-ar
 
putea să nu funcţioneze foarte sigur dacă vrei să realizezi altceva decât SNAT.
 
 
 
 
 
 
 
=Avertismente privind folosirea NAT=
 
 
 
Dacă realizezi NAT pentru o conexiune, pachetele venind din ambele sensuri
 
(din afara şi din înăuntrul reţelei) trebuie să treacă prin sistemul care
 
realizează NAT-area, în caz contrar lucrurile nu vor funcţiona sigur. În
 
special, codul urmării conexiunilor reasamblează fragmentele, care înseamnă
 
că nu numai depistarea conexiunilor nu va fi sigură, dar chiar şi pachetele
 
s-ar putea să nu treacă deloc, ca fragmente fiind reţinute.
 
 
 
 
 
 
 
=Folosirea SNAT şi rutarea=
 
 
 
Dacă doreşti să realizezi SNAT, vei dori să fii sigur că fiecare maşină la
 
care ajung pachete care sunt parte a unei conexiuni SNAT, vor trimite
 
pachetele replică înapoi la sistemul care realizează SNAT-ul.
 
De exemplu, dacă mapezi nişte pachete ce ies, cu adresa sursă 1.2.3.4, atunci
 
ruterul extern trebuie să ştie că trebuie să trimită pachetele replica înapoi
 
(care vor avea adresa destinaţie 1.2.3.4) către acest sistem.
 
Acest lucru poate fi realizat în următoarele moduri:
 
 
 
1. Dacă realizezi SNAT peste adresa propriului sistem (pentru care rutarea şi
 
toate celelalte merg deja), nu trebuie să faci nimic
 
 
 
2. Dacă realizezi SNAT peste o adresa nefolosita din propriul LAN (de exemplu,
 
mapezi peste 1.2.3.99, o adresă IP nefolosită din reţeaua ta  1.2.3.0/24),
 
sistemul ce realizează NAT va trebui să răspundă la cereri ARP pentru acea
 
adresă ca şi pentru propria sa adresă: cea mai simpla metodă de a rezolva
 
acest lucru este să creezi un alias pentru adresa IP, de exemplu:
 
 
 
# ip address add 1.2.3.99 dev eth0
 
 
3. Dacă realizezi SNAT peste o adresă complet diferită, va trebui să te asiguri
 
că maşinile la care vor ajunge pachetele SNAT-atate vor ruta aceasta adresă
 
înapoi către sistemul pe care se realizează SNAT-ul. Aceasta este realizata
 
deja dacă sistemul care realizează SNAT-ul este gateway-ul lor default, în caz
 
contrar va trebui să adaugi o rută pe fiecare sistem prin care trec pachetele
 
modificate.
 
 
 
 
 
 
 
=Folosirea DNAT pentru adrese aflate în aceeaşi reţea.=
 
 
 
Dacă realizezi forwardare de porturi înapoi în aceeaşi reţea, trebuie să fii
 
sigur ca atât pachetele viitoare cât şi pachetele ce vin în replică vor trece
 
prin sistemul ce realizează DNAT-ul (pentru ca acestea să fie modificate).
 
Codul NAT va bloca (înca din ver. 2.4.0-test6) pachetele ICMP de redirectare
 
care rezultă atunci când pachetele NAT-ate se îndreaptă către aceeaşi interfaţă
 
spre care au venit, dar serverul care primeşte acele pachete va încercă în
 
continuare să răspundă direct către client (care nu va recunoaşte pachetele
 
replică).
 
 
 
Cazul clasic este când un sistem din reţeaua internă încearcă să acceseze
 
serverul www "public", care este de fapt DNAT-at de la adresa publică (1.2.3.4)
 
către un sistem din reţeaua internă (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 să rulezi un server de DNS intern care să ştie adresa IP reală
 
(internă) al site-ului public de web, şi să înainteze toate celelalte cereri
 
către un server DNS extern. Aceasta înseamna ca va fi folosita o conexiune
 
directă către server-ul de web, fără să mai fie nevoie de a trece prin
 
sistemul care realizează NAT.
 
 
 
Cealaltă cale este să realizezi, pe sistemul care face DNAT, maparea adresei
 
sursă spre propria lui adresă pentru conexiunile venind din reţeaua internă,
 
păcălind serverul de web să trimită pachetele replică spre maşina care se ocupă
 
cu NAT-area. Pentru acest exemplu vom proceda astfel (presupunem ca adresa IP
 
a sistemului care realizează 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 executată prima, pachetele vor fi
 
deja destinate pentru server-ul de web intern: putem preciza care din pachete
 
sunt din reţeaua internă după adresa IP sursă.
 
 
 
 
 
 
 
=Mulţumiri=
 
 
 
Mulţumirile sunt în primul rând pentru WatchGuard, şi David Bonn, care a
 
crezut în ideea netfilter destul pentru a mă susţine să o transform în
 
realitate. Şi pentru toţi ceilalţi, care m-au suportat când făceam pe grozavul
 
când am învăţat despre urâţenia NAT-ului, în special celor ce mi-au citit
 
jurnalul.
 
 
 
Rusty.
 
[[Category:HOWTO]]
 

Versiunea de la data 14 septembrie 2011 04:12

My hat is off to your astute cmmoand over this topic-bravo!