Ricerca nel sito web

Come configurare un firewall Iptables per abilitare l'accesso remoto ai servizi in Linux - Parte 8


Presentazione del programma di certificazione Linux Foundation

Ricorderete dalla Parte 1 – Informazioni su Iptables di questa serie LFCE (Linux Foundation Certified Engineer) che abbiamo fornito una descrizione di base di cosa sia un firewall: un meccanismo per gestire pacchetti in entrata e in uscita dalla rete. Per “gestire” intendiamo infatti:

  1. Per consentire o impedire a determinati pacchetti di entrare o uscire dalla nostra rete.
  2. Per inoltrare altri pacchetti da un punto della rete a un altro.

sulla base di criteri predeterminati.

In questo articolo discuteremo come implementare il filtraggio dei pacchetti di base e come configurare il firewall con iptables, un frontend per netfilter, che è un modulo nativo del kernel utilizzato per il firewall.

Tieni presente che il firewall è un argomento vasto e questo articolo non vuole essere una guida completa per comprendere tutto ciò che c'è da sapere al riguardo, ma piuttosto come punto di partenza per uno studio più approfondito di questo argomento. Tuttavia, rivisiteremo l'argomento nella Parte 10 di questa serie quando esploreremo alcuni casi d'uso specifici di un firewall in Linux.

Puoi pensare a un firewall come a un aeroporto internazionale dove gli aerei passeggeri vanno e vengono quasi 24 ore su 24, 7 giorni su 7. In base a una serie di condizioni, come la validità del passaporto di una persona o il suo paese di origine (per citare alcuni esempi), a lui o lei può essere consentito o meno di entrare o uscire da un determinato paese.

Allo stesso tempo, i funzionari aeroportuali possono ordinare alle persone di spostarsi da un luogo all'altro dell'aeroporto, se necessario, ad esempio quando devono passare attraverso i servizi doganali.

Potremmo trovare utile l'analogia con l'aeroporto durante il resto di questo tutorial. Tieni semplicemente a mente le seguenti relazioni mentre procediamo:

  1. Persone=Pacchetti
  2. Firewall=Aeroporto
  3. Paese n. 1=Rete n. 1
  4. Paese n. 2=Rete n. 2
  5. Regolamenti aeroportuali applicati dagli agenti=regole firewall

Iptables – Le nozioni di base

A livello basso, è il kernel stesso che “decide” cosa fare con i pacchetti in base a regole raggruppate in catene o frasi. Queste catene definiscono quali azioni dovrebbero essere intraprese quando un pacchetto soddisfa i criteri da loro specificati.

La prima azione intrapresa da iptables consisterà nel decidere cosa fare con un pacchetto:

  1. Accettarlo (lasciarlo passare nella nostra rete)?
  2. Rifiutarlo (impedire che acceda alla nostra rete)?
  3. Inoltrarlo (a un'altra catena)?

Nel caso ti stavi chiedendo perché questo strumento si chiama iptables, è perché queste catene sono organizzate in tabelle, di cui la tabella filtro è la più conosciuta e quella più utilizzato per implementare il filtraggio dei pacchetti con le sue tre catene predefinite:

1. La catena INPUT gestisce i pacchetti che entrano nella rete e sono destinati ai programmi locali.

2. La catena OUTPUT viene utilizzata per analizzare i pacchetti originati nella rete locale, che devono essere inviati all'esterno.

3. La catena FORWARD elabora i pacchetti che devono essere inoltrati ad un'altra destinazione (come nel caso di un router).

Per ciascuna di queste catene esiste una politica predefinita, che stabilisce cosa dovrebbe essere fatto per impostazione predefinita quando i pacchetti non soddisfano nessuna delle regole della catena. Puoi visualizzare le regole create per ciascuna catena e la policy predefinita eseguendo il comando seguente:

iptables -L

Le policy disponibili sono le seguenti:

  1. ACCETTA → lascia passare il pacchetto. Qualsiasi pacchetto che non soddisfa alcuna regola nella catena viene consentito nella rete.
  2. DROP → rilascia silenziosamente il pacchetto. A qualsiasi pacchetto che non soddisfa alcuna regola nella catena viene impedito l'ingresso nella rete.
  3. REJECT → rifiuta il pacchetto e restituisce un messaggio informativo. Questo in particolare non funziona come politica predefinita. È invece pensato per integrare le regole di filtraggio dei pacchetti.

Quando si tratta di decidere quale politica implementare, è necessario considerare i pro e i contro di ciascun approccio come spiegato sopra; tieni presente che non esiste una soluzione unica -tutta la soluzione.

Aggiunta di regole

Per aggiungere una regola al firewall, richiama il comando iptables come segue:

iptables -A chain_name criteria -j target

Dove,

  1. -A sta per Aggiungi (aggiungi la regola corrente alla fine della catena).
  2. chain_name è INPUT, OUTPUT o FORWARD.
  3. target è l'azione, o la politica, da applicare in questo caso (ACCEPT, REJECT o DROP).
  4. I criteri sono l'insieme delle condizioni rispetto alle quali devono essere esaminati i pacchetti. È composto da almeno uno (molto probabilmente più) dei seguenti flag. Le opzioni tra parentesi, separate da una barra verticale, sono equivalenti tra loro. Il resto rappresenta opzioni opzionali:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Il nostro ambiente di test

Incolliamo tutto ciò in 3 esempi classici utilizzando il seguente ambiente di test per i primi due:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

E questo per l'ultimo esempio

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
ESEMPIO 1: Analizzare la differenza tra le politiche DROP e REJECT

Definiremo prima una politica DROP per i ping di input nel nostro firewall. Cioè, i pacchetti icmp verranno eliminati silenziosamente.

ping -c 3 192.168.0.15
iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

Prima di procedere con la parte REJECT, cancelleremo tutte le regole dalla catena INPUT per assicurarci che i nostri pacchetti verranno testati da questa nuova regola:

iptables -F INPUT
iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
ping -c 3 192.168.0.15

ESEMPIO 2: Disabilitare/riabilitare gli accessi ssh da dev2 a dev1

Ci occuperemo della catena OUTPUT poiché gestiamo il traffico in uscita:

iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

ESEMPIO 3: Consentire/impedire ai client NFS (da 192.168.0.0/24) di montare condivisioni NFS4

Esegui i seguenti comandi nel server/firewall NFSv4 per chiudere le porte 2049 e 111 per tutti i tipi di traffico:

iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

Ora apriamo quelle porte e vediamo cosa succede.

iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

Come puoi vedere, siamo riusciti a montare la condivisione NFSv4 dopo aver aperto il traffico.

Inserimento, aggiunta ed eliminazione di regole

Negli esempi precedenti abbiamo mostrato come aggiungere regole alle catene INPUT e OUTPUT. Se invece volessimo inserirli in una posizione predefinita, dovremmo utilizzare invece lo switch -I (i maiuscola).

È necessario ricordare che le regole verranno valutate una dopo l'altra e che la valutazione si interrompe (o salta) quando viene soddisfatta una politica DROP o ACCEPT. Per questo motivo, potresti trovarti nella necessità di spostare le regole verso l'alto o verso il basso nell'elenco delle catene, a seconda delle necessità.

Utilizzeremo un esempio banale per dimostrarlo:

Poniamo la seguente regola,

iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

nella posizione 2) nella catena INPUT (spostando quindi il precedente #2 come #3)

Utilizzando la configurazione precedente, il traffico verrà controllato per vedere se è diretto alla porta 80 prima di verificare la porta 2049.

In alternativa, puoi eliminare una regola e modificare la destinazione delle regole rimanenti in REJECT (utilizzando l'opzione -R):

iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

Ultimo, ma non meno importante, dovrai ricordare che affinché le regole del firewall siano persistenti, dovrai salvarle su un file e poi ripristinarle automaticamente all'avvio (utilizzando il metodo preferito da te scelto o quello che è disponibile per la distribuzione).

Salvataggio delle regole del firewall:

iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Regole di ripristino:

iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Qui possiamo vedere una procedura simile (salvataggio e ripristino manuale delle regole del firewall) utilizzando un file fittizio chiamato iptables.dump invece di quello predefinito come mostrato sopra.

iptables-save > iptables.dump

Per rendere queste modifiche persistenti tra gli avviamenti:

Ubuntu: installa il pacchetto iptables-persistent, che caricherà le regole salvate nel file /etc/iptables/rules.v4.

apt-get install iptables-persistent

CentOS: aggiungi le seguenti 2 righe al file /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: elenca porte, protocolli, indirizzi consentiti e così via (separati da virgole) in /etc/sysconfig/SuSEfirewall2.

Per ulteriori informazioni fare riferimento al file stesso, che è ampiamente commentato.

Conclusione

Gli esempi forniti in questo articolo, pur non coprendo tutti i vantaggi di iptables, hanno lo scopo di illustrare come abilitare e disabilitare il traffico in entrata o in uscita.

Per quelli di voi che sono fan dei firewall, tenete presente che rivisiteremo questo argomento con applicazioni più specifiche nella Parte 10 di questa serie LFCE.

Sentitevi liberi di farmi sapere se avete domande o commenti.