Meniu

Ce este un firewall? Firewall/NAT cu Linux

Exista multe confuzii si mituri despre firewalluri. Unii cred ca firewallul este un instrument magic pe care daca il pun, nu mai intra hackerii, virusii, etc. rupe tot...

Un firewall “normal”, numit si “packet filtering firewall” este un filtru pentru layer 3 si 4 OSI, si anume IP, TCP, UDP, etc. De exemplu, un firewall ar putea fi folosit pentru a bloca toate pachetele IP din internet catre portul 80 al unui server web. Desigur, utilizatorii nu vor mai putea sa vada site-ul de pe acel server, dar el va fi 100% securizat!
Acesta e un exemplu foarte simplu care ilustreaza clar scopul unui firewall: sa controleze cine, pe ce port, si la cine se poate conecta.

Exista si alte tipuri de firewalluri, asa numitele “proxy firewall” sau “application layer firewall” sau “layer 7 firewall” (termenii sunt sinonimi). Acest tip de firewalluri lucreaza la layer 7 OSI, numit si layerul aplicatie. Un astfel de firewall ar putea de exemplu sa preia el cererea unei pagini web destinata serverului, analizeaza cererea, vede daca cererea incearca sa se foloseasca de o gaura de securitate din server, si dupa caz, o blocheaza sau o dau mai departe serverului.

Ce este iptables?

Iptables este instrumentul care controleaza netfilter , firewallul din kernelul linux. Iptables este un firewall foarte puternic. Pe lânga filtrarea simpla dupa sursa/destinatia pachetului IP sau portul, el poate face si NAT , redirectionarea porturilor, modificarea headerului TCP/IP (mangle), sau chiar filtrare layer 7 folosind l7filter sau ipp2p .

Structura iptables

Sintaxa iptables este destul de incalcita si necesita cunoasterea principiului de functionare al lui iptables.
Pachetele trec printr-o serie de tabele de procesare iar fiecare tabel corespunde unui chain de filtrare sau transformare. Pana aici totul e clar.

Exista 3 tabele, numele acestora se scriu cu litere mici iar pentru chainuri se folosesc majuscule:

filter - tabelul cel mai folosit si cel implicit, cu el putem filtra pachetele IP dupa sursa/destinatie, numar port, etc...

Tabelul filter are 3 chainuri de filtrare:

INPUT - pachetele destinate firewallului
OUTPUT - pachetele care ies din firewall
FORWARD - pachete care sunt destinate unei masini accesibile printr-o alta placa de retea a firewallului, cum ar fi o masina din reteaua locala

nat - aici se face ... NAT, pentru partajarea unei conexiuni la internet sau alte chestii mai complicate.
Tabelul nat are 3 chainuri de transformare:

PREROUTING - adresele se translateaza inainte de routare, aici se face DNAT, schimbarea destinatiei pachetului IP
POSTROUTING - adresele se translateaza dupa routare, aici se face SNAT, schimbarea sursei pachetului IP
OUTPUT - folosit la chestii mai avansate

mangle - aici se pot modifica optiuni din headerul TCP/IP sau se pot marca pachetele pentru QoS sau alte scopuri.

Tabelul mangle are 5 chainuri:

PREROUTING - aici intra pachetele inainte sa fie routate
POSTROUTING - aici intra pachetele dupa ce au fost routate
INPUT - pachete care sunt destinate firewallului
OUTPUT - pachete care ies din firewall
FORWARD - pachete care sunt destinate unei masini accesibile printr-o alta placa de retea a firewallului, cum ar fi o masina din reteaua locala


Mai concret, priviti diagrama fluxului de pachete prin netfilter:

Sintaxa iptables

Pentru a putea configura iptables trebuie sa fiti administrator (root). Folositi su sau sudo pentru aceasta.

In mare, sintaxa unei comenzi iptables este:

iptables [-t tabel] [chain] [selectare pachet] [actiune]

‘-t’ selecteaza unul din cele 3 tabele

In categoria chain avem urmatoarele optiuni:

-N: (new)un nou chain este creat -X: un chain fãrã reguli este sters -P: (policy) trecere de la default drop la default accept si invers -F: (flush) sterge toate regulile in chain respectiv -Z: (zero) reseteazã contoarele pentru toate regulile din chain -A: (add) adaugã o nouã regulã in chain -I: (insert) insereazã o nouã regulã in chain -R: (replace) schimbã o regulã existentã in chain -D: (delete) sterge o regulã existentã


In categoria care selecteaza pachetele avem:

-s, -d: adresã sursã/destinatie IP -p: protocol (tcp, udp, icmp) -i: interfatã (lo, eth0, eth1, ppp0, etc.) -f: fragmentare


Dacã ‘-p tcp’ este specificat:

--sport, --dport: porturi sursã/destinaþie --tcp-flags: flaguri tcp --syn: echivalent cu '--tcp_flags SYN,RST,ACK SYN' --tcp-option

Dacã ‘-p udp’ este specificat:

--sport, --dport: porturi sursã/destinaþie

Dacã ‘-p icmp’ este specificat:

--icmp-type: rulati "iptables -p icmp --help" pentru o lista completa

Mai multe extensii pot fi incarcate ca module folosind optiunea -m:

Dacã '-m mac' este specificat: --mac_source: adresã sursã mac Dacã '-m limit' este specificat: --limit: limiteazã numãrul de pachete acceptate pe secundã/minut/orã/ziuã --limit-burst Dacã '-m owner' este specificat, pentru pachete generate local: --uid-owner --gid-owner --pid-owner --sid-owner Dacã '-m state' este specificat: --state: starea conexiunii (NEW, ESTABLISHED, RELATED, INVALID)


In categoria actiune avem:

-j: DROP, ACCEPT, LOG
Pentru mai multe detalii, vedeti man iptables.


Si acum un exemplu practic:

iptables -A INPUT -p tcp --dport 139 -j DROP

Sa analizam pas cu pas fiecare optiune:
‘-A INPUT’ - adauga in chainul INPUT din tabelul filter, dupa cum spuneam mai inainte, tabelul filter este cel implicit, deci comanda de mai sus este echivalenta cu:

iptables -t filter -A INPUT -p tcp --dport 139 -j DROP

‘-p tcp –dport 139’ - selecteaza pachetele, si anume, toate pachetele folosind protocolul TCP, care au port destinatie 139, foarte simplu. Iar dupa ce le-am selectat, ce facem cu ele?

‘-j DROP’ - actiunea, arunca pachetele

Strategii de filtrare a porturilor

Exista doua strategii de filtrare: exclusive si inclusive.

Avem un server de web, mail si samba. Deci avem porturile TCP 80, 443 (http, https), 25, 995 (smtp, pop3s) si TCP/UDP 137, 138, 139 (samba) deschise. Noi vrem sa lasam http, smtp si pop accesibile din internet, dar sa blocam conexiunile din internet la samba din motive de securitate (cei din internet nu au ce cauta la samba, asta poate doar sa expuna inutil serverul la un pericol de securitate).

Daca am avea un firewall exclusive, am proceda astfel:

iptables -A INPUT -p tcp --dport 137 -j DROP iptables -A INPUT -p tcp --dport 138 -j DROP iptables -A INPUT -p tcp --dport 139 -j DROP iptables -A INPUT -p udp --dport 137 -j DROP iptables -A INPUT -p udp --dport 138 -j DROP iptables -A INPUT -p udp --dport 139 -j DROP

Blocam toate pachetele pe porturile samba, si lasam restul. De ce este asta gresit? Pentru ca noi vom baga si nfs saptamana viitoare, si vom uita sa ajustam firewall-ul...

Un firewall inclusive ar fi astfel:

iptables -P INPUT DROP iptables -A INPUT -p tcp 80 -j ACCEPT iptables -A INPUT -p tcp 443 -j ACCEPT iptables -A INPUT -p tcp 25 -j ACCEPT iptables -A INPUT -p tcp 995 -j ACCEPT

‘iptables -P INPUT DROP’ - seteaza firewall-ul sa blocheze toate porturile TCP si UDP Noi vom permite DOAR serviciile la care internetul trebuie neaparat sa aiba acces. Daca instalam mai tarziu un server ftp, va trebui sa modificam regulile firewall-ului sa permitem accesul internetului la el.

Evident, un firewall inclusive este mult mai secure, si usor de intretinut.

Exemplu de firewall stateful simplu cu NAT

Acesta este un exemplu de firewall stateful simplu cu NAT, care poate fi adaptat atat pentru un server, cat si pentru desktop.

Un firewall stateful va crea un “state” pentru fiecare conexiune TCP sau stream de date UDP, adica va stoca informatii gen ip sursa, destinatie, port, etc., pentru fiecare conexiune. Firewall-ul stateful cand primeste un pachet IP nou, nu va sta sa verifice toate regulile (care pot fi foarte multe), ci verifica intai daca pachetul face parte dintr-o conexiune deja stabilita si daca e, il trece automat, iar daca nu face parte din nici o conexiune, verifica regulile pe rand si stabilieste ce o sa faca cu el (DROP, ACCEPT, etc.). Astfel procesorul firewall-ului va fi mai putin incarcat, cel mai intensiv va lucra atunci cand se creaza conexiunea. Totusi, firewall-urile acestea sunt mai vulnerabile la atacuri Syn flood, unde atacatorul creaza multe conexiuni, iar firewall-ul va face prea multe state-uri.

Cu NAT se partajeaza o conexiune internet la mai multe calculatoare. Fiecare calculator din reteaua locala va avea un ip de genul 192.168.x.x si va “iesi” in internet cu ip-ul routerului.

Ca sa pornim firewall-ul la fiecare bootare a sistemului si pentru a-l putea dezactiva usor cand este nevoie, trebuie sa punem toate regulile intr-un script de initializare. Aici voi descrie procedura pentru un sistem de init sys v, folosit de majoritatea distributiilor: red hat, debian, ubuntu, gentoo, suse, mandriva si multe altele. Daca aveti alt sistem de init, consultati documentatia distributiei dumneavoastra.


Aveti grija sa dezactivati firewall-ul care vine cu distributia, de exemplu la suse din yast, sau la red hat din system-config-securitylevel

Daca vreti NAT, sau firewall-ul are si functie de router, trebuie sa activati ip_forward. Majoritatea distributiilor au utilitarul “sysctl”, deci puteti sa editati fisierul /etc/sysctl.conf si sa adaugati randul:

net/ipv4/ip_forward = 1

Ca masuri aditionale de securitate, adaugati in sysctl.conf:

net/ipv4/conf/all/rp_filter = 1 net/ipv4/tcp_syncookies = 1 net/ipv4/icmp_echo_ignore_broadcasts = 1 net/ipv4/tcp_ecn = 0

Daca nu aveti sysctl, adaugati urmatoarele comenzi in scriptul firewall-ului sau in scriptul de initializare local (/etc/rc.local de obicei):

echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 0 > /proc/sys/net/ipv4/tcp_ecn


Acum deschideti editorul text preferat, creati fisierul /etc/init.d/firewall si scrieti:

INTERNET="eth0" SERVICII="http ssh smtp 995" # servicii (porturi) care pot fi accesate din internet if [ "$1" = "start" ];

then echo "Porneste firewallu" iptables -P INPUT DROP

# blocheaza tot iptables -A INPUT -i ! ${INTERNET} -j ACCEPT

# permite pachetelor de pe toate interfetele in afara de interfata cu internetul ( reteaua locala, loopback ) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # permite pachetele din conexiuni deja stabilite # accepta conexiuni noi pe porturile din $SERVICII for i in ${SERVICII}; do iptables -A INPUT -p tcp --dport ${i} -m state --state NEW -j ACCEPT done # NAT, daca nu aveti nevoie, stergeti linia iptables -t nat -A POSTROUTING -o ${INTERNET} -j MASQUERADE fi # end if start if [ "$1" = "stop" ]; then echo "Se opreste firewallu" iptables -F INPUT iptables -P INPUT ACCEPT # opreste NAT, daca nu aveti nevoie, stergeti linia iptables -t nat -F POSTROUTING fi # end if stop


Dupa ce il salvati, trebuie sa-l faceti sa porneasca la boot. Mai intai il facem executabil:

chmod 744 /etc/init.d/firewall

Acum scriptul este executabil, dar sistemul de init nu e setat sa-l ruleze la boot. Distributiile Red Hat si derivatele (Fedora, Mandriva, ...) precum si SUSE, folosesc utilitarul chkconfig pentru asta:

chkconfig firewall on


Pentru Debian si derivate (Ubuntu, Knoppix, Kanotix, Mepis, ...), se utilizeaza update-rc.d:

update-rc.d firewall defaults

Apoi, ca sa porniti sau sa opriti acest script:

/etc/init.d/firewall start

sau

/etc/init.d/firewall stop


Pentru Slackware si derivatele sale va trebui sa redenumiti scriptul (rc.firewall) si sa-l mutati in /etc/rc.d/ . Apoi, ca sa porniti sau sa opriti acest script:

/etc/rc.d/rc.firewall start

sau

/etc/rc.d/rc.firewall stop


Pentru Gentoo si derivatele sale (Sabayon, Pentoo etc) serverul va fi pornit din /etc/init.d cu comanda:

/etc/init.d/iptables start

sau

/etc/init.d/iptables stop

Iar pentru a initializa serviciul iptables la start-up-ul sistemului vom utiliza:

rc-config add iptables default

Firewall cu DMZ

Un DMZ este o portiune de retea unde se tin serverele la care internetul trebuie sa aiba acces. Ideea e ca serverele din DMZ sa nu aiba acces la reteaua locala, dar internetul si reteaua locala sa aiba acces la serverele din DMZ. Astfel, daca un server din DMZ este compromis, atacatorul nu va putea fura date din reteaua locala, deci securitate mult imbunatatita.

John Doe

Articole publicate de la contributori ce nu detin un cont pe gnulinux.ro. Continutul este verificat sumar, iar raspunderea apartine contributorilor.
  • | 340 articole

Nici un comentariu inca. Fii primul!
  • powered by Verysign