Che cos'è il firewall ferm basato su Linux iptables e come configurarlo?

In Linuxbasati su sistemi operativi, il firewall per eccellenza che usi è iptables, però è anche possibile che usi nftables, che è l'evoluzione di iptables, molto più efficiente e con una sintassi molto più “umana”, però non tutto il mondo usa ancora nftables. Oggi spiegheremo come configurare un firewall su server Linux utilizzando Ferm (For Easy Rule Making), un frontend di iptables che ci permetterà di aggiungere regole al firewall molto facilmente, rapidamente e semplicemente, senza dover imparare la sintassi di iptables.

Che cos'è il firewall Ferm e a cosa serve?

Che cos'è il firewall ferm basato su iptables di Linux?

Ferm (For Easy Rule Making) è un frontend di iptables, questo significa che, sotto, sta effettivamente usando iptables per consentire o negare il traffico, ma ci permette di configurare il firewall in modo molto avanzato senza dover imparare la sintassi di iptables o creare script diversi usando iptables, ma lo faremo direttamente con Ferm. Questo strumento è in grado di leggere le regole da un file di configurazione che andremo a definire, e successivamente “chiamerà” iptables per aggiungere le diverse regole una per una, inserendole in tempo reale nel kernel.

L'obiettivo di Ferm è fornire agli amministratori di sistema e di rete un modo semplice per leggere e scrivere tutte le regole del firewall, riducendo il compito di dover scrivere una regola dopo l'altra, in modo da poter dedicare più tempo allo sviluppo e all'ottimizzazione delle regole, per renderle come efficiente possibile. Ferm utilizza un linguaggio di configurazione molto semplice ma abbastanza avanzato, possiamo usare variabili, funzioni, array e persino blocchi. Un'altra opzione molto interessante di Ferm è che ci permetterà di includere altri file di configurazione in una directory e si occuperà di importare e applicare automaticamente tutte queste regole.

Ferm è ancora un frontend iptables, quindi, quando utilizzeremo questo strumento, saremo sempre in grado di modificare e configurare direttamente il firewall utilizzando i comandi iptables. Infatti, Ferm è in grado di importare le attuali regole di iptables e di inserirle automaticamente nel file di configurazione, per modificarle o espanderle successivamente.

Uno dei frontend di iptables più popolari è ufw, ampiamente utilizzato dagli amministratori di sistema e di rete per configurare facilmente e rapidamente i propri firewall.

Installazione e messa in servizio di Ferm

L'installazione di Ferm è davvero semplice, è attualmente presente nella maggior parte dei repository delle diverse distribuzioni basate su Linux, nel nostro caso abbiamo utilizzato l'ultima versione di Debian per eseguire tutti i test che ti insegneremo. Per installare questo programma, che è un frontend iptables, dobbiamo eseguire il seguente comando:

sudo apt install ferm

Una volta eseguito questo comando, dovremmo vedere qualcosa del genere, dove ci verranno mostrati i pacchetti aggiuntivi che dobbiamo installare, in pratica dobbiamo installare Perl per poter eseguire correttamente questo programma.

Il programma di installazione di Ferm ci dirà che caricherà le regole del firewall durante l'avvio dal percorso /etc/ferm/ferm.conf, cioè, tutto in questo file verrà automaticamente passato a iptables per consentire o negare il traffico di rete. La configurazione predefinita di questo firewall ci consente di accedere da remoto tramite SSH tramite la porta 22, se non hai configurato SSH su questa porta, dovrai modificare i valori predefiniti e fare clic su "no" in modo che non si avvii , altrimenti perderai la connettività.

Una volta scelto sì o no, apt terminerà l'installazione di tutti i pacchetti aggiuntivi di cui abbiamo bisogno per far funzionare questo programma.

Una volta installato, possiamo andare in /etc/ferm/path e vedremo sia il file di configurazione chiamato ferm.conf, sia una directory chiamata ferm.d dove possiamo incorporare i nostri file di configurazione di ferm per importarli, questo permette noi abbiamo una maggiore modularità.

Ferm viene già fornito di default con un elenco di regole che possiamo rimuovere in qualsiasi momento, ma questo ci aiuterà a gestire la sintassi di questo frontend iptables, quindi sarà molto utile. Se osserviamo la sintassi, vedremo che è simile a nftables, ma è basato su iptables.

Nella schermata seguente puoi vedere come vengono dichiarati i domini in cui verrà configurato (iptables o ip6tables), le tabelle e le catene, nonché le regole che abbiamo all'interno delle diverse catene.

Possiamo anche vedere che abbiamo diverse regole per impostazione predefinita:

  • Nella catena INPUT la policy è DROP, il traffico localhost è consentito, il traffico ICMP e la connessione è consentita tramite IPsec e anche tramite SSH con le porte di default. Per quanto riguarda lo stato delle connessioni, le connessioni non valide vengono DROP, e quelle stabilite e relative sono consentite, ma non sono consentite le nuove, se non quelle specificatamente definite.

Nella catena OUTPUT è definito che la policy è accettare tutto, e lo stato della connessione consente quelle stabilite e relative. Nella catena FORWARD, il traffico viene negato dal criterio, le connessioni non valide vengono bloccate in modo specifico ma le connessioni stabilite e correlate sono consentite.

Successivamente, puoi vedere questo file di configurazione in formato testo:

# -*- shell-script -*-
#
# Configuration file for ferm(1).
#
domain (ip ip6) {
table filter {
chain INPUT {
policy DROP;

# monitoraggio della connessione
stato mod stato INVALID DROP;
stato mod stato (STABILITO CORRELATO) ACCEPT;

# consenti pacchetto locale
interfaccia cosa ACCETTO;

# rispondi al ping
proto icmp ACCETTO;

# consenti IPsec
proto udp dport 500 ACCETTO;
@if @eq ($ DOMINIO, ip) {
proto (in particolare ah) ACCETTA;
} @altro {
proto (esp) ACCETTA;
}

# consenti connessioni SSH
proto tcp dport ssh ACCETTO;
}
uscita catena {
politica ACCETTA;

# monitoraggio della connessione
#mod stato stato INVALID DROP;
stato mod stato (STABILITO CORRELATO) ACCEPT;
}
catena AVANTI {
politica GOCCIA;

# monitoraggio della connessione
stato mod stato INVALID DROP;
stato mod stato (STABILITO CORRELATO) ACCEPT;
}
}
}

@include ferm.d/;

La parte più interessante è il “@include ferm.d /” che abbiamo nella parte finale, questo significa che importerà tutti i file di configurazione che abbiamo in quella directory in questione.

Questo firewall Ferm di seguito utilizza iptables, quindi, se eseguiamo il seguente comando:

iptables -L

Possiamo vedere lo stato attuale di iptables con tutte le regole che ha incorporato nel firewall:

Dopo aver visto la configurazione predefinita di Ferm, vedremo diversi esempi di configurazione che possiamo fare.

Configurazione di base di Ferm

La sintassi di Ferm è molto semplice e flessibile, ma dobbiamo impararla per fare una configurazione corretta. Ti consigliamo accedi al manuale ufficiale di Ferm dove troverai tutti i dettagli sulla sintassi da utilizzare e su come devono essere dichiarate le diverse regole nel file di configurazione, grazie a questo manuale ufficiale possiamo configurare questo firewall senza molti problemi.

La prima cosa da tenere a mente è che tutte le regole di Ferm iniziano e finiscono con parentesi graffe e le regole terminano con un punto e virgola, quindi è una sintassi ben nota nella programmazione. Altre caratteristiche interessanti sono che le interruzioni di riga vengono ignorate e puoi inserire commenti ovunque inserendo "#" alla fine della riga.

Per quanto riguarda la sintassi di iptables e ferm, abbiamo alcune differenze:

  • Per definire l'interfaccia di input: interfaccia (se)
  • Per definire l'interfaccia di uscita: outerface (of)
  • Per definire un'origine: saddr
  • Per definire una destinazione: daddr
  • Per definire un protocollo: proto
  • Porto di origine: sportivo
  • Porto di destinazione: dport
  • Carica un modulo: mod
  • Passa a una regola personalizzata: salta

In Ferm non ci sono comandi come -A, -I, -C, -R o -D, poiché tutto è scritto in un file di configurazione, lo stesso accade con i comandi per aggiungere una nuova stringa, rinominarla o eliminarla, ora qui scompare del tutto. Altre caratteristiche sono che ferm consente di ereditare regole diverse da utilizzare all'interno di altre regole, annidandosi nel file di configurazione.

Una volta che sappiamo approssimativamente com'è la sintassi, vedremo alcuni esempi di confronto con iptables, in tutti lavoreremo sulla tabella «filter» nella catena «INPUT».

iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp -j ACCEPT

In definitiva questo verrebbe scritto come segue (aggiungendo la policy della catena OUTPUT e FORWARD dalla tabella dei filtri):

domain ip {
table filter {
chain INPUT {
policy DROP;
proto tcp ACCEPT;
}
chain OUTPUT {
policy ACCEPT;
}
chain FORWARD {
policy DROP;
}
}
}

Ferm ci permette di definire le stesse regole in INPUT e OUTPUT in modo facile e veloce, senza la necessità di ripetere le regole più e più volte. Ad esempio, immaginiamo di voler accettare ora il protocollo TCP sia nella catena INPUT che nella catena OUTPUT, questo in iptables sarebbe il seguente:

iptables -A INPUT -p tcp -j ACCEPT
iptables -A OUTPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A OUTPUT -p udp -j ACCEPT

Con Ferm è semplice come fare quanto segue:

domain ip {
table filter {
chain (INPUT OUTPUT) {
proto (udp tcp) ACCEPT;
}
}

Come puoi vedere, è molto più veloce e più facile applicare questa stessa regola sia all'INPUT che all'OUTPUT.

Questo firewall incorpora anche funzioni molto interessanti, ad esempio possiamo controllare se una variabile o una funzione è definita, possiamo controllare se due valori sono uguali o diversi, negare un valore booleano, risolvere domini direttamente da Ferm, concatenare parametri e un lungo elenco delle funzioni.

Ferm permette anche di “caricare” i moduli iptables per utilizzarli, e configurare il firewall in maniera avanzata, ad esempio abbiamo quanto segue:

mod connlimit connlimit-above 4 connlimit-mask 24 REJECT;

Che possiamo inserire nell'intero file di configurazione.

Per applicare le regole introdotte in Ferm, dovremo eseguire il seguente comando:

ferm -i -t 10 /etc/ferm/ferm.conf

Importa le regole di iptables in Ferm

Ferm ci permette di importare facilmente e velocemente le regole iptables che abbiamo attualmente in esecuzione, in un file Ferm per successive modifiche. Per poterlo fare, dovremo semplicemente caricare in memoria le regole iptables (attualmente in uso) ed eseguire questo comando:

import-ferm > /etc/ferm/ferm.d/reglas-iptables.conf

Quando lo eseguiamo, possiamo vedere le regole di iptables direttamente nella sintassi di Ferm.

Se vuoi trasformare le regole iptables che hai in un file di testo in Ferm, puoi eseguire il seguente comando:

import-ferm origen de las reglas de iptables > /etc/ferm/ferm.d/reglas-iptables.conf

Come hai visto, ferm è un ottimo frontend iptables che ci permetterà di configurarlo in modo avanzato, senza dover imparare la sintassi di iptables e organizzare correttamente le regole in un file di configurazione. Tuttavia, a nostro avviso, riteniamo che configurare correttamente uno script bash con tutte le regole di iptables non richieda alcun frontend o software aggiuntivo, sebbene possa essere utile per alcune persone. Dobbiamo ricordare che Nftables incorpora già la possibilità di configurare le regole direttamente in un file di configurazione, e non solo in modo interattivo tramite comandi da console.