1. Indice

2. Firewall

Un firewall è un meccanismo di protezione hardware e/o software che permette di controllare le connessioni in ingresso e in uscita e applicano delle regole di blocco e filtraggio.

Esistono diversi tipi di firewall che operano a diversi livelli:

Studieremo quindi il Network Firewall.

Il packet filtering operato dai firewall può essere:

In entrambi i casi il firewall contiene una tabella di regole. Ogni regola contiene delle caratteristiche del pacchetto:

Nel caso di firewall stateful sono presenti anche altri campi, ma non ci poniamo questo problema per ora.

Per ogni pacchetto il firewall compie tre azioni:

  1. Analizza l’header
  2. Scorre la tabella delle regole
  3. Se il pacchetto corrisponde alle caratteristiche delal regola, intrapende l’azione

Ipotizzando una rete locale 222.22.0.0/16 e vogliamo:

Un esempio di firewall è il seguente:

indice IP sorgente Porta Sorgente IP destinatario Porta dest. Azione
1 111.11.11.0/24   222.22.22.0/24   DROP
2 111.11.0.0/16   222.22.22.0/24   ACCEPT
3 0.0.0.0   0.0.0.0   DROP

A seconda della regola di default (ultima riga della tabella), il firewall può essere:

3. netfilter e iptables

All’interno del kernel Linux il componente netfilter offre le funzionalità di:

iptables invece è il programma CLI che server per configurare le tabelle di reogle.

In particolare iptables lavora su diverse tabelle (tables), ogniuna con una specifica funzionalità.

Ogni tabella contiene diverse catene, dette chains, che contengono una lista di regole da applicare a una categoria di pacchetti.

Andiamo a studiare in particolare le tabelle filter e nat.

3.1. Tabella filter

La tabella filter ha 3 catene:

Per visualizzare le regole:

sudo iptables [-t table] -L [chain]

La tabella di default è proprio filter, mentre nel caso in cui non si specifichi una catena vengono vidualizzate tutte:

sudo iptables -L INPUT

Chain INPUT (policy ACCEPT) target prot opt source destination

sudo iptables -t nat -L

Chain PREROUTING (policy ACCEPT) target prot opt source destination

Chain INPUT (policy ACCEPT) target prot opt source destination

Chain OUTPUT (policy ACCEPT) target prot opt source destination

Chain POSTROUTING (policy ACCEPT) target prot opt source destination

Vediamo adesso uan serie di comandi per manipolare le tabelle:

# Aggiungere una regola in fondo alla catena
sudo iptables [-t table] -A chain rule-specification

# Aggiungere una regola in una posizione specifica (o in cima se lasciato vuoto)
sudo iptables [-t table] -I chain [num] rule-specification

# Rimuovere una regola dalla catena
sudo iptables [-t table] -D chan rule-specification
sudo iptables [-t table] -D chan num

# Rimuovere tutte le regole dalla/e catena/e
sudo iptables [-t table]  -F [chain]

# Cambiare la regola di default
sudo iptables [-t table] -P target

rule-specification è una stringa in cui possiamo specificare:

Comando Descrizione
-p <protocollo> protocollo (TCP, UDP, ICMP, …)
-s <address> indirizzo sorgente
-d <address> indirizzo destinazione
--sport <port> porta sorgente
--dport <port> porta destinazione
-i <interface> interfaccia di ingresso
-o <interface> interfaccia di uscita
-j <target> azione (DROP/ACCEPT)

Un aspetto importante da sottolineare è che le regole non vengono salvate permanentemente. È quindi necessario reimpostarle ad ogni avvio del sistema. Un modo utile per farlo è:

# Salviamo le regole
sudo iptables-save > file

# Carichiamo le regole
sudo iptables-restore < file

4. NAT

Il NAT permette ai dispositivi all’interno di una rete di utilizzare degli indirizzi IP locali, che vengono tutti tradotti come un unico indirizzo IP pubblico.

Attraverso il meccanismo di port translation può modificare internamente gli header delle richieste manipolando le porte e gli indirizzi IP dei pacchetti, salvando all’interno delle tabelle le regole di traduzione.

La tabella nat ha 3 catene:

Per settare una nuova conversione per la traduzione da indirizzo IP locale a IP pubblico:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 151.162.50.2

Invece se volessimo fare la conversione inversa nel momento dell’arrivo della risposta:

sudo iptables -t nat -A PREROUTING -d 151.162.50.2 -j DNAT --to 192.168.0.2

Invece per impostare una nuova regola per mappare più richieste di client diversi sulla stessa porta in porte diverse:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 151.162.50.1:4001-4100

Per reindirizzare tutte le richieste ad una porta ad un determinato dispositivo:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.55:80

Le catene di filter e nat sono disposte in modo che filter veda indirizzi e porte reali:

5. Firewall Stateful

Possiamo specificare nelal regola un criterio basato sullo stato della connessione TCP di cui un pacchetto fa parte.

A esempio possiamo rendere accessibile via ssh (port 22) un host (192.168.10.1) solo per il computer dell’amministratore (192.168.10.5), e che non possa farlo da solo:

sudo iptables -P DROP

# Permetti le connessioni ssh dall'amministratore verso l'host
sudo iptables -A INPUT -p tcp -i -s 192.168.10.5 -d 192.168.10.1 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

sudo iptables -A OUTPUT -p tcp -o eth0 -s 192.168.10.1 -d 192.168.10.5 --sport 22 -m state --state ESTABLISHED -j ACCEPT

Un altro esempio può essere quello di un firewall che blocca le connessioni dall’eserno ma permette quelli che partono dalla rete locale:

sudo iptables -A FORWARD -s 192.168.10.0/24 -i eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -d 192.168.10.0/24 -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# OPPURE #
sudo iptables -A FORWARD -s 192.168.10.0/24 -i eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -d 192.168.10.0/24 -i eth0 -m state --state NEW -j DROP

Un ulteriore esempio può essere quello dell’utilizzo del firewall per proteggersi dal SYN flooding:

sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT