Come configurare un firewall iptables per abilitare l’accesso remoto ai servizi in Linux – Parte 8

Linux Foundation Certified Engineer – Part 8

Presentazione del programma di certificazione della Linux Foundation

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

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

in base a criteri predeterminati.

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

Si noti che il firewalling è un argomento vasto e questo articolo non è inteso come una guida esaustiva 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, torneremo sull’argomento nella Parte 10 di questa serie quando esploreremo alcuni casi d’uso specifici di un firewall in Linux.

Potete pensare a un firewall come a un aeroporto internazionale dove gli aerei passeggeri arrivano e partono quasi 24 ore su 24. In base a una serie di condizioni, come la validità del passaporto di una persona, o il suo paese di origine (per citarne alcuni esempi) può, o non può, essere autorizzato a entrare o uscire da un determinato paese.

Allo stesso tempo, gli ufficiali aeroportuali possono indicare alle persone di spostarsi da un luogo all’aeroporto a un altro se necessario, ad esempio quando devono passare attraverso i Servizi Doganali.

Potremmo trovare utile l’analogia dell’aeroporto durante il resto di questa guida. Tieni presente le seguenti relazioni mentre procediamo:

  1. Persone = Pacchetti
  2. Firewall = Aeroporto
  3. Paese #1 = Rete #1
  4. Paese #2 = Rete #2
  5. Regole aeroportuali applicate dagli ufficiali = regole del firewall

Iptables – Le basi

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 corrisponde ai criteri specificati da esse.

La prima azione intrapresa da iptables consiste 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 stessi chiedendo perché questo strumento si chiama iptables, è perché queste catene sono organizzate in tabelle, con la tabella filtro che è la più conosciuta e quella che viene utilizzata per implementare il filtraggio dei pacchetti con le sue tre catene predefinite:

1. La catena INPUT gestisce i pacchetti che entrano nella rete, che sono destinati a 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 verso un’altra destinazione (come nel caso di un router).

Per ciascuna di queste catene esiste una policy predefinita, che stabilisce cosa fare per impostazione predefinita quando i pacchetti non corrispondono a nessuna delle regole della catena. È possibile visualizzare le regole create per ciascuna catena e la policy predefinita eseguendo il seguente comando:

# iptables -L

Le policy disponibili sono le seguenti:

  1. ACCEPT → permette il passaggio del pacchetto. Qualsiasi pacchetto che non corrisponde a nessuna regola nella catena è consentito nella rete.
  2. DROP → scarta silenziosamente il pacchetto. Qualsiasi pacchetto che non corrisponde a nessuna regola nella catena è impedito di entrare nella rete.
  3. REJECT → rifiuta il pacchetto e restituisce un messaggio informativo. Questo in particolare non funziona come policy predefinita. È piuttosto pensato per integrare le regole di filtraggio dei pacchetti.
Linux Iptables Policies

Quando si tratta di decidere quale policy implementare, è necessario considerare i pro e i contro di ciascun approccio come spiegato sopra – nota che non esiste una soluzione universale.

Aggiunta di regole

Per aggiungere una regola al firewall, invocare il comando iptables nel seguente modo:

# iptables -A chain_name criteria -j target

dove,

  1. -A sta per Append (aggiungi la regola corrente alla fine della catena).
  2. chain_name è INPUT, OUTPUT o FORWARD.
  3. Il target è l’azione o la politica da applicare in questo caso (ACCETTA, RIFIUTA o SCARTA).
  4. criteria è l’insieme di condizioni contro cui vengono esaminate i pacchetti. È composto di almeno una (molto probabilmente più) delle seguenti bandiere. Le opzioni tra parentesi quadre, separate da una barra verticale, sono equivalenti tra loro. Il resto rappresenta interruttori 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

Uniamo tutto questo in 3 esempi classici utilizzando l’ambiente di test seguente 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: Analisi della differenza tra le politiche DROP e REJECT

Definiremo prima una politica DROP per i ping in ingresso al nostro firewall. In altre parole, i pacchetti icmp verranno scartati silenziosamente.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

Prima di procedere con la parte REJECT, svuoteremo 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
Reject ICMP Ping Request in Firewall
ESEMPIO 2: Disabilitare / riabilitare i login ssh da dev2 a dev1

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

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
ESEMPIO 3: Consentire / impedire ai client NFS (da 192.168.0.0/24) di montare condivisioni NFS4

Eseguire i seguenti comandi nel server NFSv4 / firewall per chiudere le porte 2049 e 111 per ogni tipo 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
Block NFS Ports in Firewall

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
Open NFS Ports in Firewall

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 volessimo inserirle invece in una posizione predefinita, dovremmo utilizzare l’opzione -I (maiuscola i).

È necessario ricordare che le regole verranno valutate una dopo l’altra e che la valutazione si interrompe (o salta) quando viene trovata una corrispondenza con una politica DROP o ACCEPT. Per questo motivo, potresti trovarti nella necessità di spostare le regole su o giù nella lista delle catene, come richiesto.

Utilizzeremo un esempio banale per dimostrarlo:

Check Rules of Iptables Firewall

Posizioniamo la seguente regola,

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

alla posizione 2) nella catena di INPUT (spostando quindi la precedente #2 come #3)

Iptables Accept Rule

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

In alternativa, puoi eliminare una regola e cambiare il target 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
Iptables Drop Rule

Infine, ma non meno importante, devi ricordare che affinché le regole del firewall siano persistenti, dovrai salvarle in un file e poi ripristinarle automaticamente all’avvio (utilizzando il metodo preferito o quello disponibile per la tua distribuzione).

Salvataggio delle regole del firewall:

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

Ripristino delle regole:

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

Qui possiamo vedere una procedura simile (salvare e ripristinare le regole del firewall manualmente) utilizzando un file fittizio chiamato iptables.dump invece di quello predefinito come mostrato sopra.

# iptables-save > iptables.dump
Dump Linux Iptables

Per rendere persistenti queste modifiche tra i riavvii:

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

# apt-get install iptables-persistent

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

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: Elencare le porte consentite, i protocolli, gli indirizzi, e così via (separati da virgole) in /etc/sysconfig/SuSEfirewall2.

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

Conclusione

Gli esempi forniti in questo articolo, pur non coprendo tutti i dettagli di iptables, servono a illustrare come abilitare e disabilitare il traffico in entrata o in uscita.

Per coloro che sono appassionati di firewall, tenete presente che approfondiremo questo argomento con applicazioni più specifiche nella Parte 10 di questa serie LFCE.

Sentitevi liberi di farmi sapere se avete domande o commenti.

Source:
https://www.tecmint.com/configure-iptables-firewall/