Documente Academic
Documente Profesional
Documente Cultură
NETFILTER
NETFILTER
Important
1. Pentru a putea intelege in profunzime modul in care opereaza un firewall si a putea administra un firewall
pe Linux sunt necesare cunostinte foarte bune de TCP/IP. Aceste cunostinte trebuie sa includa: protocoalele
din stiva TCP/IP, incapsulare/decapsulare, protocoalele TCP, UDP, IP, ICMP, Ethernet, ARP - mod de
functionare si headere, notiuni de comunicatie in retea, routing, switching, NAT etc.
Fara aceste cunostinte notiunile din capitolul "NETFILTER" nu vor putea fi intelese.
3. Toate notiunile si conceptele de baza si nivel mediu din Networking sunt prezentate in mare detaliu in
cursul Cisco CCNA1 Exploration pe care-l organizam.
Resurse
Tutorial iptables complet - cel mai bun***
http://www.linuxsecurity.com/resource_files/firewalls/IPTables-Tutorial/iptables-tutorial.html
Important
Comparativ cu alte sisteme de operare precum Windows in care se pot instala o varietate de aplicatii de tip
firewall, NETFILTER reprezinta SINGURA posibilitate in Linux de realizarea a unui firewall, NAT, marcare si
modificare de pachete, in general tot ce inseamna interactiune cu pachetele.
Nota
Suportul pentru NETFILTER trebuie sa fie compilat in Kernel sau ca modul. In cazul in care kernelul nu
cuprinde NETFILTER acesta trebuie recompilat. NETFILTER este in "kernel space".
iptables este o comanda cu ajutorul careia putem comunica cu NETFILTER. iptables este in "user
space".
Resurse
NETFILTER Home Page
NETFILTER/iptables FAQ
NETFILTER Wikipedia
Nota
Un firewall hardware foloseste software pentru a realiza filtrarea. Pe langa filtrarea propriu zisa un
firewall hardware are si alte functii precum VPN, criptarea datelor etc.
Important
Filtrarea pachetelor se bazeaza pe headerele protocoalelor din stiva TCP/IP. O intelegere foarte buna a
acestor protocoale (inclusive structura headerelor) este esentiala pentru crearea/configurarea unui firewall
eficient.
In Linux singura modalitatea de a crea un firewall este reprezentata de arhitectura NETFILTER. Aceasta
arhitectura foloseste comanda iptables (user space tool) pentru a filtra pachetele de date.
NETFILTER este o tehnologie foarte avansata care permite crearea unui firewall de la zero extrem de eficient
care poate fi folosit cu incredere pe servere din mediul Enterprise.
NETFILTER inglobeaza caracteristicile tuturor celor 3 generatii amintite mai sus (aplication layer firewall cu
module speciale).
Resurse
Firewall Q&A
http://www.vicomsoft.com/knowledge/reference/firewalls1.html
1. PREROUTING
Acest chain este atins de pachete inaintea procesului de routare, imediat ce driverul placii de retea a
acceptat pachetul.
In acest chain trebuie evitata filtrarea fiindca nu toate pachetele trec prin el.
2. INPUT
Prin acest chain trec pachetele destinate calculatorului local. Orice pachet care ajunge la statia locala trece
prin acesta indiferent pe ce interfata intra sau de unde vine.
3. OUTPUT
Prin acest hook trec pachetele generate de calculatorul local.
4. FORWARD
Prin acest chain trec pachetele care tranziteaza hostul (acesta a devenit router, leaga minim 2 retele).
Pachetele care trec prin chain-ul FORWARD nu sunt destinate hostului local si nici nu sunt generate de
acesta.
5. POSTROUTING
Ultimul chain prin care trec pachetele, dupa procesul de rutare.
Prin acest chain trec atat pachetele care transiteaza hostul daca acesta este Router cat si cele generate de
host.
Fiecare din aceste 5 hook-uri/chain-uri (puncte de interactiune cu pachetele) se foloseste pentru a interveni
intr-un anume mod asupra pachetelor.
Exista 3 destinatii posibile pentru un pachet functie de care acesta trece prin anumite chain-uri din cele 5:
a) vine din retea si este destinat hostului local;
b) este generat de hostul local;
c) trece prin hostul local;
Nota
Iptables ofera posibilitatea definirii de chainuri de catre utilizatori pe langa cele 5 chainuri default. Acest
subiect este considerat avansat si va fi tratat in amanunt in cursul "Advanced Linux & INFOSEC"
disponibil de asemenea online.
Exemplu
Cerinta: Dorim sa blocam/dropam toate pachetele care vin catre serverul SSH ce ruleaza pe hostul
local si asculta pe portul TCP/22.
Mod realizare: Orice pachet destinat hostului local va trece prin chain-ul INPUT. Acesta va fi si chain-ul
in care intervenim pentru droparea/blocarea pachetelor ssh. Intr-un tabel (numit filter) atasat chainului
INPUT vom adauga o regula compusa din criterii precum: pachetul este destinat hostului local, iar
portul destinatie este 22. Target-ul va fi DROP.
In mod implicit NETFILTER ofera 4 tabele ce contin reguli pentru "prinderea" pachetelor si care se ataseaza
de cele 5 chain-uri.
Tabele NETFILTER:
1. filter
Este folosit doar pentru filtrarea pachetelor ( ACCEPT sau DROP) si se foloseste doar pe chainurile
FORWARD, INPUT sau OUTPUT.
2. nat
Este folosit doar pentru NAT (SNAT si DNAT). Doar primul pachet dintr-un stream va fi procesat de regulile
din acest tabel. Asupra celorlalte pachete se va actiona identic. Se poate atasa de chainurile PREROUTING in
cazul SNAT si POSTROUTING in cazul DNAT.
3. mangle
Este folosit pentru manipularea/modificarea pachetelor si anume modificarea headerelor de Layer3 si Layer4
(modificare tos, ttl etc).
Acest tabel poate fi atasat de orice chain.
4. row
Se foloseste doar pentru marcarea pachetelor care nu trebuie sa fie procesate de "connection tracking
system". Tabelul se poate folosi doar pentru chainurile PREROUTING si/sau OUTPUT. Mecanismul de
"connection tracking" este consumator de resurse, astfel pentru un anumit tip de trafic se poate opri
connection tracking system.
Exemplu: excluderea traficul generat pentru localhost
Nota
Cele 4 tabele descrise mai sus sunt implicite. Acestea nu pot fi sterse si nici alte tabele nu pot fi create.
Connection tracking este realizat de un framework din kernel care se numeste conntrack. Acesta poate fi
incarcat ca modul sau poate fi parte integranta a kernelului.
conntrack reprezinta o parte din NETFILTER care identifica pachetele ca aflandu-se intr-o anume stare in
functie de relatia cu celelalte pachete din acelasi stream.
1. NEW
Primul pachet dintr-o conexiune generat de hostul local se gaseste in starea NEW.
2. ESTABLISHED
Pachetul destinat hostului local ca raspuns la pachetul trimis anterior isi schimba starea in ESTABLISHED in
momentul in care intra in PREROUTING. Sunt toate pachetele dintr-o conexiune mai putin primul care a
initiat conexiunea si care se afla in starea NEW.
3. RELATED
In starea RELATED se gasesc acele pachete legate de un alt flux de date
Exemplu: in cazul FTP activ, conexiunea de date de pe portul 20 ca raspuns la conexiunea de control initiata
catre portul 21
4. INVALID
Sunt acele pachete ale caror header contine informatii neconcordante.
Exemplu: un pachet al carui header TCP contine atat flag-ul syn cat si fin
Informatiile pe care modulul conntrack le foloseste pentru a sti in ce stare se gaseste un pachet, pot fi
vizualizate in /proc/net/nf_conntrack (FC9)
Detalii:
tcp - protocolul de transport;
6 - valoarea campului protocolului din headerul IP;
117 - nr. de secunde in care aceasta intrare este valida. Timpul este decrementat continuu pana cand apare
trafic legat de aceasta conexiune. Apoi timpul este resetat cu valoarea default;
SYN_SENT - trafic doar intr-o directie;
src - ip source;
dst - ip destinatie;
sport - port sursa;
dport - port destinatie;
UNREPLIED - nu a existat trafic in ambele directii. In momentul in care apare trafic in ambele directii
UNREPLIED se inlocuieste cu ASSURED;
ASSURED (la final) - informatii despre aceasta conexiune nu vor fi sterse cand se atinge nr. maxim de
conexiuni;
Nota
Fisierele referitoare la NETFILTER apar doar dupa ce se foloseste conntrack machine adica dupa ce se
incarca in memorie firewall-ul ce contine regule cu referire la starile unui pachet.
Resurse
Connection tracking
Important
1. Scopul comenzii iptables este de a adauga, sterge, inlocui, lista, vizualiza etc reguli din cele 4 tabele
standard care sunt atasate de cele 5 chainuri.
2. In mod default nu exista nicio regula in tabele, acestea fiind goale. Implicit nu exista firewall.
3. Un pachet traverseaza in mod secvential regulile din tabelele atasate chainurilor pana in momentul in care
o regula "prinde" pachetul, caz in care se executa TARGET-ul regulii. Restul regulilor din tabel nu se mai
verifica ulterior.
4. Daca pachetul nu este prins de nicio regula din tabel se executa politica default (-P POLICY) care este
implicit ACCEPT.
unde:
Nume tabel:
filter
nat
raw
mangle
Nota
Numele tabelului in care se adauga regula trebuie scris cu litera mica. Daca se omite numele tabelului
acesta este default filter.
Exemplu
Nota
Operatiile asupra regulilor din tabelele atasate chainurilor trebuie scrise cu litera mare.
Exemplu:
Adauga o regula la sfarsitul tabelului filter (default daca nu se specifica) pentru chain-ul OUTPUT care
permite trimiterea de pachete catre IP-ul din spatele domeniului www.invata-online.ro
1. iptables -A OUTPUT -d www.invata-online.ro -j ACCEPT
Adauga policy DROP pentru INPUT. Orice pachet destinat hostului local care nu este acceptat de nicio
regula din tabelul filter de pe chainul INPUT este dropat
2. iptables -P INPUT DROP
Sterge toate regulile din tabelul filter (default daca nu se specifica) de pe chainul FORWARDING
3. iptables -F FORWARDING
Nume Chain:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
Nota
Numele chainului se scrie cu litera mare
Exemplu:
1. Adaugam o regula in tabelul nat din POSTROUTING care realizeaza SNAT. IP-ul privat 10.0.0.3 este
inlocuit cu ip-ul public al ruterului linux care este 80.0.0.10
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.3 -j SNAT --to-source 80.0.0.10
2. Dropeaza toate pachetele generate de hostul local catre orice server http care daca acesta asculta pe
portul 80 iptables -A OUTPUT -p tcp --dport 80 -j DROP
Criterii
-s IP_sursa
Exemplu: -s 80.0.0.1 sau -s 192.168.0.0/24 sau -s 0/0. Specifica IP-ul sursa din pachet. 0/0 inseamna orice
IP
-d IP_dest
Exemplu: -d 182.0.10.1 sau -d 10.10.0.0/26 sau -d 0/0 -> specifica IP-ul destinatie din pachet. 0/0
inseamna orice IP
-p protocol
Exemplu: -p tcp sau -p udp sau -p icmp
--sport port_sursa
Exemplu: iptables -I INPUT -p udp --sport 53 -j DROP -> dropeaza toatea pachetele UDP care sunt
destinante hostului local si vin de la un server DNS (port 53)
--dport port_dest
Exemplu: iptables -A FORWARD -p tcp --dport 8080 -j DROP -> dropeaza toata pachetele catre portul tcp
8080 care tranziteaza ruterul linux
-i interfata_in
Exemplu: iptables -A INPUT -i eth0 -j ACCEPT -> accepta toate pachetele destinate hostului local care intra
pe interfata eth0
-o interfata_out
Exemplu: iptables -t mangle -A OUTPUT -o eth1 -j TTL --ttl-set 67 -> modifica TTL-ul din headerul IP setand
valoarea 67 pentru toate pachetele generate de hostul local care ies pe interfata eth1
Nota
Intre criterii unei reguli exista SI logic. Acestea trebuie sa fie adevarate simultan pentru ca pachetul sa
fie "prins" de regula si sa se executa TARGET-ul regulii.
Target
Specifica actiunea intreprinsa asupra pachetului daca criteriile sunt indeplinite.
Nota
Numele targetului se scrie cu litera mare.
Important
Cuvintele cheie de mai sus trebuie scrise cu litera mare sau litera mica intocmai, altfel rezulta o eroare.
Rezumat:
numele tabelului se scrie cu litera mica (-t nat);
operatia asupra chain-ului se scrie cu litera mare (-A);
Resurse
iptables syntax
Scriptul odata rulat genereaza in spate comenzi iptables. Modalitatea este recomandata pentru adminii
incepatari care nu doresc un control total al modului in care firewall-ul opereaza.
Important
Comenzile iptables se pot executa direct in consola. Pentru o buna organizare metoda cea mai folosita este
urmatoarea: se creaza im script care contine comenzile iptables si care se executa.
Nota
La primul contact cu NETFILTER si iptables, acestea pot parea extrem de complexe cu multe optiuni
greu de retinut. Dupa cateva exercitii sintaxa iptables si modul de organizare se va clarifica si va deveni
natural (presupunand o buna cunoastere a stivei TCP/IP).
Nota
Regulile unui firewall se scriu intr-un fisier text, caruia i se seteaza ulterior dreptul de executie si se
ruleaza pentru a fi incarcat in memorie (exceptie acolo unde este precizat ca rularea comenzii iptables
are loc direct din consola).
Nota
Prima regula dintr-un firewall este aceea care sterge orice firewall existent ( iptables -F). Altfel rulari
succesive ale scriptului determina incarcarea aceleiasi reguli de mai multe ori.
Scenariul 1
Se doreste obtinerea de help pentru comanda iptables pentru diferite optiuni ale acesteia.
Nota
In general se completeaza comanda iptables pana la momentul la care dorim obtinerea helpului apoi se
foloseste optiunea -h. Comanda se executa direct in consola
a) ICMP help, specificarea tipurilor ICMP
iptables -p icmp -h
Output generat:
ICMP v1.4.0 options: --icmp-type [!] typename match icmp type (or numeric type or type/code) Valid ICMP
Types: any echo-reply (pong) destination-unreachable network-unreachable host-unreachable protocol-
unreachable port-unreachable fragmentation-needed source-route-failed network-unknown host-unknown
network-prohibited host-prohibited TOS-network-unreachable TOS-host-unreachable communication-
prohibited host-precedence-violation precedence-cutoff source-quench redirect network-redirect host-
redirect TOS-network-redirect TOS-host-redirect echo-request (ping) router-advertisement router-
solicitation time-exceeded (ttl-exceeded) ttl-zero-during-transit ttl-zero-during-reassembly parameter-
problem ip-header-bad required-option-missing timestamp-request timestamp-reply address-mask-request
address-mask-reply
b) Obtinerea de informatii despre filtrarea dupa MAC (doar in LAN). Se foloseste optiunea -m mac. Se poate
filtra doar dupa mac sursa si doar pe INPUT.
iptables -m mac -h
Output generat:
MAC v1.4.0 options: --mac-source [!] XX:XX:XX:XX:XX:XX Match source MAC address
c) Obtinerea de informatii despre optiunile referitoare la TCP (specificarea porturilor sursa si destinatie dupa
care se filtreaza, filtrarea dupa flaguri etc)
iptables -p tcp -h
Output generat:
TCP v1.4.0 options: --tcp-flags [!] mask comp match when TCP flags & mask == comp (Flags: SYN ACK FIN
RST URG PSH ALL NONE) [!] --syn match when only SYN flag set (equivalent to --tcp-flags
SYN,RST,ACK,FIN SYN) --source-port [!] port[:port] --sport ... match source port(s) --destination-port [!]
port[:port] --dport ... match destination port(s) --tcp-option [!] number match if TCP option set
Scenariul 2
Se doreste crearea unui firewall stateful pentru sistem Linux folosit ca Desktop. Pe acesta nu ruleaza
servere, iar utilizatorul poate comunica cu orice serviciu extern.
Cerinte:
hostul poate genera orice fel de trafic TCP, UDP sau ICMP catre orice IP extern;
pachetele destinate hostului sunt acceptate doar daca reprezinta raspuns la traficul generat din
interior;
pachetele care reprezinta initializarea unei conexiuni din exterior catre interior sunt filtrate;
#!/bin/bash #stergerea tuturor regulitor din tabelul filter din toate CHAIN-urile iptables -F #permitea tuturor
pachetelor generate de host (starea NEW,ESTABLISHED si RELATED) iptables -A OUTPUT -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT #permitea pachetelor care se intorc catre host si nu reprezinta
initializarea unei conexiuni(starea ESTABLISHED si RELATED) iptables -A INPUT -m state --state
ESTABLISHED,RELATED -j ACCEPT #setare policy DROP pe INPUT si OUTPUT. Pachetele care nu sunt prinse
de cele 2 reguli de mai sus sunt dropate iptables -P INPUT DROP iptables -P OUTPUT DROP
Scenariul 3
Dorim crearea unui firewall statefull pentru Desktop pe care ruleaza si un server SSH care asculta pe portul
TCP/22.
Cerinte:
hostul poate genera orice fel de trafic TCP, UDP sau ICMP catre orice IP extern
pachetele destinate hostului sunt acceptate doar daca reprezinta raspuns la traficul generat din
interior
userul se conectaza uneori la host prin SSH de la un anumit IP (Exemplu: IP-ul 80.0.0.1 setat in
locatia de unde se conecteaza userul)
pachetele care reprezinta initializarea unei conexiuni din exterior (exceptand SSH de la IP-ul de mai
sus) catre interior sunt filtrate
#!/bin/bash #stergerea tuturor regulitor din tabelul filter din toate CHAIN-urile iptables -F #permiterea
pachetelor SSH din exterior catre interior de la IP 80.0.0.1 iptables -A INPUT -p tcp --dport 22 -s 80.0.0.1 -j
ACCEPT #permitea pachetelor generate de host (starea NEW,ESTABLISHED si RELATED) iptables -A OUTPUT
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #permitea pachetelor care se intorc catre host
(starea ESTABLISHED si RELATED) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#setare policy DROP pe INPUT si OUTPUT. Pachetele care nu sunt prinse de cele 2 reguli de mai sus sunt
dropate iptables -P INPUT DROP iptables -P OUTPUT DROP
Scenariul 4
Se doreste oprirea oricarui firewall care ruleaza pe host cu stergerea oricarei configuratii de SNAT sau DNAT
sau de modificare de pachete.
#!/bin/bash #stergerea tuturor regulilor din tabelul filter de pe toate chainurile iptables -t filter -F
#stergerea tuturor regulilor din tabelul nat de pe toate chainurile iptables -t nat -F #stergerea tuturor
regulilor din tabelul mangle de pe toate chainurile iptables -t mangle -F #setarea policy ACCEPT pe toate
chainurile unde se poate realiza filtrare (INPUT,OUTPUT si FORWARD) iptables -P INPUT ACCEPT iptables -P
OUTPUT ACCEPT iptables -P FORWARD ACCEPT
Scenariul 5
#!/bin/bash iptables -F #frame-urile cu mac-ul sursa specificat sunt permite pe INPUT iptables -A INPUT -i
eth0 -m mac --mac-source 00:1A:92:96:18:58 -j ACCEPT #policy pe INPUT este DROP (restul frame-urilor
sunt filtrate) iptables -P INPUT DROP #pe ouput se poate lasa policy ACCEPT iptables -P OUTPUT ACCEPT
Scenariul 6
Listarea unui firewall sau verificare firewall care ruleaza. Comanda se executa direct in consola.
iptables -vnL
Comanda de mai sus listeaza toate regulile din tabelul filter (este default) de pe toate chainurile
Daca se doreste listarea regulilor din tabelul nat sau mangle se foloseste:
iptables -t nat -vnL
Scenariul 7
Un host Linux a fost transformat in Router pentru conectarea unui LAN la Internet. Acesta este configurat cu
2 placi Ethernet si realizeaza NAT. Se doreste modificarea TTL-ului inainte procesului de rutare
Cerinte:
un ISP pentru nu permite unui client sa creeze o retea locala si deci pentru a impune conectarea
unui singur calcular la Internet ar putea trimite toate pachetele catre client cu TTL=1. In momentul
in care se conecteaza un Ruter, acesta va decrementa TTL-ul pachetelor IP si fiindca acesta ajunge
la zero, ruterul va arunca pachetele
se doreste setarea TTL pentru toate pachetele primite de router la 64 (valoarea default pe Linux)
inaintea procesului de rutare
#!/bin/bash #orice retula pentru manipularea pachetului se adauga in tabelul mangle. Fiind se doreste
modificarea TTL inaintea procesului de rutare se #foloseste chainul PREROUTING. Se mai poate folosi si
OUTPUT pentru modificarea ttl-ului pentru pachetele trimise inaintea procesului de #rutarea sau
POSTROUTING pentru modificare dupa procesul de rutare iptables -t mangle -A PREROUTING -i eth0 -j TTL
--ttl-set 64
Scenariul 8
Logarea de pachete
Cerinta:
se doreste logarea tuturor pachetele de tip HTTP care sunt generate de host in vederea analizarii
ulterioare a site-urilor vizitate sau pentru analiza continutului headerelor acestora
#!/bin/bash #se foloseste targetul LOG #--log-level specifica facilitatea syslog folosita #--log-prefix
specifica un string care se va gasi in fata fiecarui pachet logat pentru o identificare mai usoara iptables -A
OUTPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix "HTTP generat de host"
Nota
Pentru vizualizarea pachetelor poate fi rulata comanda dmesg fiindca se foloseste facilitatea kernel din
syslog. Intr-un setup profesional acestea informatii trebuie redirectate catre un fisier special. Pentru
aceasta este nevoie de configurarea syslog. Pentru detalii cititi capitolul "Managementul Logurilor" a
acestui curs.
Iptables help
Blocarea conexiunilor catre host cu exceptia SSH. Traficul outbound si raspusul la acesta este permis.
serverul poate accesa pe internet doar servere web (pentru update) si dns (pentru query iterative
sau pentru a folosi un forwarder)
#ciclu for pentru permiterea pachetelor ce au voie sa tranziteze router for port in do #permiterea pachtelor
in directia LAN->WAN iptables -A FORWARD -s 192.168.0.0/24 -p tcp --dport -j ACCEPT #permiterea
pachetelor in directia WAN->LAN iptables -A FORWARD -d 192.168.0.0/24 -p tcp --sport -j ACCEPT done
#permiterea pachetelor DNS din LAN catre WAN (altfel userii nu pot accesa site-uri folosind nume de
domenii) iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT iptables -A FORWARD -d
192.168.0.0/24 -p udp --sport 53 -j ACCEPT #blocarea pachetelor ICMP de timp echo-request (type 8) daca
sursa este diferita de 192.168.0.0/24 iptables -A INPUT ! -s 192.168.0.0/24 -p icmp --icmp-type 8 -j DROP
#setare policy DROP pentru pachetele care nu au fost permise de regulile de mai sus iptables -P FORWARD
DROP
Nota
In ultima vreme datorita cresterii vitezei oferite de ADSL, acest timp de tehnologie de WAN incepe sa
fie folosita si pentru companii. ADSL+ ofera un Bandwidth Downstream de peste 22Mbs.
Indiferent de tehnologia de WAN folosita ISP-ul furnizeaza un singur IP public sau in cel mai bun caz cateva
IP-uri publice.
Solutia folosita pentru a lega mai multe calculatoare la Internet (neavand atatea IP-uri publice cate
calculatoare) este configurea unui Router care sa realizeze NAT (Network Address Translation).
Se foloseste asfel un router dedicat sau un calculator care ruleaza Linux cu cel putin 2 placi de retea
Ethernet (leaga 2 retele si anume LAN-ul si Internetul). O interfata si anume cea care se conecteaza cu
providerul se configureaza cu IP-ul public, iar cealalata interfata numita interfata de LAN se configureaza cu
un IP privat.
Nota
IETF a definit in RFC 1918 3 clase de IP-uri private care pot fi folosite in mod liber pentru adresarea
unui LAN.
Acestea sunt:
10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255
Procesul prin care hosturile din LAN (din spatele routerului) pot comunica pe Internet si anume procesul de
NAT presupune inlocuirea IP-ului privat de catre router din pachetele generate de hosturile din LAN cu unicul
IP public si trimiterea acestora pe Internet.
Efectul este ca pe Internet intreg LAN-ul este ascuns si nu se poate determina ce host din LAN a generat
pachetul sau ca exista LAN-ul. Pachetele par sa vina de la Router.
Avantaje NAT:
Economia de IP-uri publice. Cu un singur IP public putem crea o retea localta conectata la Internet
formata din zeci sau sute de hosturi;
Securitate. Lan-ul este izolat, nu se pot initializa conexiuni din exterior catre un host din interior
fara configuratii speciale ale routerului (port forwarding);
Un host Linux poate fi transformat intr-un router nededicat. Componenta software care realizeaza NAT este
NETFILTER (unica posibilitatea).
Nota
Procesul de NAT descris mai sus este referit de multe ori ca SNAT (source NAT) pentru faptul ca se
modifica IP-ul sursa privat cu IP-ul public. Aceasta referire nu este in totalitate corecta fiindca SNAT
este insotit intotdeauna de DNAT (destination NAT) si anume la intoarcerea pachetului de pe Internet
se inlocuieste IP-ul destinatie public cu IP-ul destinatie privat, iar pachetul este trimis la hostul din LAN
de catre Router
default hostul Linux nu ruteaza. Pentru a fi transformat intr-un router trebuie ca in fisierul
/proc/sys/net/ipv4/ip_forward sa se gaseasca valoarea 1 (unu);
Procesul prin care Routerul se configureaza astfel incat sa ofere posibilitatea conectarii de pe Internet la un
host din LAN cu IP privat se numeste DNAT (Destination Network Address Translation) sau Port Forwarding.
Exemplu topologie: Routerul are configurat un IP public pe interfata de WAN ( Exemplu: 88.0.0.1) si un IP
privat pe interfata de LAN ( Exemplu: 10.0.0.1). In LAN exista un server web care asculta pe portul 80 si
care are configurat IP-ul 10.0.0.10. Utilizatorii de pe Internet care doresc conectarea la serverul web privat
nu-l pot accesa fara ca routerul sa fie configurat pentru DNAT.
Pentru userii de pe Internet reteaua 10.0.0.0/24 si implicit 10.0.0.10 sunt ascunse (nu exista).
Modul de functionare DNAT este urmatorul: userul de pe Internet se conecteaza la IP-ul public al routerului
si anume 88.0.0.1 si portul 80. Routerul in momentul in care primeste pachete catre portul 80 le
redirecteaza catre serverul din LAN 10.0.0.10 modificand IP-ul destinatie din fiecare pachet (88.0.0.1 se
transforma in 10.0.0.10) - de unde si numele de DNAT. Pachetele ajung astfel la serverul web intern care
raspunde catre IP-ul sursa public (acesta nu se modifica).
Nota
Din perspectiva clientilor de pe Internet acestia se conecteaza la serverul web care ruleaza pe router si
nu la serverul web din spatele routerului.
Important
Pentru ca DNAT sa functioneza Routerul linux trebuie sa fie configurat si pentru SNAT. Altfel pachetele ca
raspuns ale serverului web din LAN care au ip sursa privat nu ar putea fi trimise catre IP-ul public destinatie
care este pe Internet.
Resurse
Port Forwarding - Wikipedia