# Tutorial di iptables: come configurare le tabelle di filtraggio del kernel Linux

Il filtro dei pacchetti è un componente importante per le misure di sicurezza di tutti i sistemi che si trovano in una rete, infatti il controllo e la gestione del traffico dati in entrata e in uscita (spesso parte dei compiti di un [firewall](https://www.ionos.it/digitalguide/server/sicurezza/cose-un-firewall/ "Cos’è un firewall?")) deve assicurare che i pacchetti ricevuti e inviati **non contengano malware e spam**. Nel kernel Linux è in genere già presente un filtro dei pacchetti di questo tipo, offerto da alcuni moduli del pacchetto Netfilter, anche se per configurarlo è necessario un programma aggiuntivo. Per questo kernel di Linux 2.4 e 2.6 avete bisogno del software libero iptables, che è stato sviluppato ugualmente dal team del progetto Netfilter.

Gli amministratori utilizzano iptables per stabilire, cambiare e rimuovere regole, anche se le impostazioni vengono perse al riavvio del sistema. Grazie agli strumenti appartenenti ad iptables, iptables-save e iptables-restore è possibile **salvare e ripristinare le regole create**, cosa che avviene addirittura automaticamente durante il processo di boot con Init script. iptables è confinato però al **protocollo IPv4**, per gli altri protocolli ci sono varianti come ip6tables o ebtables rispettivamente per IPv6 e per i pacchetti Ethernet, che sono ugualmente contenute nel core.

Vi presentiamo in questo tutorial le funzioni di base, le opzioni del filtro dei pacchetti iptables e vi spieghiamo anche la configurazione delle tabelle basandoci su diversi esempi.

## Come funziona iptables

Su Linux, iptables è generalmente già preinstallato. Se non è questo il caso o se volete essere sicuri di utilizzare l’ultima versione del software, potete scegliere di aggiornarlo e installarlo anche dal **gestore di pacchetti** della vostra distribuzione. Inserite il seguente comando nel terminale:

```none
sudo apt-get install iptables
```

Ci sono diverse interfacce grafiche per iptables, ad esempio [Webmin](https://www.webmin.com/ "Webmin: l’interfaccia di amministrazione dei sistemi UNIX"), dove l’uso del programma tramite riga di comando è relativamente semplice e facile da imparare.

iptables **richiede dei privilegi di sistema avanzati** e può quindi essere eseguito solo come utente root o con i relativi permessi di amministratore. Le tabelle (tables) caricate con il programma e create prima dal kernel comprendono catene (chains) di regole (rules) che indicano come devono essere trattati i pacchetti in ingresso e quelli inviati. Questi **pacchetti vengono trasmessi all’interno di una catena passando da regola a regola**, in cui ognuna di queste può provocare un’azione (jump target) o un passaggio ad un’altra catena (goto chain).

Le azioni, che si verificano quando una regola corrisponde ad un determinato pacchetto, possono essere le seguenti:

- **ACCEPT:** il pacchetto viene accettato.
- **DROP:** il pacchetto viene rifiutato.
- **QUEUE:** il pacchetto viene spostato negli altri processi utente; prevede un intermediario (queue handler) che inoltra i pacchetti all’applicazione.
- **RETURN:** il pacchetto viene rinviato alla catena precedente, quando si tratta di una catena personalizzata, mentre in quelle standard viene eseguita la policy della catena (di default senza configurazione: ACCEPT).

Le catene standard nominate nell’azione RETURN sono già presenti nella **tabella di filtraggio di iptables**: si tratta di tre catene INPUT, FORWARD e OUTPUT. La prima si occupa dei pacchetti, che devono essere consegnati al sistema, mentre la seconda elabora i pacchetti in entrata che sono destinati all’inoltro. Invece, la catena OUTPUT controlla il traffico dati, generato dal proprio computer. Per il resto, oltre alle tabelle di filtraggio, esistono una **tabella NAT** per la conversione degli indirizzi di rete e una **tabella MANGLE** per la manipolazione del pacchetto. Una panoramica dettagliata sulle funzionalità del software è offerta dalla pagina “Man”, che si può aprire in ogni momento con il comando

```none
man iptables
```

In alternativa trovate moltissime guide di iptables in diverse lingue su [netfilter.org](https://www.netfilter.org/documentation/index.html#documentation-howto "Documentazione di iptables: how-to, tutorial e FAQ").

## Come creare e gestire le proprie regole di filtraggio

In questo paragrafo trattiamo la tabella di filtraggio e le sue regole. La tabella qui sotto contiene i singoli comandi per creare e gestire catene: per la **regolazione del traffico dati** potete creare una vostra catena o ricorrere alle tre catene standard INPUT, OUTPUT e FORWARD. Le principali **opzioni di configurazione** sono:

<table>
  <thead>
    <tr>
      <th>Comandi di iptables</th>
      <th>Esempio</th>
      <th>Spiegazione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>-N “Nome della catena”</td>
      <td>sudo iptables -N test</td>
      <td>Crea una nuova catena con il nome “test“.</td>
    </tr>
    <tr>
      <td>-X “Nome della catena”</td>
      <td>sudo iptables -X test</td>
      <td>Elimina la catena vuota con il nome “test“; non funziona con le catene standard INPUT, OUTPUT e FORWARD.</td>
    </tr>
    <tr>
      <td>-L “Nome della catena”</td>
      <td>sudo iptables -L test</td>
      <td>Elenca le regole della catena con il nome “test“.</td>
    </tr>
    <tr>
      <td>-F “Nome della catena”</td>
      <td>sudo iptables -F test</td>
      <td>Elimina tutte le regole della catena con il nome “test“.</td>
    </tr>
    <tr>
      <td>-P “Nome della catena” “Azione”</td>
      <td>sudo iptables -P INPUT ACCEPT</td>
      <td>Stabilisce la policy per la catena. Nell’esempio il pacchetto viene accettato automaticamente, se non sono comprese le regole del filtro della catena INPUT.</td>
    </tr>
    <tr>
      <td>-A “ Nome della catena“ “Regola”</td>
      <td>sudo iptables -A test -s 127.0.0.1 -j DROP</td>
      <td>Allega una nuova regola alla catena scelta. Nell’esempio viene aggiunta la regola della catena “test“ di rifiutare i pacchetti dell’IP 127.0.0.1.</td>
    </tr>
    <tr>
      <td>-D “ Nome della catena“ “Regola”</td>
      <td>sudo iptables -D test -s 127.0.0.1 -j DROP</td>
      <td>Elimina la regola data della catena scelta.</td>
    </tr>
    <tr>
      <td>-I “ Nome della catena“ “Posizione” “Regola”</td>
      <td>sudo iptables -I test 1 -s 127.0.0.1 -j DROP</td>
      <td>Aggiunge la nuova regola alla posizione scelta della catena, nell’esempio nella posizione 1.</td>
    </tr>
    <tr>
      <td>-D “ Nome della catena“ “Posizione”</td>
      <td>sudo iptables -D test 1</td>
      <td>Elimina la regola della catena scelta con indicazione della posizione di questa regola, nell’esempio sempre nella posizione 1.</td>
    </tr>
  </tbody>
</table>

## Come iptables contribuisce alle regole della protezione del sistema

Ora vi indichiamo le possibilità di iptables portando ad esempio la **configurazione di un firewall rudimentale**. Poiché a seconda della distribuzione le catene standard INPUT, OUTPUT e FORWARD presentano regole già predefinite, bisogna prima eliminarle:

```none
sudo iptables -F
```

Nel secondo passaggio aggiungete per ognuna delle tre catene la **policy DROP** per assicurare che vengano bloccati in ogni caso i pacchetti, a patto che nessuna delle regole di filtraggio presentate porti ad un risultato positivo:

```none
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP
```

Successivamente attivate il vostro sistema, il [localhost](https://www.ionos.it/digitalguide/server/know-how/localhost/ "Localhost") (lo) per il traffico in ingresso (-i) e in uscita (-o) (quindi verrà compiuta l’azione ACCEPT), ampliando sia la catena INPUT sia quella OUTPUT tramite le regole corrispondenti (-A):

```none
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
```

In seguito autorizzate le **connessioni HTTP e HTTPS in uscita** (Porta 80 e porta 443) per le porte TCP comuni da 1024 a 65535:

```none
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 80 --sport 1024:65535 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 --sport 1024:65535 -j ACCEPT
```

Nell’ultimo passaggio accettate tutti i pacchetti in entrata e in uscita che appartengono già ad una **connessione esistente** (--state ESTABLISHED) o si riferiscono ad una di queste (--state RELATED):

```none
sudo iptables -A INPUT -i eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -m state -state RELATED,ESTABLISHED -j ACCEPT
```

Visto che le **regole create con iptables sono temporanee** e rimangono valide solo fino a quando non si arresta il computer, dovreste salvare le vostre impostazioni grazie al comando iptables-save nel file .rules della rispettiva cartella iptables. Il comando appropriato per i sistemi Ubuntu è:

```none
sudo iptables-save > /etc/iptables/iptables.rules
```

Dando il comando

```none
sudo iptables-restore < /etc/iptables/iptables.rules
```

caricate questo file manualmente, dopo ogni riavvio del vostro sistema. Alternativamente potete **creare uno script** corrispondente, cosicché l’applicazione del filtro dei pacchetti venga eseguita automaticamente. Per ulteriori informazioni sui filtri di rete e iptables, vi consigliamo di dare un’occhiata alla guida presente sul [wiki di Ubuntu](http://wiki.ubuntu-it.org/Sicurezza/Iptables "Guida a iptables su Ubuntu").


This is a markdown version of: [https://www.ionos.it/digitalguide/server/tools-o-strumenti/tutorial-di-iptables-regole-e-filtri-per-i-pacchetti/](https://www.ionos.it/digitalguide/server/tools-o-strumenti/tutorial-di-iptables-regole-e-filtri-per-i-pacchetti/) for AI/LLM consumption.