Configurazione del firewall con Firewalld

In questo capitolo vengono descritti i concetti, gli strumenti e i metodi per la configurazione del firewall con strumenti basati su firewalld. Fornisce inoltre esempi per la visualizzazione delle impostazioni del firewall che applicano la sicurezza di rete su un sistema.

Strumenti di configurazione firewalld

È possibile configurare il firewall utilizzando uno degli strumenti riportati di seguito.

  • Utilizzando il comando firewall-cmd e le relative diverse opzioni.

  • Utilizzando la GUI di configurazione del firewall

    Per utilizzare questo strumento, è necessario prima installare il pacchetto firewall-config, quindi avviarlo utilizzando lo stesso comando del nome del pacchetto, ad esempio:

    sudo dnf install firewall-config
    sudo firewall-config &
    Il comando apre lo strumento di configurazione, come illustrato nella figura riportata di seguito.
    La figura mostra la GUI di configurazione del firewall.
  • Cockpit è uno strumento di configurazione basato su browser che può essere utilizzato anche per eseguire configurazioni firewall. Vedere Oracle Linux: Using the Cockpit Web Console.

Controllo del servizio firewalld

In Oracle Linux, il servizio firewall, firewalld, è abilitato per impostazione predefinita. Il servizio è controllato dal comando systemctl.

Per avviare il servizio, procedere come segue.

sudo systemctl unmask firewalld
sudo systemctl start firewalld

Per accertarsi che il servizio venga avviato automaticamente all'avvio del sistema, eseguire il comando seguente dopo aver avviato il firewall:

sudo systemctl enable firewalld

Per arrestare il servizio firewall e impedirne l'avvio automatico all'avvio del sistema, eseguire il comando seguente:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Per impedire l'avvio del servizio firewall da parte di altri servizi o tramite l'interfaccia D-Bus firewalld, eseguire il comando seguente dopo aver disabilitato il firewall:

sudo systemctl mask firewalld

Per visualizzare lo stato corrente del servizio firewall:

sudo systemctl status firewalld

Procedere nel modo seguente:

  • Per Oracle Linux 8, l'output dello stato è simile a:

    firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2022-04-20 18:33:59 BST; 2 weeks 5 days ago
         Docs: man:firewalld(1)
     Main PID: 4261 (firewalld)
        Tasks: 3 (limit: 99538)
       Memory: 4.7M
       CGroup: /system.slice/firewalld.service
               └─4261 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
  • Per Oracle Linux 9, l'output dello stato è simile a:

    firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2022-05-05 08:41:36 GMT; 5 days ago
           Docs: man:firewalld(1)
       Main PID: 1155 (firewalld)
          Tasks: 4 (limit: 93659)
         Memory: 32.5M
            CPU: 1.438s
         CGroup: /system.slice/firewalld.service
            └─1155 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
  • Per Oracle Linux 10, l'output dello stato è simile a:

    firewalld.service - firewalld - dynamic firewall daemon
          Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
          Active: active (running) since Thu 2025-01-04 08:41:36 GMT; 5 days ago
            Docs: man:firewalld(1)
        Main PID: 1155 (firewalld)
           Tasks: 4 (limit: 93659)
          Memory: 32.5M
             CPU: 1.438s
          CGroup: /system.slice/firewalld.service
             └─1155 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Informazioni su zone e servizi

La sicurezza del firewall viene implementata attraverso i concetti di zone e servizi.

Le zone sono set predefiniti di regole di filtro che corrispondono ai livelli di attendibilità per l'accesso alla rete. È possibile aggiungere alle regole di filtro predefinite di una zona riconfigurando le impostazioni della zona e quindi perfezionando il controllo della zona sul flusso di traffico. Quando si installa Oracle Linux, al sistema viene assegnata automaticamente una zona predefinita denominata public.

Le regole del firewall vengono applicate tramite i servizi assegnati a una zona. Le porte di servizio sono i punti di accesso del traffico di rete. I servizi assegnati a una zona dispongono automaticamente delle porte aperte per ricevere e inviare pacchetti di rete.

Per ulteriori informazioni sulle zone e sui servizi correlati al firewall, vedere le pagine del manuale firewalld.zone(5) e firewalld.service(5).

Visualizzazione delle informazioni sulle zone

Quando si configura il firewall per le zone, è consigliabile visualizzare le impostazioni correnti di zona e servizio e altre informazioni nell'ambito dei passi di configurazione. Con questo approccio è possibile monitorare le modifiche che si stanno introducendo al firewall e identificare potenziali errori che renderebbero le modifiche non valide.

Per visualizzare la zona predefinita del sistema, eseguire il comando seguente:

firewall-cmd --get-default

Visualizzare tutte le zone predefinite incluse nell'installazione come indicato di seguito.

firewall-cmd --get-zones

Procedere nel modo seguente:

  • Per Oracle Linux 8, l'output è:

    block dmz drop external home internal public trusted work
  • Per Oracle Linux 9 e Oracle Linux 10, l'output è:

    block dmz drop external home internal nm-shared public trusted work

È possibile configurare qualsiasi zona dell'elenco. Quando si modificano le impostazioni di una determinata zona, questa diventa una zona attiva. Per identificare la zona attiva, digitare quanto segue:

firewall-cmd --get-active-zone
Nota

Per impostazione predefinita, tutte le configurazioni vengono implementate nella zona predefinita. Si noti inoltre che una zona attiva non è necessariamente la zona predefinita. È pertanto necessario specificare il nome della zona nel comando per definire le impostazioni per la zona specifica. In caso contrario, le definizioni vengono applicate alla zona predefinita.

Visualizzazione delle impostazioni della zona

Per ottenere le impostazioni di una zona:

sudo firewall-cmd --list-all [--zone=zonename]

Senza specificare una zona, il comando visualizza le impostazioni della zona predefinita. Pertanto, per elencare le impostazioni della zona work, è necessario utilizzare il comando seguente;

sudo firewall-cmd --list-all --zone=work
work
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Configurazione delle zone firewall

I task riportati di seguito descrivono come utilizzare il comando firewall-cmd per configurare le regole del firewall per una zona. Le regole vengono quindi registrate nella struttura gerarchica /etc/firewalld per firewalld.

Configurare il firewall significa impostare tutte o alcune delle impostazioni di una zona su valori specifici per consentire al firewall di controllare il traffico di rete in base alle specifiche.

Controllo dell'accesso ai servizi

L'impostazione di services di una zona è il modo predefinito per configurare il firewall. A ogni zona sono assegnati servizi predefiniti. Per configurare ulteriormente questa impostazione, aggiungere servizi alla zona o rimuovere servizi dalla zona.

Per elencare i servizi predefiniti, utilizzare il comando firewall-cmd --list-services.

Ad esempio, il comando seguente mostra che alla zona work sono assegnati i servizi cockpit, dhcpv6-client e ssh:

sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh

Per aprire l'accesso a un nuovo servizio, utilizzare l'opzione --add-service service. Facoltativamente, includere l'opzione --permanent per rendere la regola persistente tra i vari reboot.

Ad esempio, per aggiungere i servizi HTTP e NFS alla zona work, è necessario utilizzare il comando seguente:

sudo firewall-cmd --permanent --zone=work --add-service=http --add-service=nfs
sudo firewall-cmd --list-services --zone=work
cockpit dhcpv6-client ssh http nfs

Per rimuovere l'accesso a un servizio, utilizzare l'opzione --remove-service service:

sudo firewall-cmd --permanent --zone=work --remove-service=cockpit
sudo firewall-cmd --list-services --zone=work 
dhcpv6-client ssh http nfs

Controllo dell'accesso alle porte

Il traffico di rete attraverso i servizi della zona utilizza le porte di tali servizi. Le porte devono essere aperte per accettare il traffico. È possibile aprire più porte per l'accesso alla rete specificando il numero di porta e il protocollo associato.

L'opzione --list-ports elenca le porte e i protocolli associati a cui è stato consentito l'accesso in modo esplicito. Tuttavia, le porte che sono state aperte come servizio non sono incluse nell'output di questo comando. Pertanto, quando si elencano le porte, è consigliabile utilizzare l'opzione --list-all per ottenere informazioni più complete.

Utilizzare l'opzione --add-port per consentire l'accesso a porte specifiche. È necessario specificare le porte nel formato port-number/port-type. I tipi di porta possono essere tcp, udp, sctp o dccp. Assicurarsi che il tipo e il traffico di rete corrispondano, ad esempio:

sudo firewall-cmd --permanent --zone=work --add-port=5353/udp --add-port=3689/tcp
sudo firewall-cmd --list-all --zone=work 
work
  target: default
  icmp-clock-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh http nfs 
  ports: 5353/udp 3689/tcp
...

Analogamente, l'opzione --remove-port rimuove l'accesso a una porta. Ricordarsi di utilizzare l'opzione --permanent per rendere persistente la modifica.

Per ulteriori informazioni, vedere la pagina del manuale firewall-cmd(1).

Assegnazione di un'interfaccia di rete a una zona

L'interfaccia di rete di un sistema viene assegnata automaticamente alla zona predefinita. In Oracle Linux è possibile configurare più zone con servizi, porte e così via specifici. È quindi possibile attivare le regole di una zona specifica per diventare operative assegnando l'interfaccia a tale zona. Pertanto, è possibile modificare facilmente le regole del firewall attive nel sistema riassegnando l'interfaccia di rete.

Si supponga di voler attivare la configurazione firewall della zona work. Assegnare l'interfaccia alla zona come indicato di seguito.

sudo firewall-cmd --zone=work --change-interface=enp0s1
firewall-cmd --get-active-zone
work
  interfaces: enp0s1
Nota

Non è necessario utilizzare l'opzione --permanent per rendere l'impostazione persistente tra i reboot. Se si imposta la zona come predefinita, come descritto in Modifica della zona predefinita, la riassegnazione dell'interfaccia diventa permanente.

Modifica della zona predefinita

È possibile modificare la zona predefinita del sistema come indicato di seguito.

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

È inoltre possibile verificare che le modifiche siano state applicate:

firewall-cmd --get-default-zone

Per visualizzare i risultati completi e finali della configurazione:

sudo firewall-cmd --zone=work --list-all
work (active)
  target: default
  interfaces:  enp0s1
  sources:
  services: dhcpv6-client ssh http nfs
  ports: 5353/udp 3689/tcp
...

Impostazione di una regola predefinita per il controllo del traffico in entrata

L'impostazione target stabilisce il comportamento predefinito del firewall durante la gestione del traffico in entrata. Questa impostazione viene configurata in modo automatico su default per tutte le zone predefinite. Per modificare il comportamento predefinito di una zona, utilizzare il comando seguente;

sudo firewall-cmd --zone=zone-name --set-target=ACCEPT|REJECT|DROP

È possibile specificare le opzioni riportate di seguito.

  • ACCEPT accetta tutto il traffico in entrata, ad eccezione di quelli impostati per essere rifiutati in un'altra regola.

  • REJECT blocca tutto il traffico in entrata ad eccezione di quelli consentiti in un'altra regola. Il computer di origine viene informato del rifiuto.

  • DROP è simile a REJECT, ma non viene inviato alcun avviso di rifiuto al computer di origine.

Gestione del traffico in entrata in base alle origini

È possibile gestire il traffico in entrata in una zona in base all'origine del traffico. Le due seguenti impostazioni di zona consentono di specificare l'origine dei pacchetti:

  • source identifica il nodo o la rete di invio.

  • source-ports identifica la porta da cui proviene il traffico.

Per accettare il traffico in entrata da un nodo di invio, utilizzare il comando seguente:

sudo firewall-cmd --zone=zone-name --add-source=IP-address                  

Si noti che l'indirizzo IP può includere la maschera di rete nella notazione CIDR, ad esempio 192.0.2.0/24.

Eseguire il comando seguente per trasformare il set di regole di runtime corrente in un set di regole permanente:

sudo firewall-cmd --runtime-to-permanent

Omettere questo comando se si sta impostando una configurazione temporanea eliminata se il sistema viene riavviato.

Per impostare l'impostazione source-port viene utilizzata la seguente sintassi simile:

sudo firewall-cmd --zone=<zone-name> --add-source-port=<portid>/<protocol>
Nel precedente, <zone-name> è il nome della zona, <portid> è il numero di porta e <protocol> è uno dei tipi di protocollo seguenti:
  • tcp
  • udp
  • sctp
  • dccp

È possibile combinare impostazioni diverse per configurare il firewall. La zona trusted può essere configurata per accettare il traffico HTTP dall'origine di rete 192.0.2.0, come mostrato nell'esempio riportato di seguito.

sudo firewall-cmd --zone=trusted --add-source=192.0.2.0/24
sudo firewall-cmd --zone=trusted --add-service=http
sudo firewall-cmd --zone=trusted --list-all
trusted (active)
  target: ACCEPT
  sources: 192.0.2.0/24
  services: http

Creazione di zone personalizzate

È possibile creare zone e quindi configurare le impostazioni della zona per una protezione firewall personalizzata.

Uso del comando firewall-cmd

Come mostrato nell'esempio riportato di seguito, è possibile utilizzare l'interfaccia CLI firewall-cmd per creare una zona vuota. Ciò significa che non vengono assegnati servizi predefiniti. Quando si configura una zona personalizzata, è necessario includere sempre l'opzione --permanent nel comando. Altrimenti, viene generato un messaggio d'errore.

sudo firewall-cmd --permanent --new-zone=testzone
sudo firewall-cmd --permanent --get-zones

Procedere nel modo seguente:

  • Per Oracle Linux 8, l'output è:

    block dmz drop external home internal testzone public trusted work
  • Per Oracle Linux 9 e Oracle Linux 10, l'output è:

    block dmz drop external home internal nm-shared public testzone trusted work
sudo firewall-cmd --permanent --info-zone=testzone
testzone
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Senza l'opzione --permanent, l'opzione --get-zones non visualizza la zona creata.

L'opzione --info-zone=zone-name genera lo stesso output dell'opzione --list-all.

Per rendere persistente la creazione di questa zona, aggiungere il comando seguente:

sudo firewall-cmd --runtime-to-permanent

Dopo aver creato la zona, è possibile aggiungere servizi, porte, assegnare interfacce e così via utilizzando le opzioni di comando fornite negli esempi precedenti:

sudo firewall-cmd --zone=testzone --add-service=http
Error: INVALID ZONE: testzone
sudo firewall-cmd --permanent --zone=testzone --add-service=http

Assicurarsi di utilizzare l'opzione --permanent quando si utilizzano questi comandi.

Uso di un file di configurazione delle zone

Tutte le zone dispongono di file di configurazione corrispondenti. Per le zone predefinite installate con il sistema operativo, i file di configurazione si trovano nella directory /usr/lib/firewalld/zones.

Quando si configura una zona predefinita, il file di configurazione viene copiato nella directory /etc/firewalld/zones e le modifiche vengono memorizzate in tale posizione. Se si utilizza un file di configurazione per creare nuove zone, è necessario utilizzare anche /etc/firewalld/zones come directory di lavoro.

Se si sta creando una zona con solo piccole differenze rispetto alle impostazioni delle zone predefinite, la copia di un file di configurazione esistente nella directory di lavoro è l'approccio più semplice. È possibile utilizzare uno qualsiasi dei comandi riportati di seguito.

sudo cp /etc/firewalld/zones/existing-conf-file.xml new-zone.xml
sudo cp /usr/lib/firewalld/zones/existing-conf-file.xml /etc/firewalld/zones/new-zone.xml

Quindi, utilizzando un editor di testo, rivedere le impostazioni nel nuovo file di configurazione. L'esempio seguente mostra il contenuto del file di configurazione di testzone. testzone accetta il traffico per un servizio (SSH) e un intervallo di porte per i protocolli TCP e UDP.

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>testzone</short>
  <description>Put description here</description>
    <service name="ssh"/>
    <port port="1025-65535" protocol="tcp"/>
    <port port="1025-65535" protocol="udp"/>
</zone>