Firewall UFW: Comandi e Regole di Base

Introduzione UFW (Uncomplicated FireWall, tradotto firewall non complicato) è uno strumento di configurazione del firewall che lavora su iptables, già incluso in tutte le distribuzioni di Ubuntu. UFW fornisce un’interfaccia […]

Avatar di GB Factory
GB Factory 18 Febbraio 2022

Introduzione

UFW (Uncomplicated FireWall, tradotto firewall non complicato) è uno strumento di configurazione del firewall che lavora su iptables, già incluso in tutte le distribuzioni di Ubuntu. UFW fornisce un'interfaccia semplice per una configurazione di base del firewall tramite riga di comando.

In questo tutorial vedremo come

Controllare lo Stato di UFW

Per controllare se ufw è abilitato, puoi eseguire il comando:

sudo ufw status
Status: inactive

L'output del comando indicherà se il firewall è attivo oppure no.

Abilitare UFW

Se l'output del comando ufw status è Status: inactive, significa che il firewall non è ancora stato abilitato sul sistema e per abilitarlo dovremo eseguire un comando.

Attenzione: quando andiamo ad abilitare UFW, verrà bloccato l'accesso esterno a tutte le porte del server. In pratica questo significa che se siamo connessi al server tramite SSH e abilitiamo UFW prima di consentire l'accesso alla porta SSH, verremo disconnessi. Quindi assicurati di consentire il traffico sulla porta dell'SSH prima di abilitare il firewall.

Per abilitare il firewall UFW sul tuo server esegui:

sudo ufw enable

L'output del comando dovrebbe essere così:

Firewall is active and enabled on system startup

Per vedere cosa è attualmente bloccato o consentito, possiamo utilizzare il parametro verbose mentre eseguiamo il comando ufw status, in questo modo:

sudo ufw status
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

Disabilitare UFW

Se vuoi disabilitare UFW, puoi farlo eseguendo il seguente comando:

sudo ufw disable

Tieni presente che questo comando disabilita completamente il servizio del firewall sul tuo server, rendendo inattiva tutta la configurazione.

Bloccare un Indirizzo IP con UFW

Per bloccare tutte le connessioni di rete che hanno come origine un determinato indirizzo IP, possiamo eseguire il seguente comando, avendo cura di sostituire l'indirizzo IP di esempio con l'indirizzo che desideriamo bloccare:

sudo ufw deny from 80.210.132.173
Rule added

In questo esempio, con from 80.210.132.173, specifichiamo come indirizzo IP di origine 80.210.132.173.

Se ora proviamo ad eseguire sufo ufw stauts, vedremo nella lista l'indirizzo IP che abbiamo appena aggiunto come bloccato (deny).

Status: active

To                         Action      From
--                         ------      ----
Anywhere                   DENY        80.210.132.173       

Tutte le connessioni, in ingresso o in uscita, sono bloccate per l'indirizzo IP specificato.

Bloccare una Sottorete con UFW

Nel caso volessimo bloccare un'intera sottorete, possiamo utilizzare l'indirizzo della sottorete come parametro from sul comando ufw deny. Questo esempio bloccherebbe tutti gli indirizzi IP all'interno della sottorete 192.168.5.0/24:

sudo ufw deny from 149.0.123.0/24
Rule added

Bloccare le Connessioni in un'Interfaccia di Rete con UFW

Per bloccare le connessioni in entrata da un determinato indirizzo IP in una determinata interfaccia di rete, possiamo utilizzare il seguente comando, sostituendo l'indirizzo IP e il nome della scheda di rete con quelli che si applicano nel nostro caso:

sudo ufw deny in on eth0 from 203.0.113.100
Rule added

Il parametro in indica a ufw di applicare la regola solamente per le connessioni in ingresso, e il parametro on eth0 specifica che la regola deve essere applicata solamente per l'interfaccia eth0. Questo può rivelarsi utile per in un sistema con più interfacce di rete (incluse quelle virtuali) e si desidera bloccare l'accesso dall'esterno ad alcune di queste interfacce, ma non solo.

Consentire il traffico da un Indirizzo IP

Per consentire tutte le connessioni che hanno origine da un Indirizzo IP specifico, è possibile utilizzare il seguente comando, sostituendo l'indirizzo IP di esempio con l'IP da cui vuoi consentire il traffico:

sudo ufw allow from 142.250.184.67
Rule added

Se ora provi ad eseguire sudo ufw status, vedrai un output simile a quello riportato di seguito, con la dicitura ALLOW vicino all'Indirizzo IP appena aggiunto:

Status: active

To                         Action      From
--                         ------      ----
...          
Anywhere                   ALLOW       142.250.184.67

Possiamo consentire anche le connessioni da un'intera sottorete fornendo inserendo la sottomaschera di rete corrispondente per un host, per esempio 142.250.184.0/24.

Consentire le Connessioni in Ingresso in un'Interfaccia di Rete

Per consentire le connessioni in ingresso da un Indirizzo IP specifico verso un'interfaccia di rete specifica, possiamo eseguire il seguente comando, sostituendo l'indirizzo IP di esempio e il nome dell'interfaccia con i dati rappresentanti la situazione reale:

sudo ufw allow in on eth0 from 142.250.184.67
Rule added

Il parametro in serve a far applicare la regola solamente per le connessioni in ingresso, e il parametro on eth0 specifica l'interfaccia di rete su cui applicare la regola.

Se proviamo ad eseguire il comando sudo ufw status vedremo un output simile al seguente:

Status: active

To                         Action      From
--                         ------      ----
...         
Anywhere on eth0           ALLOW       142.250.184.67

Eliminare una Regola UFW

Per eliminare una regola impostata precedentemente con UFW è possibile utilizzare il comando ufw delete seguito dalla regola (allow o deny) e con il target. Nel seguente esempio andiamo a cancellare una regola precedentemente impostata per consentire tutto il traffico dall'Indirizzo IP 142.250.184.67:

sudo ufw delete allow from 142.250.184.67
Rule deleted

Un altro sistema per specificare la regola che si desidera cancellare è utilizzando l'ID della regola. Questa informazione può essere ottenuta con il seguente comando:

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   DENY IN     142.250.184.67
[ 2] Anywhere on eth0           ALLOW IN    184.265.82.67

Dall'outout notiamo che sono presenti due regole attualmente attive. La prima regola blocca tutte le connessioni provenienti dall'Indirizzo IP 142.250.184.67 e la seconda regola consente tutte le connessioni sull'interfaccia eth0 in arrivo dall'Indirizzo IP 184.265.82.67.

Dato che di default UFW blocca già tutte le connessioni esterne in ingresso se non deliberatamente consentite, la prima regola è ridondante e può essere rimossa. Per rimuovere una regola con il suo ID possiamo usare:

sudo ufw delete 1

Ci verrà chiesto di confermare l'operazione e se siamo sicuri che l'ID fornito si riferisca effettivamente alla regola corretta che vogliamo cancellare:

Deleting:
 deny from 142.250.184.67
Proceed with operation (y|n)? y
Rule deleted

Elencando nuovamente le regole con sudo ufw status, vedremo che la regola appena rimossa non sarà più presente.

Elencare i Profili delle Applicazioni Disponibili

Alla loro installazione, le applicazioni che utilizzano la rete andranno a creare un profilo UFW che possiamo utilizzare per consentire le connessioni da Indirizzi IP esterni. Spesso questo equivale al comando ufw allow from, con il vantaggio di avere una scorciatoia con una maggiore astrazione dei numeri di porta utilizzati dai vari servizi e che mette a disposizione dell'utente una semplice nomenclatura per identificare i servizi.

Per elencare i profili attualmente disponibili possiamo utilizzare:

sudo ufw app list

Nel caso avessimo installato un servizio come un web server o qualsiasi altra cosa dipendesse dalla rete per il suo funzionamento ma un profilo UFW non sia stato creato, assicuriamoci che il servizio sia abilitato. Per i server remoti, tipicamente abbiamo già un profilo OpenSSH disponibile:

Available applications:
  OpenSSH

Abilitare i Profili UFW delle Applicazioni

Per abilitare il profilo UFW dell'applicazione possiamo eseguire ufw allow seguito dal nome del profilo dell'applicazione che si desidera abilitare, che è possibile ottenere con il comando sudo ufw app list. Nell'esempio seguente, stiamo abilitando il profilo OpenSSH, che consentirà tutte le connessioni SSH in entrata sulla porta SSH predefinita.

sudo ufw allow “OpenSSH”
Rule added
Rule added (v6)

Ricordati di mettere sempre tra virgolette i nomi dei profili composti da più parole, come "Nginx HTTP".

Disabilitare i Profili UFW delle Applicazioni

Per disabilitare un profilo di un'applicazione che avevi precedentemente abilitato in UFW, dovrai rimuovere la regola corrispondente. Ad esempio, considera il seguente output da sudo ufw status:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                               
Nginx Full                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)                   
Nginx Full (v6)            ALLOW       Anywhere (v6)        

Questo output indica che il profilo dell'applicazione Nginx Full è attualmente abilitato, consentendo tutte le connessioni al server Web sia tramite HTTP che tramite HTTPS. Se desideri consentire solo le richieste HTTPS da e verso il tuo server web, devi prima abilitare la regola più restrittiva, che in questo caso sarebbe Nginx HTTPS, e poi disabilitare la regola Nginx Full attualmente attiva:

sudo ufw allow "Nginx HTTPS"
sudo ufw delete allow "Nginx Full"

Ricorda che puoi elencare tutti i profili dell'applicazione disponibili con sudo ufw app list.

Consentire le Connessioni SSH con UFW

Quando lavori con server remoti, è necessario essere sicuri che la porta SSH sia aperta alle connessioni in modo da poter accedere al tuo server da remoto.

Il seguente comando abiliterà il profilo UFW dell'applicazione OpenSSH e consentirà tutte le connessioni alla porta SSH predefinita sul server:

sudo ufw allow OpenSSH
Rule added
Rule added (v6)

Sebbene sia meno intuitiva da utilizzare, una sintassi alternativa consiste nello specificare il numero di porta esatto del servizio SSH, che in genere è la porta 22:

sudo ufw allow 22
Rule added
Rule added (v6)

Consentire le Connessioni SSH da un Indirizzo IP specifico

Per consentire le connessioni in entrata da un indirizzo IP specifico o da una particolare sottorete, è necessario includere un parametro from per specificare l'origine della connessione. Questo richiederà di specificare anche l'indirizzo di destinazione con un parametro to. Per limitare questa regola solo ad SSH, puoi utilizzare il parametro proto per far agire la regola solo sul protocollo tcp, e poi utilizzare port per impostare la porta su 22, ovvero la porta predefinita di SSH.

Con il comando seguente consentiremo solo le connessioni SSH provenienti dall'indirizzo IP 203.0.113.103:

sudo ufw allow from 203.0.113.103 proto tcp to any port 22
Rule added

Con il parametro from puoi anche utilizzare un indirizzo di sottorete come per consentire le connessioni SSH in entrata da un'intera rete:

sudo ufw allow from 203.0.113.0/24 proto tcp to any port 22
Rule added

Consentire il traffico Rsync con UFW

Il programma Rsync, che lavora sulla porta 873, può essere utilizzato per trasferire file da un computer all'altro.

Per consentire le connessioni rsync in entrata da un indirizzo IP o da una sottorete, utilizzare il fromparametro per specificare l'indirizzo IP di origine e il portparametro per impostare la porta di destinazione 873. Il comando seguente consentirà solo le connessioni Rsync provenienti dall'indirizzo IP 203.0.113.103:

sudo ufw allow from 203.0.113.103 to any port 873
Rule added

Per consentire all'intera 203.0.113.0/24sottorete di accedere rsyncal tuo server, esegui:

sudo ufw allow from 203.0.113.0/24 to any port 873
Rule added

Consentire il traffico Nginx HTTP/HTTPS

Al momento dell'installazione, il server web Nginx crea vari profili UFW all'interno del server. Dopo aver installato e abilitato Nginx come servizio, possiamo eseguire il seguente comando per identificare quali profili sono disponibili:

sudo ufw app list | grep Nginx
  Nginx Full
  Nginx HTTP
  Nginx HTTPS

Per abilitare sia il traffico HTTP che HTTPS, scegliamo Nginx Full. In caso contrario, possiamo utilizzare Nginx HTTP per consentire solo il traffico HTTP o Nginx HTTPS per consentire solamente traffico HTTPS.

Il comando seguente consentirà sia il traffico HTTP che HTTPS sul server (porte 80443):

sudo ufw allow "Nginx Full"
Rule added
Rule added (v6)

Consentire il traffico Apache HTTP/HTTPS

Al momento dell'installazione, il server web Apache crea vari profili UFW diversi all'interno del server. Dopo aver installato e abilitato Apache come servizio, possiamo eseguire il seguente comando per identificare quali profili sono disponibili:

sudo ufw app list | grep Apache
  Apache
  Apache Full
  Apache Secure

Per abilitare sia il traffico HTTP che HTTPS, scegliamo Apache Full. Altrimenti, scegliamo Apache per HTTP o Apache Secure per HTTPS.

Il comando seguente consentirà sia il traffico HTTP che HTTPS sul server (porte 80443):

sudo ufw allow "Apache Full"
Rule added
Rule added (v6)

Consentire il traffico HTTP sulla Porta 80

I server web, come Apache e Nginx, in genere ascoltano le richieste HTTP sulla porta 80. Se la tua policy predefinita per il traffico in entrata è impostata su drop on deny, dovrai creare una regola UFW per consentire l'accesso esterno sulla porta 80. È possibile utilizzare il numero di porta o il nome del servizio (http) come parametro per questo comando.

Per consentire tutte le connessioni HTTP in entrata sulla porta 80, possiamo utilizzare:

sudo ufw allow http
Rule added
Rule added (v6)

Una sintassi alternativa consiste nello specificare il numero di porta del servizio HTTP:

sudo ufw allow 80
Rule added
Rule added (v6)

Consentire il traffico HTTPS sulla Porta 443

I server web, come Apache e Nginx, in genere ascoltano le richieste HTTP sulla porta 443. Se la tua policy predefinita per il traffico in entrata è impostata su drop on deny, dovrai creare una regola UFW per consentire l'accesso esterno sulla porta 443. È possibile utilizzare il numero di porta o il nome del servizio (https) come parametro per questo comando.

Per consentire tutte le connessioni HTTPS in entrata sulla porta 443, possiamo utilizzare:

sudo ufw allow https
Rule added
Rule added (v6)

Una sintassi alternativa consiste nello specificare il numero di porta del servizio HTTPS:

sudo ufw allow 443
Rule added
Rule added (v6)

Consentire il traffico HTTP e HTTPS in entrata

Se desideri consentire sia il traffico HTTP che HTTPS, puoi creare un'unica regola che consenta l'accesso esterno a entrambe le porte. Questo utilizzo richiede di specificare anche il protocollo utilizzato con il parametro proto, che in questo caso deve essere impostato su tcp.

Per consentire tutte le connessioni HTTP e HTTPS (porte 80443) in entrata, possiamo eseguire il comando:

sudo ufw allow proto tcp from any to any port 80,443
Rule added
Rule added (v6)

Consentire le connessioni esterne a MySQL

MySQL ascolta le connessioni dei client sulla porta 3306. Se il tuo server di database MySQL viene utilizzato da un client su un server remoto, dovrai creare una regola UFW per consentire tali accessi.

Per consentire le connessioni MySQL in entrata da un indirizzo IP o una sottorete specifici, possiamo utilizzare il parametro from per specificare l'indirizzo IP di origine e il parametro port per indicare la porta di destinazione, nel caso di MySQL la porta predefinita è la 3306.

Il comando seguente consentirà all'indirizzo IP 203.0.113.103di connettersi alla porta MySQL del server:

sudo ufw allow from 203.0.113.103 to any port 3306
Rule added

Per consentire all'intera sottorete 203.0.113.0/24 di connettersi al server MySQL, possiamo eseguire:

sudo ufw allow from 203.0.113.0/24 to any port 3306
Rule added

Consentire le connessioni esterne a PostgreSQL

PostgreSQL ascolta le connessioni dei client sulla porta 5432. Se il tuo server di database PostgreSQL viene utilizzato da un client su un server remoto, dobbiamo consentire quel traffico.

Per consentire le connessioni PostgreSQL in entrata da un indirizzo IP o una sottorete specifica, dobbiamo specificare l'origine con il parametro from e impostare la porta su 5432 con il seguente comando:

sudo ufw allow from 203.0.113.103 to any port 5432
Rule added

Per consentire all'intera sottorete 203.0.113.0/24 di connettersi al tuo server PostgreSQL, esegui:

sudo ufw allow from 203.0.113.0/24 to any port 5432
Rule added

Bloccare la posta SMTP in uscita

I server di posta, come Sendmail e Postfix, utilizzano in genere la porta 25 per il traffico SMTP. Se il tuo server non dovrebbe inviare posta in uscita, potresti voler bloccare quel tipo di traffico. Per bloccare le connessioni SMTP in uscita, possiamo eseguire:

sudo ufw deny out 25
Rule added
Rule added (v6)

Questo configura il firewall per eliminare tutto il traffico in uscita sulla porta 25. Se devi rifiutare le connessioni in uscita su un numero di porta diverso, puoi ripetere questo comando e sostituirlo 25 con il numero di porta che vuoi bloccare.

Conclusione

UFW è uno strumento molto potente che può aumentare notevolmente la sicurezza dei tuoi server se configurato correttamente. Questa guida di riferimento copre alcune regole UFW molto comuni che vengono spesso utilizzate per configurare un firewall su Ubuntu.

La maggior parte dei comandi in questa guida può essere adattata a diversi scenari d'uso, modificando parametri come l'indirizzo IP di origine e/o la porta di destinazione. Per informazioni più dettagliate sui parametri e modificare disponibili per i vari comandi, è possibile utilizzare il comando man per consultare il manuale di UFW:

man ufw

La pagina ufficiale di UFW sulla documentazione di Ubuntu è un'altra risorsa che puoi utilizzare come riferimento per casi d'uso ed esempi più avanzati.