Firewall
este un filtru al traficului pe retea
se va studia politica folosita de utilizatorul IPTABLES. Poate fi gasit pe net ca RPM. Simpla configurare a kernelului pentru IPTABLES nu este suficienta. Avem nevoie si de acest RPM.
IPTABLES se bazeaza pe 3 tabele de filtrare: mangle, nat si filter
In fiecare din aceste tabele exista chain-uri care contin reguli de filtrare. Noi putem crea lanturi dar nu si tabele.
Tabela mangle are urmatoarele lanturi predefinite:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
Tabela nat are urm. chain-uri predefinite:
PREROUTING
OUTPUT
POSTROUTING
Tabela filter are urm. chain-uri predefinite:
INPUT
FORWARD
OUTPUT
Pe un firewall pachetele parcurg o anumita ordine si nu e musai sa parcurga toate lanturile.
Tabela mangle se ocupa cu schimbarea TOS (type of service), marcarea pachetelor, etc.
In nat se face network address translating
In filter se face filtrarea pachetelor.
Decision - decide daca pachetul este pentru calculatorul local sau pentru a-l da mai departe 151e43b
Un pachet ce este generat de un process local va parcurge mangle OUTPUT, nat OUTPUT, filter POSTROUTING si nat POSTROUTING
Un pachet forward-at parcurge mangle FORWARD, filter FORWARD, mangle POSTROUTING si nat POSTROUTING
Un pachet care este adresat unui proces local va parcurge mangle PREROUTING, nat PREROUTING, ROUTING DECISION, mangle INPUT, filter INPUT
In filter INPUT se parcurge ce este pt. noi.
In filter FORWARD se parcurge ce este pt. altii de forward-at.
In filter OUTPUT se parcurg pachetele pt. altii de la mine.
Un flood de ping spre exemplu se opreste din INPUT.
Toate chain-urile predefinite au o asa numita "politica default" (daca nici o regula din regulile din chain-urile predefinite nu i se aplica pachetului, atunci i se va aplica politica default) care este setata accept dar care se poate schimba in drop sau reject.
Cel mai indicat este ca politica sa fie setata pe drop iar apoi se da accept doar la ce ne trebuie.
MANGLE - aici pot aparea urmatoarele target-uri (ceea ce va face pachetul):
TOS - schimba type of service
TTL - schimba time to live (adica prin cite HOP-uri - routere va trece un pachet pina va muri). Ex : TTL=5; daca pachetul are de strabatut 3 routere pana la destinatie, va ajunge. Pentru 7 routere, nu.
MARK - marcheaza pachetele pentru a li se aplica politici de rout-are avansata folosind IPROUTING2
NAT - target-uri valide:
DNAT (destination network address) - este valabil doar in chain-ul PREROUTING pt. ca routarea se face in functie de destinatia pachetului.
SNAT (source network address translating) - este valabil doar in chain-ul nat POSTROUTING
este folosit pt. ca daca sursa este un ip rezervat, pachetul va fi rejectat de primul rout-er. Atunci SNAT ii schimba ip-ul din unul rezervat in unul rout-abil.
MASQUERADE - echivalent cu SNAT, doar ca nu mai este necesara specificata adresa in care sa se schimbe sursa, ci va fi considerate sursa ip-ul interfetei pe care pleaca pachetul.
FILTER - face filtrarea efectiva
sunt acceptate toate celelalte target-uri
Crearea regulilor
Formatul generic este iptables [-t table] command match target/jump,
Unde [-t table] daca nu e specificat va lua default tabela filter, command - comenzi, match - cum este identificat un pachet, target - target-uri.
Obs: In cadrul chain-urilor, regulile sint parcurse de sus in jos. In cazul in care unui pachet i s-a gasit o regula care sa i se aplice, i se va aplica respectiva regula si nu va mai parcurge restul regulilor.
Comenzi:
-A / --append - are ca argument chain-ul in care se adauga o regula
- adauga o regula la sfirsitul chain-ului specificat
-D / --delete - are ca argument un chain
- sterge o regula din chain-ul specificat
- regula ce urmeaza a fi stearsa poate fi specificata ori prin numarul ei de ordine, ori rescriind regula ca si cand am adauga-o.
-R / --replace - are ca argument chain-ul si un numar de ordine
- va inlocui regula specificata prin nr. de ordine cu regula scrisa dupa comanda.
-I / --insert - are ca argument chain-ul si un numar de ordine
- va insera o regula dupa regula specificata prin nr. de ordine.
-L / --list - poate avea ca argument un chain. In cazul in care are un chain va lista continutul lui, daca nu, va lista continutul tuturor chain-urilor din tablea curenta.
-F / --flush - poate avea ca argument un chain
- daca da va sterge toate regulile din acesta, daca nu, va sterge toate regulile din toate chain-urile din tabela.
-N / --new-chain - are ca argument un chain definit de utilizator (nou definit si nu neaparat cu majuscule)
-X / --delete-chain - are ca argument un chain definit de utilizator
- nu se pot sterge chain-uri predefinite.
-E / --rename-chain - are 2 argumente: numele unui chain definit de utilizator
numele nou al chain-ului definit de utilizator
-P / --policy - seteaza politica default pe chain-urile predefinite
- chain-urile definite de utilizator nu au politica default si pot fi parcurse doar atunci cand se va face trimitere la ele dintr-un chain predefinit.
-atunci cind un pachet ce termina de parcurs un chain definit de utilizator si nu i s-a aplicat nici o regula, acesta se va intoarce in chain-ul de unde a plecat.
Optiuni ale comenzilor:
-n / --numeric - poate fi utilizat doar cu comanda -L si va lista toate datele numerice
--line-numbers - numeroteaza liniile respectivei listari (e folosita doar cu -L)
-d / --dst / --destination - are ca argument ca si -s doar ca identifica destinatia unui pachet
-i / --in-interface - are ca argument o interfata, identificind toate pachetele ce vin pe acea interfata.
-o / --out-interface - are ca argument o interfata si identifica toate pachetele ce pleaca pe acea interfata
-f / --fragment - nu are argument. Identifica pachetele ce sint fragmentate.
Obs: Fragmentele, este bine a fi filtrate foarte atent. La indicatie se realizeaza un chain
special pentru filtrarea acestora si nu se da drop la toate.
POD = ping of death
Match-uri specifice protocoalelor
TCP --sport / --source-port - are ca argument un nr. de port sau un range de porturi.
pt. un range se da: 22: . de la 22 la sfirsit
22:80 de la 22 la 80
:80 de la 0 la 80
identifica pachetele venind de la portul sursa cu portul specificat
--dport / --destination-port - permite aceleasi argumente.
- identifica pachetele ce vin cu portul destinatie cu portul specificat
UDP - sint doar optiunile de la TCP si sint identice
ICMP icmp-type urmat de un tip de pachet ICMP ca argument
- acest tip de pachet poate fi scris folosind codul lui sau numele complet
Ex: echo replay - > cod 0 si tip 0 (raspuns la ping)
Echo request - >cod 0 si tip 8 (ping)
Se pot nega anumite argumente (dport, tcp, ip, source / destination pt. ip)
Negarea se face cu ! inaintea argumentului.
Target-uri -j target / nume_chain_def_de_utilizator
DNAT - se face in PREROUTING
specifica faptul ca se face DNAT
are ca argument --to-destination ce are ca argument un ip simplu (192.168.0.10) sau un ip simplu cu un port simplu (192.168.0.10:80) sau un rage de ip-uri cu port simplu (192.168.0.2-192.168.0.10:80) sau un range de ip-uri cu un range de porturi (192.168.0.2-192.168.0.12:80-100)
SNAT - se face POSTROUTING
are ca argument --to-source cu aceleasi argumente
MASQUERADE - se face in POSTROUTING
- nu are nevoie de nici un alt parametru, si face un SNAT cu adresa interfetei pe care pleaca pachetul
ACCEPT - accepta pachetul
DROP - face drop la pachete fara a face nimic altceva (pachetul nu mai e vazut de nimeni)
REJECT - da drop unui pachet generand un mesaj de eroare ce va fi trimis sursei pachetului. Are ca optiuni --reject-with si are ca argument codul sau tipul unui pachet ICMP.
REDIRECT - se face in nat PREROUTING
este util in cazul in care doresc sa schimb doar portul unui pachet cu optiunea: --to-ports si se specifica un port sau un range de porturi
este buna in cazul in care pun un srv. de web pe un alt port. Atunci pachetele ce vin au portul 80 si le redirectionez catre portul ales de mine.
|