Come configurare e gestire il firewall su CentOS 8

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 configurato correttamente è uno degli aspetti più importanti della sicurezza generale del sistema.

CentOS 8 viene fornito con un demone firewall chiamato firewalld. Si tratta di una soluzione completa con un’interfaccia D-Bus che consente di gestire il firewall del sistema in modo dinamico.

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

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 configurati, è possibile controllare il traffico consentito o bloccato da e verso il sistema.

Firewalld può essere configurato e gestito utilizzando l’utilità da riga di comando firewall-cmd.

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

Zone Firewalld #

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

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

  • goccia: Tutte le connessioni in entrata vengono eliminate senza alcuna notifica. Sono consentite solo le connessioni in uscita.
  • blocco: tutte le connessioni in entrata vengono rifiutate con un messaggio icmp-host-prohibited per IPv4 e icmp6-adm-prohibited per IPv6n. Sono consentite solo le 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’utilizzo su reti esterne con NAT masquerading abilitato quando il sistema agisce come gateway o router. Sono consentite solo le connessioni in entrata selezionate.
  • interno: Per l’utilizzo su reti interne quando il sistema funge da gateway o router. Altri sistemi sulla rete sono generalmente attendibili. Sono consentite solo le connessioni in entrata selezionate.
  • dmz: utilizzato per i computer situati nella zona demilitarizzata che hanno accesso limitato al resto della rete. Sono consentite solo le connessioni in entrata selezionate.
  • lavoro: Utilizzato per macchine da lavoro. Altri computer sulla rete sono generalmente attendibili. Sono consentite solo le connessioni in entrata selezionate.
  • home: usato per macchine domestiche. Altri computer sulla rete sono generalmente attendibili. Sono consentite solo le connessioni in entrata selezionate.
  • attendibile: tutte le connessioni di rete sono accettate. Fidati di tutti i computer della rete.

Servizi firewall #

I servizi Firewalld 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 consentono di eseguire facilmente diverse attività in un unico passaggio.

Ad esempio, il servizio può contenere definizioni relative all’apertura delle porte, all’inoltro del traffico e altro ancora.

Runtime Firewalld e impostazioni permanenti #

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

La configurazione di runtime è la configurazione in esecuzione effettiva e non persiste al riavvio. Quando il demone firewalld viene avviato, carica la configurazione permanente, che diventa la configurazione di runtime.

Per impostazione predefinita, quando si apportano modifiche alla configurazione Firewalld utilizzando l’utilità 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:

  1. Modificare la configurazione di runtime e renderlo permanente:

    sudo firewall-cmd <options>sudo firewall-cmd --runtime-to-permanent
  2. il Cambiamento permanente di configurazione e ricaricare il firewalld demone:

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

Abilitazione FirewallD #

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

sudo dnf install firewalldsudo systemctl enable firewalld --now

È possibile controllare lo stato del servizio firewall con:

sudo firewall-cmd --state

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

Zone Firewalld #

Se non l’hai modificata, 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.

Puoi vedere 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 a loro assegnati:

sudo firewall-cmd --get-active-zones

L’output mostra che le interfacce eth0 e eth1 sono assegnati al public zona:

public interfaces: eth0 eth1

È possibile stampare le impostazioni di configurazione area 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:

l’output di sopra, possiamo vedere che il pubblico la zona è attiva e utilizza il target di default, che è REJECT. L’output mostra anche che la zona è utilizzata dalle interfacce eth0 e eth1 e consente il traffico DHCP client e SSH.

Se si desidera controllare 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 della destinazione della 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 la destinazione della zona, specificare la zona con l’opzione --zone e la destinazione con l’opzione --set-target.

Ad esempio, per modificare l’obiettivo della zona public in DROP, eseguire:

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

Assegnazione di un’interfaccia a una zona diversa #

È possibile creare set specifici di regole per zone diverse e assegnare loro interfacce diverse. Ciò è particolarmente utile quando si utilizzano più interfacce sulla macchina.

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 seguente comando 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: eth1public 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 rendere predefinita.

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

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

Verificare le modifiche con:

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

Creazione di nuove zone #

Firewalld consente inoltre di creare le proprie zone. Questo è utile quando si desidera creare regole per applicazione.

Nel seguente esempio creeremo una nuova zona denominata memcached, aprire la porta 11211 e consentire l’accesso solo dal 192.168.100.30 indirizzo IP:

  1. Creare la zona:

    sudo firewall-cmd --new-zone=memcached --permanent
  2. Aggiungere le regole per la zona:

    sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanentsudo firewall-cmd --zone=memcached --add-port=11211/tcp --permanentsudo firewall-cmd --zone=memcached --add-source=192.168.100.30/32 --permanent
  3. Ricaricare il firewalld demone per attivare le modifiche:

    sudo firewall-cmd --reload

Firewalld Servizi #

Con firewalld è possibile consentire il traffico delle porte specifiche e/o fonti sulla base di regole predefinite detti servizi.

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

sudo firewall-cmd --get-services

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

/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 il tipo di sessione corrente (configurazione di runtime) :

sudo firewall-cmd --zone=public --add-service=http
Se si modifica la zona predefinita, è possibile escludere l’opzione --zone.

Per verificare che il servizio è stato aggiunto con successo utilizzare il --list-services opzione:

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

Per mantenere la porta 80 aperta e dopo un riavvio, eseguire il comando stesso, ancora una volta, con la --permanent opzione, o eseguire:

sudo firewall-cmd --runtime-to-permanent

Utilizzare i --list-services con il --permanent opzione per verificare le modifiche apportate:

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

La sintassi per la rimozione di un servizio è la stessa di quando l’aggiunta di uno. Basta usare --remove-service invece del flag --add-service :

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

Il comando precedente 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 del 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 del servizio all’interno dei tag <short> e <description>. Il tag più importante da modificare è il tag port, che definisce il numero di porta e il protocollo che si desidera aprire.

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

/etc/firewalld/servizi / 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 è possibile utilizzare il servizio plexmediaserver nelle proprie 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 attendibile 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 uno specifico indirizzo IP (o intervallo), 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

Rendere la nuova regola persistente:

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 rimuovere un IP di origine è la stessa di quando 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 nella zona pubblica per la sessione corrente, eseguire:

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

Il protocollo può essere tcp, udp, sctp, oppure dccp.

Verifica le modifiche:

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

Per mantenere la porta aperta dopo un 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 rimuovere 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

Forwarding Ports #

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

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

Inoltra il traffico da una porta all’altra l’indirizzo IP #

Nell’esempio riportato di seguito ci sono inoltrare il traffico dalla porta 80 porta 8080 sullo stesso server:

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

Inoltrare il traffico verso un altro indirizzo IP #

Nell’esempio riportato di seguito ci sono inoltrare il traffico dalla porta 80 porta 80 su un server con indirizzo 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 verso un altro server su una porta diversa #

Nell’esempio riportato di seguito ci sono inoltrare il traffico dalla porta 80 porta 8080 su un server con indirizzo 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 come 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 tutte le connessioni non necessarie.



+