Un firewall con ufw e nftables
Modulo 5: Proteggere la rete · Tempo di lettura: 12 minuti
Obiettivo della lezione: Dopo questa lezione saprà configurare un firewall che lascia passare solo ciò che serve, per IPv4 e per IPv6, senza chiudersi fuori, e saprà da che cosa un firewall sul Suo server non La protegge.
Concetti chiave: filtro di pacchetti, netfilter, nftables, iptables-nft, ufw, policy predefinita, allow, deny, reject, limit, IPv6 in ufw, firewall del provider, firewalld, Docker e il firewall
Che cosa fa un firewall
Un firewall sul Suo server è un filtro di pacchetti: per ogni pacchetto di rete in arrivo consulta un elenco di regole e decide se può passare. In Linux questo filtro si trova nel kernel e si chiama netfilter. Lo si configura con un programma:
- nftables (comando
nft) è lo strumento attuale. Debian lo usa come predefinito da Debian 10. - iptables è lo strumento precedente. Sui sistemi moderni
iptablesè di solito una traduzione verso nftables (iptables-nft), in modo che le vecchie guide funzionino ancora. - ufw (Uncomplicated Firewall) è un semplice livello sovrapposto, presente di serie su Ubuntu e installabile con un solo comando su Debian. Per un singolo server ufw è la scelta più semplice. Questa lezione usa ufw e poi mostra come appaiono le stesse regole in nftables.
Un firewall è la Sua seconda linea di difesa. La prima è che i servizi siano in ascolto solo sull'indirizzo giusto (lezione 5.1). Insieme fanno sì che un errore in un livello non diventi subito una porta aperta.
Prima di tutto: come rientrare se qualcosa va storto?
L'errore classico: attiva il firewall, dimentica di consentire SSH e la connessione cade. A quel punto non può più accedere tramite SSH. Prima di iniziare:
- Sappia come aprire la console del Suo provider (lezione 1.2). Funziona al di fuori della rete, quindi anche se il firewall blocca tutto. Lì effettua l'accesso e digita
ufw disable. - Crei uno snapshot se ha dei dubbi.
- Tenga aperta la sessione SSH attuale e faccia la prova con una seconda sessione.
ufw in cinque passaggi
Passaggio 1: installare e scegliere la policy predefinita.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'La policy predefinita vale per tutto ciò per cui non esiste una regola. "Deny incoming" significa: tutto ciò che arriva è vietato, tranne ciò che consentirà in seguito. È l'unica base sicura. Il traffico in uscita (il Suo server che scarica gli aggiornamenti) lo consente.
Passaggio 2: consentire SSH, prima di attivare il firewall.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH è un profilo applicativo che ufw conosce (corrisponde alla porta 22/tcp). Se SSH gira su un'altra porta, usi il numero: sudo ufw allow 2222/tcp. Noti "Rules updated (v6)": ufw crea la regola anche per IPv6. Lo fa perché in /etc/default/ufw è presente la riga IPV6=yes, che è l'impostazione predefinita. Lo verifichi: se è impostata su no, il Suo firewall vale solo per IPv4.
Passaggio 3: ciò che Le serve in più.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # solo se usa HTTP/3Può limitare una regola a un solo indirizzo di origine, ad esempio una porta di amministrazione accessibile solo dal Suo ufficio:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpPassaggio 4: attivare.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupPassaggio 5: verificare. Apra una seconda finestra ed effettui di nuovo l'accesso. Se funziona, SSH è configurato correttamente. Poi controlli le regole:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Per rimuovere una regola si usano i numeri: sudo ufw status numbered e poi sudo ufw delete 3.
deny, reject e limit
- deny scarta il pacchetto in silenzio: dall'esterno si vede "filtrata" (lezione 5.1).
- reject rimanda indietro un rifiuto: dall'esterno si vede "chiusa". È più corretto per i Suoi servizi, ma rivela che c'è un server.
- limit consente una connessione, ma blocca un indirizzo che tenta di connettersi sei o più volte entro 30 secondi. Utile per SSH:
sudo ufw limit OpenSSHinvece diallow. È un metodo grossolano (conta le connessioni, non gli accessi falliti); fail2ban (lezione 5.3) è più preciso.
Le stesse regole in nftables
Dietro le quinte ufw scrive regole netfilter. Se vuole lavorare senza ufw, scrive Lei stesso un file nftables. Su Debian si trova in /etc/nftables.conf e lo si carica con il servizio nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Lo legga così. La tabella si chiama filter ed è della famiglia inet: un'unica tabella per IPv4 e IPv6 insieme, così non può dimenticare IPv6. Nella catena input la policy è drop. Poi: le risposte a connessioni già esistenti possono rientrare (established,related), tutto ciò che passa sul loopback è consentito, ICMP è consentito (necessario tra l'altro per IPv6 e per i messaggi di errore sulla dimensione dei pacchetti) e le porte 22, 80 e 443 sono consentite.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # verificare senza caricare
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetUsi o ufw o un proprio file nftables, non entrambi: scrivono nello stesso netfilter e le loro regole possono ostacolarsi a vicenda.
Da che cosa il firewall non La protegge
- Servizi che consente Lei stesso. La porta 443 è aperta per il Suo sito web; una falla nel sito è quindi raggiungibile normalmente. Il firewall protegge solo le porte chiuse.
- Docker. Quando pubblica una porta con Docker (
-p 5432:5432), Docker imposta proprie regole netfilter che deviano il traffico prima che si applichino le regole di ufw. La documentazione di Docker dice testualmente che Docker e ufw non vanno d'accordo. Una porta di un container può quindi essere aperta dall'esterno mentreufw statusnon la mostra. La soluzione (pubblicare su127.0.0.1) la vedrà nella lezione 9.3. - Traffico in uscita. Con "allow outgoing" un programma compromesso può collegarsi ovunque. Per la maggior parte dei piccoli server è una scelta accettabile; gli ambienti più rigorosi limitano anche il traffico in uscita.
Il firewall del Suo provider
Molti provider offrono anche un firewall nella rete, davanti al Suo server, che si configura nel pannello clienti (a volte chiamato "cloud firewall" o "security group"). È un ottimo livello aggiuntivo e funziona anche se sul server stesso commette un errore. Ma non sostituisce il firewall sul server: se sposta il server o cambia provider, non La segue, e non tutti i provider lo offrono. Mantenga quindi sempre un firewall sul server stesso.
Su AlmaLinux e Rocky Linux
Lì firewalld è attivo di serie, con le zone. I comandi principali:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadSenza --permanent una modifica vale solo fino al riavvio successivo; con --permanent vale solo dopo --reload. SSH è già aperto nella zona predefinita.
In pratica
Se si chiude comunque fuori da un VPS di WebOké, apra la console nella schermata del VPS, effettui l'accesso e disattivi il firewall (ufw disable) oppure annulli l'ultima regola. Presso altri provider questo accesso di emergenza si chiama anch'esso console, VNC o rescue. Sappia dove si trova quel pulsante prima di averne bisogno.
Riepilogo
- Un firewall è il Suo secondo livello dopo "restare in ascolto solo dove serve"; nftables è lo strumento del kernel, ufw un semplice livello sovrapposto.
- Inizi con
default deny incoming, consenta SSH prima diufw enable, faccia la prova con una seconda sessione e conosca la console del Suo provider. - Verifichi che ufw copra anche IPv6 (
IPV6=yes); in nftables la famigliainetlo fa in un colpo solo. denydall'esterno risulta "filtrata",rejectrisulta "chiusa";limitfrena le connessioni ripetute.- Le porte Docker aggirano ufw (lezione 9.3); il firewall del Suo provider è un livello aggiuntivo, non un sostituto.
Quiz
Esercizio
Esercizio O5.2: Configurare il Suo firewall. Attivi sul Suo server un firewall con ufw (oppure nftables, o firewalld su AlmaLinux/Rocky): per impostazione predefinita tutto chiuso in entrata, SSH e ciò di cui ha davvero bisogno. Faccia la prova con una seconda sessione, verifichi che IPv6 sia coperto e controlli dall'esterno con nc che una porta non consentita risulti chiusa o filtrata. Compili la checklist e incolli il Suo ufw status verbose (o nft list ruleset); per ogni porta aperta indichi a che cosa serve.
Esercizio O5.2: Configurare il Suo firewall
Questo esercizio lo svolge da sé; nessuno lo verifica. Spunti ciò che ha fatto e segni l'esercizio come completato.
Per un server web solo 22 (o la Sua porta SSH), 80 e 443, per IPv4 e IPv6. Porte di amministrazione solo da un indirizzo fisso o tramite un tunnel SSH. Tramite la console: ufw disable (oppure svuotare le regole nftables).
Le Sue spunte e note restano solo in questo browser; non le inviamo da nessuna parte. Se ha effettuato l'accesso, conserviamo in I miei corsi solo il fatto che ha svolto l'esercizio.
Per approfondire
- Proteggere il suo VPS: i primi cinque minuti
- Nessun accesso alla sua VPS: cosa fare?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Documentazione di Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Documentazione di Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
