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 root@IP_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 nome_utente@IP_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 nome_utente@IP_DEL_SERVER -p PORTA
Prerequisiti
Per configurare il servizio firewall, è necessario essere registrati come root o utente con privilegi sudo e avere il Firewall installato su CentOS 8.
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
perIPv4
eicmp6-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
Abilitare 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 eth0
e 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.