Firewall Linux - Netfilter iptables

NETFILTER repezinta un framework din Kernelul de Linux responsabil cu filtrarea pachetelor, marcarea acestora in vederea prioritizarii traficului, modificarea structurii headerelor de layer3 (Header IP) si layer4 (Header TCP sau UDP), Source NAT, Destination NAT/Port Forwarding etc. 


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.

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".

Firewall
Un Firewall reprezinta o componenta a infrastructurii de securitate care separa retele de calculatoare sau calculatoare care au nivele diferite de securitate. 

Un firewall poate fi de 2 feluri:

a) Hardware - echipament dedicat, special creat, care are drept scop filtrarea datelor dintre 2 entitati ( Exemplu: Cisco ASA).

b) Software - aplicatie, care ruleaza pe calculator(server) impreuna cu alte programe care are acelasi scop ca si un firewall hardware 


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.
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.

Exista 3 generatii de firewall:

1. Packet based
Filtreaza in functie de campurile din headerele de la Layer 3 (Network) si 4 (Transport) ale OSI.
Nu diferentiaza intre pachete. 

2. Circuit-based numit si stateful firewall
Filtreaza in functie de campurile din headerele de la Layer 3 (Network/IP) si 4 (Transport/TCP,UDP) OSI.
Suplimentar se tine cont de relatiile dintre pachetul curent si celelalte.
Exemplu: un pachet adresat hostului local este permis daca acesta reprezinta raspuns la un pachet generat din interior (de hostul local). 

3. Application Layer Firewall (Proxy Based Firewalls)
Firewall care "citeste" datele de la nivelul aplicatie (FTP/HTTP/DNS etc). 

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).

Structura NETFILTER se imparte in 3 :

a) Chains
b) Tables
c) The state machine

Chains
NETFILTER foloseste default 5 chain-uri numite si hooks (carlige) prin care pachetele trec si in care NETFILTER poate interactiona cu acestea. Acestea sunt de fapt puncte de interactiune cu pachetele. 

Urmatoarea schema reprezinta drumul unui pachet prin kernel dupa ce a fost acceptat de driverul placii de retea. Host are semnificatia de proces local (aplicatie), cel care asteapta sau genereaza pachetul. 'Routing' nu reprezinta un chain ci doar o decizie in functie de care pachetul va fi routat/forwardat sau procesat de hostul local. 

http://imageshack.us/photo/my-images...nsiptables.jpg


Cele 5 chain-uri predefinite sunt:

1. PREROUTING
Acest chain este atins de pachete inaintea procesului de routare, imediat ce driverul placii de retea a acceptat pachetul. 

Este folosit pentru:
• modificarea headerelor pachetelor (mangling) inaintea procesului de rutare;
Exemplu: modificare TOS (Type of service) sau modificare TTL (Time to live) pentru a influenta procesul de rutare 
• DNAT (Destination NAT sau Port Forwarding);

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.

Este folosit pentru:
• modificarea pachetelor (mangling) dupa rutare, dar inainte sa fie trimise procesului local;
• filtrarea pachetelor;

3. OUTPUT
Prin acest hook trec pachetele generate de calculatorul local.

Este folosit pentru:
• filtrare sau manipulare pachete generate de hostul 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 tranziteaza hostul daca acesta este Router cat si cele generate de host.

Este folosit pentru:
• modificarea pachetelor (mangling) dupa procesul de rutare, dar inca pe hostul local;
• SNAD (Source NAT & Masquerading);

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, in functie de care acesta trece prin anumite chain-uri din cele 5:

a) vine din retea si este destinat hostului local; in acest caz pachetul trece prin chain-urile PREROUTING si apoi INPUT pana ajunge la aplicatie;

b) este generat de hostul local; in acest caz pachetul trece prin chain-urile OUTPUT si apoi POSTROUTING dupa care paraseste calculatorul prin placa de retea.

c) trece prin hostul local; in acest caz pachetul trece prin chain-urile PREROUTING, FORWARD si apoi POSTROUTING dupa care paraseste calculatorul prin placa de retea.


Tables
Fiecarui hook/chain NETFILTER ii este asociat un set de reguli definite intr-un tabel. In momentul in care un pachet "loveste" un chain acesta este verificat de fiecare regula din tabel.
O regula contine criterii care trebuie satisfacute de pachet si un target precum ACCEPT, DROP sau SNAT. Targetul este actiunea intreprinsa daca pachetul satisface regula din tabel. Fiecare regula are un target. 


Exemplu:

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 DNAT (port forwarding) si POSTROUTING in cazul SNAT. 

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. raw
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

The state machine
Connection tracking este componenta NETFILTER care ofera acestuia statutul de firewall stateful. Acesta poate lua decizii de filtrare a pachetelor nu in functie de headerul Layer3 (IP) si Layer4 (TCP/UDP) ci in functie de relatia pachetului cu celelalte pachete.

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.

NETFILTER defineste 4 stari pentru fiecare pachet:

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 

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;

La anumite versiuni fisierele referitoare la NETFILTER apar doar dupa ce se foloseste conntrack machine adica dupa ce se incarca in memorie firewall-ul ce contine regulile cu referire la starile unui pachet.


Sintaxa iptables



Commanda iptables (user space tool) se foloseste pentru a comunica cu NETFILTER. 


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.


Structura comenzii iptables este:

iptables -t nume_tabel -OPERATIE_ASUPRA_CHAIN NUME_CHAIN -criterii -j TARGET 

unde: 

Nume tabel:

filter
nat
raw
mangle

Numele tabelului in care se adauga regula trebuie scris cu litera mica. Daca se omite numele tabelului acesta este default filter.

Exemplu

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT 

este echivalent cu: 

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Operatii asupra unui chain

-A -> adaugare regula la sfarsitul tabelului atasat chainului;
-I -> adaugare regula pe prima pozitie in tabelul atasat chainului;
-L -> listare reguli;
-P -> policy, actiunea default care se executa daca nicio regula nu prinde pachetul;
-N -> creare chain nou definit de utilizator;
-X -> sterge chain definit de utilizator;
-F -> flush, goleste regulile din tabelul atasat chainului;
-Z -> zero, reset counters;


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.pinglord.gov
1. iptables -A OUTPUT -d www.pinglord.gov -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

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 120.0.0.10
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.3 -j SNAT --to-source 120.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 120.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 32.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

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.

ACCEPT -> pachetul este acceptat;
DROP -> pachetul este dropat;
REJECT -> pachetul este rejectat si hostul raspunde cu un mesaj de eroare sursei;
LOG -> logheaza/salveaza informatii despre pachet intr-un fisier;
LIMIT -> limiteaza nr. de pachete pe unitatea de timp;
SNAT -> realizeaza source nat;
MASQUERADE -> realizeaza source nat;
DNAT -> realizeaza destination nat/port forwarding;
TTL -> modifica TTL din pachet (headerul IP);

Numele targetului se scrie cu litera mare.


Sursa : Bajetii destepti a.k.a. Google using search


Daca vreti exemple de firewall scrieti si va arat.

Niciun comentariu: