Questo articolo è tratto dal mio libro, Linux in Action, e da un secondo progetto Manning che deve ancora essere rilasciato.
Il firewall
Un firewall è un insieme di regole. Quando un pacchetto di dati entra o esce da uno spazio di rete protetto, il suo contenuto (in particolare, le informazioni sulla sua origine, destinazione e il protocollo che intende utilizzare) viene testato rispetto alle regole del firewall per vedere se dovrebbe essere consentito l'accesso. Ecco un semplice esempio:
Da un lato, iptables è uno strumento per la gestione delle regole del firewall su una macchina Linux.
D'altra parte, firewalld è anche uno strumento per la gestione delle regole del firewall su una macchina Linux.
Hai un problema con quello? E ti rovinerebbe la giornata se ti dicessi che c'è un altro strumento là fuori, chiamato nftables?
OK, ammetto che l'intera faccenda ha un odore un po' strano, quindi lascia che ti spieghi. Tutto inizia con Netfilter, che controlla l'accesso da e verso lo stack di rete a livello di modulo del kernel Linux. Per decenni, il principale strumento da riga di comando per la gestione degli hook di Netfilter è stato il set di regole iptables.
Il terminale Linux
- I 7 migliori emulatori di terminale per Linux
- 10 strumenti da riga di comando per l'analisi dei dati in Linux
- Scarica ora:cheat sheet SSH
- Cheat sheet sui comandi avanzati di Linux
- Esercitazioni sulla riga di comando di Linux
Poiché la sintassi necessaria per invocare quelle regole potrebbe sembrare un po' arcana, varie implementazioni user-friendly come ufw e firewalld sono state introdotte come interpreti Netfilter di livello superiore. Ufw e firewalld, tuttavia, sono progettati principalmente per risolvere i tipi di problemi affrontati dai computer autonomi. La creazione di soluzioni di rete di dimensioni standard spesso richiederà la potenza extra di iptables o, dal 2014, la sua sostituzione, nftables (tramite lo strumento da riga di comando nft).
iptables non è andato da nessuna parte ed è ancora ampiamente utilizzato. In effetti, dovresti aspettarti di imbatterti in reti protette da iptables nel tuo lavoro come amministratore per molti anni a venire. Ma nftables, aggiungendosi al classico set di strumenti Netfilter, ha portato alcune importanti nuove funzionalità.
Da qui in poi, mostrerò con un esempio come firewalld e iptables risolvono semplici problemi di connettività.
Configura l'accesso HTTP utilizzando firewalld
Come avrai intuito dal nome, firewalld fa parte della famiglia systemd. Firewalld può essere installato su macchine Debian/Ubuntu, ma è presente per impostazione predefinita su Red Hat e CentOS. Se hai un server web come Apache in esecuzione sulla tua macchina, puoi confermare che il firewall funziona navigando nella root web del tuo server. Se il sito è irraggiungibile, allora firewalld sta facendo il suo lavoro.
Utilizzerai firewall-cmd
strumento per gestire le impostazioni del firewall dalla riga di comando. Aggiunta del –state
argomento restituisce lo stato corrente del firewall:
# firewall-cmd --state
running
Per impostazione predefinita, firewalld sarà attivo e rifiuterà tutto il traffico in entrata con un paio di eccezioni, come SSH. Ciò significa che il tuo sito Web non riceverà troppi visitatori, il che ti farà sicuramente risparmiare molti costi di trasferimento dei dati. Poiché probabilmente non è quello che avevi in mente per il tuo server web, ti consigliamo di aprire le porte HTTP e HTTPS che per convenzione sono designate rispettivamente come 80 e 443. firewalld offre due modi per farlo. Uno è attraverso il –add-port
argomento che fa riferimento al numero di porta direttamente insieme al protocollo di rete che utilizzerà (TCP in questo caso). Il –permanent
argomento dice a firewalld di caricare questa regola ogni volta che il server si avvia:
# firewall-cmd --permanent --add-port=80/tcp
# firewall-cmd --permanent --add-port=443/tcp
Il –reload
argomento applicherà queste regole alla sessione corrente:
# firewall-cmd --reload
Sei curioso di sapere le impostazioni attuali del tuo firewall? Esegui –list-services
:
# firewall-cmd --list-services
dhcpv6-client http https ssh
Supponendo che tu abbia aggiunto l'accesso al browser come descritto in precedenza, le porte HTTP, HTTPS e SSH dovrebbero ora essere tutte aperte, insieme a dhcpv6-client
, che consente a Linux di richiedere un indirizzo IP IPv6 da un server DHCP locale.
Configura un chiosco clienti bloccato utilizzando iptables
Sono sicuro che hai visto i chioschi:sono tablet, touchscreen e PC simili a bancomat in una scatola che aeroporti, biblioteche e aziende lasciano in giro, invitando clienti e passanti a sfogliare i contenuti. Il problema della maggior parte dei chioschi è che di solito non vuoi che gli utenti si sentano a casa e li trattino come i propri dispositivi. In genere non sono pensati per navigare, visualizzare video di YouTube o lanciare attacchi denial-of-service contro il Pentagono. Quindi, per assicurarti che non vengano utilizzati in modo improprio, devi bloccarli.
Un modo è applicare una sorta di modalità kiosk, sia attraverso l'uso intelligente di un display manager Linux che a livello di browser. Ma per assicurarti di aver tappato tutti i buchi, probabilmente vorrai anche aggiungere alcuni controlli di rete rigida tramite un firewall. Nella sezione seguente, descriverò come lo farei usando iptables.
Ci sono due cose importanti da ricordare sull'uso di iptables:l'ordine che dai alle tue regole è fondamentale e, da sole, le regole di iptables non sopravviveranno a un riavvio. Mi rivolgerò a quelli qui uno alla volta.
Il progetto del chiosco
Per illustrare tutto questo, immaginiamo di lavorare per un negozio che fa parte di una catena più grande chiamata BigMart. Sono in circolazione da decenni; infatti, i nostri nonni immaginari probabilmente sono cresciuti facendo shopping lì. Ma al giorno d'oggi, i ragazzi della sede centrale di BigMart probabilmente stanno solo contando le ore prima che Amazon li faccia cadere per sempre.
Tuttavia, il reparto IT di BigMart sta facendo del suo meglio e ti hanno appena inviato alcuni dispositivi per chioschi predisposti per il Wi-Fi che dovresti installare in posizioni strategiche del tuo negozio. L'idea è che visualizzeranno un browser web connesso alle pagine dei prodotti BigMart.com, consentendo loro di cercare le caratteristiche della merce, la posizione del corridoio e i livelli delle scorte. I chioschi dovranno anche accedere a bigmart-data.com, dove sono archiviate molte delle immagini e dei media video.
Oltre a questi, ti consigliamo di consentire gli aggiornamenti e, se necessario, i download di pacchetti. Infine, ti consigliamo di consentire l'accesso SSH in entrata solo dalla tua workstation locale e bloccare tutti gli altri. La figura seguente illustra come funzionerà il tutto:
Il copione
Ecco come si adatterà tutto a uno script Bash:
#!/bin/bash
iptables -A OUTPUT -p tcp -d bigmart.com -j ACCEPT
iptables -A OUTPUT -p tcp -d bigmart-data.com -j ACCEPT
iptables -A OUTPUT -p tcp -d ubuntu.com -j ACCEPT
iptables -A OUTPUT -p tcp -d ca.archive.ubuntu.com -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j DROP
iptables -A OUTPUT -p tcp --dport 443 -j DROP
iptables -A INPUT -p tcp -s 10.0.3.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
L'anatomia di base delle nostre regole inizia con -A
, dicendo a iptables che vogliamo aggiungere la seguente regola. OUTPUT
significa che questa regola dovrebbe entrare a far parte della catena OUTPUT. -p
indica che questa regola si applicherà solo ai pacchetti che utilizzano il protocollo TCP, dove, come -d
ci dice, la destinazione è bigmart.com. Il -j
flag punta a ACCEPT
come l'azione da intraprendere quando un pacchetto corrisponde alla regola. In questa prima regola, tale azione consiste nel consentire, o accettare, la richiesta. Ma più in basso, puoi vedere le richieste che verranno eliminate o rifiutate.
Ricorda che l'ordine è importante. E questo perché iptables eseguirà una richiesta oltre ciascuna delle sue regole, ma solo fino a quando non ottiene una corrispondenza. Quindi una richiesta del browser in uscita per, ad esempio, youtube.com supererà le prime quattro regole, ma quando arriva a –dport 80
o –dport 443
regola, a seconda che si tratti di una richiesta HTTP o HTTPS, verrà eliminata. iptables non si preoccuperà più di controllare perché era una corrispondenza.
D'altra parte, una richiesta di sistema a ubuntu.com per un aggiornamento del software verrà eseguita quando raggiunge la regola appropriata. Quello che stiamo facendo qui, ovviamente, è consentire richieste HTTP o HTTPS in uscita solo alle nostre destinazioni BigMart o Ubuntu e nessun altro.
Le ultime due regole tratteranno le richieste SSH in arrivo. Non saranno già stati negati dalle due precedenti regole di rilascio poiché non utilizzano le porte 80 o 443, ma 22. In questo caso, le richieste di accesso dalla mia workstation verranno accettate ma le richieste da qualsiasi altra parte verranno eliminate. Questo è importante:assicurati che l'indirizzo IP che usi per la regola della porta 22 corrisponda all'indirizzo della macchina che stai utilizzando per accedere, se non lo fai, verrai immediatamente bloccato. Non è un grosso problema, ovviamente, perché nel modo in cui è attualmente configurato, puoi semplicemente riavviare il server e le regole di iptables verranno tutte eliminate. Se stai utilizzando un container LXC come server e accedi dal tuo host LXC, utilizza l'indirizzo IP utilizzato dal tuo host per connettersi al container, non il suo indirizzo pubblico.
Dovrai ricordarti di aggiornare questa regola se l'IP della mia macchina cambia mai; in caso contrario, sarai bloccato.
Giocare a casa (si spera su una macchina virtuale usa e getta di qualche tipo)? Grande. Crea il tuo script. Ora posso salvare lo script, usare chmod
per renderlo eseguibile ed eseguirlo come sudo
. Non preoccuparti che bigmart-data.com not found
errore:ovviamente non è stato trovato; non esiste.
chmod +X scriptname.sh
sudo ./scriptname.sh
Puoi testare il tuo firewall dalla riga di comando usando cURL
. La richiesta di ubuntu.com funziona, ma manning.com non riesce.
curl ubuntu.com
curl manning.com
Configurazione di iptables da caricare all'avvio del sistema
Il terminale Linux
- I 7 migliori emulatori di terminale per Linux
- 10 strumenti da riga di comando per l'analisi dei dati in Linux
- Scarica ora:cheat sheet SSH
- Cheat sheet sui comandi avanzati di Linux
- Esercitazioni sulla riga di comando di Linux
Ora, come faccio a caricare automaticamente queste regole ogni volta che si avvia il chiosco? Il primo passo è salvare le regole correnti in un file .rules usando iptables-save
attrezzo. Questo creerà un file nella directory principale contenente un elenco delle regole. La pipe, seguita dal comando tee, è necessaria per applicare il mio sudo
autorizzazione alla seconda parte della stringa:il salvataggio effettivo di un file nella directory radice altrimenti limitata.
Posso quindi dire al sistema di eseguire uno strumento correlato chiamato iptables-restore
ogni volta che si avvia. Un normale cron job del tipo che abbiamo visto nel modulo precedente non sarà di aiuto perché vengono eseguiti a orari prestabiliti, ma non abbiamo idea di quando il nostro computer potrebbe decidere di arrestarsi in modo anomalo e riavviarsi.
Ci sono molti modi per gestire questo problema. Eccone uno:
Sulla mia macchina Linux, installerò un programma chiamato anacron che ci darà un file nella directory /etc/ chiamato anacrontab. Modificherò il file e aggiungerò questo iptables-restore
comando, dicendogli di caricare i valori correnti di quel file .rules in iptables ogni giorno (se necessario) un minuto dopo l'avvio. Darò al lavoro un identificatore (iptables-restore
) e quindi aggiungere il comando stesso. Dato che stai giocando con me a casa, dovresti provare tutto questo riavviando il tuo sistema.
sudo iptables-save | sudo tee /root/my.active.firewall.rules
sudo apt install anacron
sudo nano /etc/anacrontab
1 1 iptables-restore iptables-restore < /root/my.active.firewall.rules
Spero che questi esempi pratici abbiano illustrato come utilizzare iptables e firewalld per la gestione dei problemi di connettività sui firewall basati su Linux.