Introduzione

Un firewall è un metodo per monitorare e filtrare il traffico di rete in entrata e in uscita. Funziona definendo un insieme di regole di sicurezza che determinano se consentire o bloccare il traffico specifico. Un firewall correttamente configurato è uno degli aspetti più importanti della sicurezza generale del sistema.

CentOS 8 viene fornito con un demone firewall denominato firewalld . È una soluzione completa con un'interfaccia D-Bus che consente di gestire dinamicamente il firewall del sistema.

In questo tutorial, parleremo di come configurare e gestire il firewall su CentOS 8. Spiegheremo anche i concetti di base di FirewallD.

Se il vostro intento è configurare e gestire il firewall su di un server in remoto continuate a leggere, altrimenti se volete configurare e gestire il firewall sul vostro computer locale saltate il primo paragrafo "Connessione al Server" e leggere il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Prerequisiti

Per configurare il servizio firewall, è necessario essere registrati come root o utente con privilegi sudo.

Concetti di base di Firewalld

firewalld utilizza i concetti di zone e servizi. In base alle zone e ai servizi che configurerai, puoi controllare quale traffico è consentito o bloccato da e verso il sistema.

Firewalld può essere configurato e gestito mediante l' utility della riga di comando firewall-cmd.

In CentOS 8, iptables è sostituito da nftables come backend predefinito del firewall per il demone firewalld.

Zone Firewalld

Le zone sono insiemi di regole predefiniti che specificano il livello di affidabilità delle reti a cui è collegato il computer. È possibile assegnare interfacce e fonti di rete a una zona.

Di seguito sono elencate le zone fornite da FirewallD ordinate in base al livello di attendibilità della zona da non attendibile a attendibile:

  • drop : tutte le connessioni in entrata vengono eliminate senza alcuna notifica. Sono consentite solo connessioni in uscita.
  • blocco : tutte le connessioni in entrata vengono rifiutate con un messaggio icmp-host-prohibited per IPv4e icmp6-adm-prohibited per IPv6n. Sono consentite solo connessioni in uscita.
  • pubblico : per l'uso in aree pubbliche non attendibili. Non ti fidi di altri computer sulla rete, ma puoi consentire connessioni in entrata selezionate.
  • esterno : per l'uso su reti esterne con mascheramento NAT abilitato quando il sistema funge da gateway o router. Sono consentite solo le connessioni in entrata selezionate.
  • interno : da utilizzare su reti interne quando il sistema funge da gateway o router. Altri sistemi sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • dmz : utilizzato per computer situati nella zona smilitarizzata che hanno accesso limitato al resto della rete. Sono consentite solo le connessioni in entrata selezionate.
  • lavoro : usato per macchine da lavoro. Altri computer sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • home : utilizzato per macchine domestiche. Altri computer sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • trusted : sono accettate tutte le connessioni di rete. Fidati di tutti i computer della rete.

Servizi firewall

I servizi Firewall sono regole predefinite che si applicano all'interno di una zona e definiscono le impostazioni necessarie per consentire il traffico in entrata per un servizio specifico. I servizi ti consentono di eseguire facilmente diverse attività in un solo passaggio.

Ad esempio, il servizio può contenere definizioni sull'apertura delle porte, l'inoltro del traffico e altro.

Firewalld Runtime e impostazioni permanenti

Firewalld utilizza due set di configurazione separati, runtime e configurazione permanente.

La configurazione di runtime è l'effettiva configurazione in esecuzione e non persiste al riavvio. All'avvio del daemon firewalld, carica la configurazione permanente, che diventa la configurazione di runtime.

Per impostazione predefinita, quando si apportano modifiche alla configurazione di Firewalld utilizzando l'utility firewall-cmd, le modifiche vengono applicate alla configurazione di runtime. Per rendere permanenti le modifiche aggiungere l'opzione --permanent al comando.

Per applicare le modifiche in entrambi i set di configurazione, è possibile utilizzare uno dei due metodi seguenti:

Cambia la configurazione di runtime e rendila permanente:

sudo firewall-cmd <options>
sudo firewall-cmd --runtime-to-permanent

Cambia la configurazione permanente e ricarica il demone firewalld:

sudo firewall-cmd --permanent <options>
sudo firewall-cmd --reload

Abilitazione di FirewallD

Su CentOS 8, firewalld è installato e abilitato per impostazione predefinita. Se per qualche motivo non è installato sul tuo sistema, puoi installare e avviare il demone digitando:

sudo dnf install firewalld
sudo systemctl enable firewalld --now

Puoi controllare lo stato del servizio firewall con:

sudo firewall-cmd --state

Se il firewall è abilitato, il comando dovrebbe stampare running. Altrimenti, vedrai not running.

Zone Firewalld

Se non è stato modificato, la zona predefinita è impostata su public e tutte le interfacce di rete sono assegnate a questa zona.

La zona predefinita è quella utilizzata per tutto ciò che non è esplicitamente assegnato a un'altra zona.

È possibile visualizzare la zona predefinita digitando:

sudo firewall-cmd --get-default-zone
public

Per ottenere un elenco di tutte le zone disponibili, digitare:

sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Per vedere le zone attive e le interfacce di rete loro assegnate:

sudo firewall-cmd --get-active-zones

L'output seguente mostra che le interfacce eth0 e eth1 sono assegnate alla zona public:

public
  interfaces: eth0 eth1

È possibile stampare le impostazioni di configurazione della zona con:

sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Dall'output sopra, possiamo vedere che la zona pubblica è attiva e utilizza la destinazione predefinita, che è REJECT. L'output mostra inoltre che la zona viene utilizzato dalle interfacce eth0e eth1 e permette il traffico dei client DHCP e SSH.

Se si desidera verificare le configurazioni di tutte le zone disponibili digitare:

sudo firewall-cmd --list-all-zones

Il comando stampa un elenco enorme  con le impostazioni di tutte le zone disponibili.

Modifica del target di zona

La destinazione definisce il comportamento predefinito della zona per il traffico in entrata non specificato. Può essere impostato su una delle seguenti opzioni: default, ACCEPT, REJECT, e DROP.

Per impostare il target della zona, specificare la zona con l'opzione --zone e il target con l'opzione --set-target.

Ad esempio, per modificare il target public della zona in modo da eseguire DROP:

sudo firewall-cmd --zone=public --permanent --set-target=DROP

Assegnare un'interfaccia a una zona diversa

È possibile creare serie specifiche di regole per zone diverse e assegnare loro interfacce diverse. Ciò è particolarmente utile quando si hanno più interfacce sul proprio computer.

Per assegnare un'interfaccia a una zona diversa, specificare la zona con l'opzione --zone e l'interfaccia con l'opzione --change-interface.

Ad esempio, il comando seguente assegna l'interfaccia eth1 alla zona work:

sudo firewall-cmd --zone=work --change-interface=eth1

Verifica le modifiche digitando:

sudo firewall-cmd --get-active-zones
work
  interfaces: eth1
public
  interfaces: eth0

Modifica della zona predefinita

Per modificare la zona predefinita, utilizzare l'opzione --set-default-zone seguita dal nome della zona che si desidera impostare come predefinita.

Ad esempio, per modificare la zona predefinita in home è necessario eseguire il comando seguente:

sudo firewall-cmd --set-default-zone=home

Verifica le modifiche con:

sudo firewall-cmd --get-default-zone
home

Creazione di nuove zone

Firewalld ti consente anche di creare le tue zone. Questo è utile quando si desidera creare regole per applicazione.

Nel seguente esempio creeremo una nuova zona denominata memcached, apriremo la porta 11211 e consentiremo l'accesso solo dall'indirizzo IP 192.168.100.30:

Crea la zona:

sudo firewall-cmd --new-zone=memcached --permanent

Aggiungi le regole alla zona:

sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanent
sudo firewall-cmd --zone=memcached --add-port=11211/tcp --permanent
sudo firewall-cmd --zone=memcached --add-source=192.168.100.30/32 --permanent

Ricarica il demone firewalld per attivare le modifiche:

sudo firewall-cmd --reload

Servizi Firewalld

Con firewalld è possibile consentire il traffico per porte e/o origini specifiche in base a regole predefinite chiamate servizi.

Per ottenere un elenco di tutti i servizi disponibili predefiniti digitare:

sudo firewall-cmd --get-services

Puoi trovare ulteriori informazioni su ciascun servizio aprendo il file .xml associato all'interno della directory /usr/lib/firewalld/services. Ad esempio, il servizio HTTP è definito in questo modo:

sudo vi /usr/lib/firewalld/services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>WWW (HTTP)</short>
  <description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
  <port protocol="tcp" port="80"/>
</service>

Per consentire il traffico HTTP in entrata (porta 80) per le interfacce nell'area pubblica, solo per la sessione corrente (configurazione runtime) digitare:

sudo firewall-cmd --zone=public --add-service=http

Se si sta modificando la zona predefinita, è possibile escludere l'opzione  --zone.

Per verificare che il servizio sia stato aggiunto correttamente, utilizzare l'opzione --list-services:

sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http

Per mantenere aperta la porta 80 dopo un riavvio, eseguire nuovamente lo stesso comando con l' opzione --permanent oppure eseguire:

sudo firewall-cmd --runtime-to-permanent

Utilizzare --list-services insieme all'opzione --permanent per verificare le modifiche:

sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http

La sintassi per la rimozione del servizio è la stessa di quando se ne aggiunge uno. Basta usare --remove-service al posto del flag --add-service:

sudo firewall-cmd --zone=public --remove-service=http --permanent

Il comando sopra rimuove il servizio http dalla configurazione permanente della zona pubblica.

Creazione di un nuovo servizio FirewallD

Come abbiamo già detto, i servizi predefiniti sono memorizzati nella directory /usr/lib/firewalld/services. Il modo più semplice per creare un nuovo servizio è copiare un file di servizio esistente nella directory /etc/firewalld/services, che è la posizione per i servizi creati dall'utente e modificare le impostazioni del file.

Ad esempio, per creare una definizione di servizio per Plex Media Server, è possibile utilizzare il file di servizio SSH:

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml

Aprire il file plexmediaserver.xml appena creato e modificare il nome breve e la descrizione per il servizio all'interno dei tag <short>e <description>. Il tag più importante che è necessario modificare è il tag port, che definisce il numero di porta e il protocollo che si desidera aprire.

Nel seguente esempio, stiamo aprendo le porte UDP 1900 e TCP 32400.

sudo vi /etc/firewalld/services/plexmediaserver.xml
<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>plexmediaserver</short>
<description>Plex is a streaming media server that brings all your video, music and photo collections together and stream them to your devices at anytime and from anywhere.</description>
<port protocol="udp" port="1900"/>
<port protocol="tcp" port="32400"/>
</service>

Salvare il file e ricaricare il servizio FirewallD:

sudo firewall-cmd --reload

Ora puoi utilizzare il servizio plexmediaserver nelle tue zone come qualsiasi altro servizio.

Apertura di porte e IP di origine

Firewalld consente inoltre di abilitare rapidamente tutto il traffico da un indirizzo IP affidabile o su una porta specifica senza creare una definizione di servizio.

Apertura di un IP di origine

Per consentire tutto il traffico in entrata da un indirizzo IP (o intervallo) specifico, specificare la zona con l'opzione --zone e l'IP di origine con l'opzione --add-source.

Ad esempio, per consentire tutto il traffico in entrata da 192.168.1.10 nella zona public, eseguire:

sudo firewall-cmd --zone=public --add-source=192.168.1.10

Rendi persistente la nuova regola:

sudo firewall-cmd --runtime-to-permanent

Verificare le modifiche utilizzando il seguente comando:

sudo firewall-cmd --zone=public --list-sources
192.168.1.10

La sintassi per la rimozione di un IP di origine è la stessa di quando ne si aggiunge uno. Basta usare --remove-source invece dell'opzione --add-source:

sudo firewall-cmd --zone=public --remove-source=192.168.1.10

Apertura di una porta di origine

Per consentire tutto il traffico in entrata su una determinata porta, specificare la zona con l'opzione --zone e la porta e il protocollo con l'opzione --add-port.

Ad esempio, per aprire la porta 8080 nell'area pubblica per la sessione corrente che hai eseguito:

sudo firewall-cmd --zone=public --add-port=8080/tcp

Il protocollo può essere sia tcp, udp, sctp, o dccp.

Verifica le modifiche:

sudo firewall-cmd --zone=public --list-ports
8080

Per mantenere la porta aperta dopo il riavvio, aggiungere la regola alle impostazioni permanenti eseguendo lo stesso comando utilizzando il flag --permanent o eseguendo:

sudo firewall-cmd --runtime-to-permanent

La sintassi per la rimozione di una porta è la stessa di quando si aggiunge una porta. Basta usare --remove-port invece dell'opzione --add-port.

sudo firewall-cmd --zone=public --remove-port=8080/tcp

Porte di inoltro

Per inoltrare il traffico da una porta a un'altra porta, abilitare innanzitutto il mascheramento per la zona desiderata utilizzando l'opzione --add-masquerade. Ad esempio, per abilitare il mascheramento per la zona external, digitare:

sudo firewall-cmd --zone=external --add-masquerade

Inoltrare il traffico da una porta all'altra sull'indirizzo IP

Nel seguente esempio stiamo inoltrando il traffico dalla porta 80 alla porta 8080 sullo stesso server:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080

Inoltrare il traffico a un altro indirizzo IP

Nel seguente esempio stiamo inoltrando il traffico dalla porta 80 alla porta 80 su un server con IP 10.10.10.2:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2

Inoltrare il traffico a un altro server su una porta diversa

Nel seguente esempio stiamo inoltrando il traffico dalla porta 80 alla porta 8080 su un server con IP 10.10.10.2:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2

Per rendere persistente la regola di inoltro, utilizzare:

sudo firewall-cmd --runtime-to-permanent

Conclusione

Hai imparato a configurare e gestire il servizio firewalld sul tuo sistema CentOS 8.

Assicurarsi di consentire tutte le connessioni in entrata necessarie per il corretto funzionamento del sistema, limitando al contempo tutte le connessioni non necessarie.