Sunteți pe pagina 1din 16

9.

NETFILTER
NETFILTER

9.1 Prezentare generala


9.2 Firewall
9.3 Structura NETFILTER
9.4 Sintaxa iptables
9.5 Scenarii si exemple

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.

2. Prezentarile ce urmeaza pornesc de la premisa ca cele de mai sus va sunt cunoscute.

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

9. NETFILTER » 9.1 Prezentare generala


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

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

9. NETFILTER » 9.2 Firewall


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

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.

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

Resurse
 Firewall Q&A
 http://www.vicomsoft.com/knowledge/reference/firewalls1.html

9. NETFILTER » 9.3 Structura NETFILTER


Structura NETFILTER
9.3.1 Chains9.3.2 Tables9.3.3 The state machine9.3.4 Fisiere importante
Resurse
 iptables overview

9. NETFILTER » 9.3 Structura NETFILTER » 9.3.1 Chains


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.

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

9. NETFILTER » 9.3 Structura NETFILTER » 9.3.2 Tables


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

9. NETFILTER » 9.3 Structura NETFILTER » 9.3.3 The state machine


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 (FC9)

tcp 6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \ dport=22 [UNREPLIED]


src=192.168.1.9 dst=192.168.1.6 sport=22 \ dport=32775 [ASSURED] use=2

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

9. NETFILTER » 9.3 Structura NETFILTER » 9.3.4 Fisiere importante


Fisiere importante

9. NETFILTER » 9.4 Sintaxa iptables


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

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.

Structura comenzii iptables este:

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

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

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;

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.

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

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

 numele chain-ului se scrie cu litera mare (FORWARD);

 criteriile se scriu cu litera mica (-s 192.168.0.0/16);

 targetul se scrie cu litera mare (-j DROP);

Resurse
 iptables syntax

9. NETFILTER » 9.5 Scenarii si exemple


Scenarii si exemple
9.5.1 Firewall basic
9.5.2 Firewall avansat
9.5.3 Routing (SNAT)
9.5.4 Port Forwarding(DNAT)
Pentru a crea un firewall folosind NETFILTER, singura modalitate in Linux, exista mai multe posibilitati:

1. Folosind scripturi deja create precum firestarter


Aceste scripturi contin o sectiune de configurare unde adminul seteaza modul in care firewall-ul va opera
(alege porturile pe care asculta severele locale si catre care se pot conecta utilizatorii, seteaza IP-urile de la
care se accepta conexiuni etc).

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.

2. Folosind aplicatii grafice disponibile in GNOME sau KDE.


Scopul cursului este de a forma administratori de sistem pentru administrarea de servere. Serverele Linux
ruleaza in runlevel 3 fara mod grafic, iar intreaga administrare se face remote folosind ssh din consola in
mod text.

3. Creand propriul firewall de la zero.


Aceasta este modalitatea cea mai recomandata. Chiar daca la un moment dat vom folosi din anumite
considerente sau politici stabile un script general gata facut, pentru o buna intelegere a modului in care
NETFILTER functioneaza orice admin trebuie sa creeze si sa testeze un firewall de la zero.

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

9. NETFILTER » 9.5 Scenarii si exemple » 9.5.1 Firewall basic


Firewall basic
Important
Crearea unui firewall eficient folosind comanda iptables poate avea loc doar dupa intelegerea in profunzime
a conceptelor prezentate in sectiunile anterioare. Exersati doar dupa ce notiunile de CHAIN, tabele, reguli,
traversarea chainurilor etc va sunt foarte clare !

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

Filtrarea dupa MAC


Cerinte:
 se doreste acceptarea de pachete doar de la un singur MAC
 scenariu poate fi util cand se doreste limitarea hosturilor cu care poate comunica un server in LAN,
sau comunicarea doar cu default gateway si deci doar pe Internet

#!/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

Outputul acestei comenzi ne indica:


 policy de pe fiecare CHAIN
 regulile din tabelele atasate chain-urilor

 nr de pachete prinse de fiecare regula

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

Durata: 1.49 min


Marime: 4.7MB
Stateful firewall. Este permis tot traficul outbound si raspunsul la acesta. Ideal pentru Desktop

Durata: 1.46 min


Marime: 336KB

Blocarea conexiunilor catre host cu exceptia SSH. Traficul outbound si raspusul la acesta este permis.

Durata: 5.35 min


Marime: 309KB

Logare PING (pachetele ICMP echo-request trimise si echo-response primite).

Durata: 1.55 min


Marime: 435KB

9. NETFILTER » 9.5 Scenarii si exemple » 9.5.2 Firewall avansat


Firewall avansat
Scenariu 1

Se doreste crearea unui firewall pentru un server din LAN


Cerinte:
 pe host ruleaza server ssh (tcp/22), http (tcp/80), https (tcp/443), smtp (tcp/25), pop (tcp/110),
imap (tcp/143) si dns (dns/53). Toate aceste servicii si doar acestea trebuie sa fie accesibile userilor
din LAN
 firewall-ul trebuie sa dropeze si sa logheze pachetele invalide

 serverul poate accesa pe internet doar servere web (pentru update) si dns (pentru query iterative
sau pentru a folosi un forwarder)

#!/bin/bash #VARIABLE SECTION


###############################################################
TCP_IN_LAN="22 25 80 110 143 443" UDP_IN_LAN="53" TCP_OUT_WAN="80" UDP_OUT_WAN="53"
##############################################################
#stergere orice regula din toate tabelele de pe toate chainurile iptables -t filter -F iptables -t nat -F iptables
-t mangle -F #logarea pachetelor invalide trimise sau primite de server iptables -A INPUT -m state --state
INVALID -j LOG --log-level info --log-prefix "INPUT INVALID PACKET" iptables -A OUTPUT -m state --state
INVALID -j LOG --log-level info --log-prefix "OUTPUT INVALID PACKET" #dropara pachetelor invalide trimise
sau primite de server iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state
--state INVALID -j DROP #ciclu for pentru adaugarea unei reguli pentru fiecare port tcp permis (conexiune
din LAN catre server) for tcp_lan in do #permiterea pachetelor din LAN catre server iptables -A INPUT -s
192.168.0.0/24 -p tcp --dport -j ACCEPT #permitearea raspunsului la pachetele din LAN catre server
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp --sport -j ACCEPT done #ciclu for pentru adaugarea unei reguli
pentru fiecare port tcp permis (conexiune din LAN catre server) for udp_lan in do iptables -A INPUT -s
192.168.0.0/24 -p udp --dport -j ACCEPT iptables -A OUTPUT -d 192.168.0.0/24 -p udp --sport -j ACCEPT
done #ciclu for pentru adaugarea unei reguli pentru fiecare port tcp permis (conexiuni de la server catre
Internet) for tcp_wan in do iptables -A OUTPUT -d 0/0 -p tcp --dport -j ACCEPT iptables -A INPUT -s 0/0 -p
tcp --sport -j ACCEPT done #ciclu for pentru adaugarea unei reguli pentru fiecare port udp permis
(conexiune de la server catre Internet) for udp_wan in do iptables -A OUTPUT -d 0/0 -p udp --dport -j
ACCEPT iptables -A INPUT -s 0/0 -p udp --sport -j ACCEPT done #adaugare reguli pentru pachete ICMP din
LAN (userii din LAN pot da ping la server. Acesta nu raspunde la ping de pe Internet) iptables -A INPUT -s
192.168.0.0/24 -p icmp -j ACCEPT iptables -A OUTPUT -d 0/0 -p icmp -j ACCEPT #setare policy DROP
pentru pachetele care nu au fost permise de regulile de mai sus iptables -P INPUT DROP iptables -P OUTPUT
DROP iptables -P FORWARD DROP
Scenariul 2

Se doreste crearea unui firewall pentru un Router Linux.


Routerul este un host Linux cu 2 interfete Ethernet. Interfata eth0 este de LAN iar interfata eth1 este de
WAN. ISP-ul furnizeaza un singur IP public, iar subnetul de LAN este 192.168.0.0/24
Se considera ca Routerul este deja configurat corect pentru NAT.
Cerinte:
 userii din LAN pot accesa pe Internet doar site-uri web, pot sa-ti citeasca e-mailul folosind un client
dedicat precum Mozilla Thunderbird sau se pot conecta prin ssh la alte servere. Alte servicii nu
trebuie sa fie accesibile
 Routerul nu poate fi verificat cu ping de pe Internet ci doar din LAN

#!/bin/bash #VARIABLE SECTION


###############################################################
LAN_ACCESS="22 25 80 110 143 443"
##############################################################
#stergere orice regula din toate tabelele de pe toate chainurile iptables -t filter -F iptables -t nat -F iptables
-t mangle -F #logarea pachetelor invalide trimise sau primite de server iptables -A INPUT -m state --state
INVALID -j LOG --log-level info --log-prefix "INPUT INVALID PACKET" iptables -A OUTPUT -m state --state
INVALID -j LOG --log-level info --log-prefix "OUTPUT INVALID PACKET"

#dropara pachetelor invalide trimise sau primite de server

iptables -A INPUT -m state --state INVALID -j DROP


iptables -A OUTPUT -m state --state INVALID -j DROP

#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

9. NETFILTER » 9.5 Scenarii si exemple » 9.5.3 Routing (SNAT)


Routing (SNAT)
De cele mai multe ori utilizatorii casnici folosesc o conexiune broadband de tip ADSL sau CaTV pentru
conectarea la Internet.

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

Din punct de vedere al configurarii NETFILTER urmatoarele aspecte sunt importante:


 SNAT se realizeaza pe chainul POSTROUTING folosind tabelul nat care este suficient sa contina o
singura regula;
 se foloseste targetul SNAT. Se poate folosi si targetul MASQUARADE in momentul in care IP-ul
public nu este static ci este obtinut dinamic;

 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);

Exemplu transformare host in router si configurare pentru SNAT (configuratie completa):


#presupunem ca ip-ul public este 213.232.32.3, subnetul local este 10.0.0.0/24 iar interfata de WAN se
numeste eth0 iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j SNAT --to-source 213.232.32.3
#activeaza procesul de rutare echo "1" > /proc/sys/net/ipv4/ip_forward
Nota
Se recomanda rularea scriptului de mai sus la butare automat folosind scripturi de management a
serviciilor din directorul /etc/init.d

© 2006-2008 Crystal Mind Academy. All rights reserved


9. NETFILTER » 9.5 Scenarii si exemple » 9.5.4 Port Forwarding(DNAT)
Port Forwarding(DNAT)
Prin procesul de NAT intrega retea privata din spatele routerului este ascunsa pe Internet.
De multe ori se doreste conectarea la un serviciu ( Exemplu: un server web) care ruleaza pe un host din LAN
care este configurat cu IP privat ( Exemplu: 10.0.0.1)

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.

Din punct de vedere al configurarii NETFILTER urmatoarele aspecte sunt importante:


 DNAT se realizeaza pe chainul PREROUTING folosind tabelul nat care este suficient sa contina o
singura regula. Chainul folosit este PREROUTING fiindca regulile din acesta sunt evaluate inainte de
procesul de rutare. In momentul in care are loc decizia de rutarea, routerul trebuie sa aiba acces la
IP-ul final si anume cel privat pentru o deciezie de rutare corecta;
 se foloseste targetul DNAT;

Exemplu configurare router pentru DNAT:


#presupunem ca IP-ul public este 88.0.0.1 iar IP-ul serverului web din LAN este 10.0.0.10. #Pachetele din
exterior catre 88.0.0.1 vor fi redirectate la 10.0.0.10 iptables -t nat -A PREROUTING -p tcp -d 88.0.0.1
--dport 80 -j DNAT --to-destination 10.0.0.10

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