Le varie distribuzioni Linux integrano un componente chiamato Netfilter che si occupa di gestire i pacchetti dati in transito. Esso estende le capacità native del kernel Linux in materia di instradamento dei pacchetti e permette di realizzare configurazioni di router e firewall anche molto articolate.
Per configurare Netfilter viene comunemente utilizzato iptables che consente di definire le regole per i filtri di rete e il reindirizzamento NAT (leggasi inoltro del traffico verso host e porte specifici; vedere anche Port forwarding, cos’è e qual è la differenza con il port triggering).
Le regole firewall di iptables sono impostabili ovunque: su una qualsiasi distribuzione Linux, per consentire o bloccare determinate tipologie di trasferimenti dati, su un server cloud e sulla maggior parte dei dispositivi hardware. Basti pensare praticamente la totalità dei router che si usano in azienda, in ufficio o a casa sono basata proprio su kernel Linux: i produttori realizzano versioni estremamente leggere delle distribuzioni che molti di noi conoscono e le adattano per regolare il funzionamento di router e firewall hardware.
Attraverso l’interfaccia web del dispositivo solitamente si ha accesso a un numero limitato di funzionalità mentre stabilendo una sessione SSH di potrà personalizzare in modo approfondimento il comportamento di iptables.
Conoscere il funzionamento di iptables è quindi fondamentale perché prima o poi ci si troverà nelle condizioni di dover impostare una policy per permettere o negare certe tipologie di comunicazioni, in entrata e in uscita.
Si immagini di collegare un server cloud Linux direttamente alla rete Internet: per motivi di sicurezza è fondamentale ridurre al minimo indispensabile il numero di porte aperte raggiungibili anche da parte di soggetti terzi sull’IP pubblico (leggasi interfaccia WAN).
Da Linux, il comando nmap -v
seguito dall’indirizzo IP pubblico del server cloud, permetterà di stabilire quali porte sono esposte pubblicamente: vedere anche Nmap, cos’è e come funziona il re dei port scanner.
Come si vede in figura, nell’esempio sono tre le porte aperte sull’IP pubblico: TCP 22 (SSH); TCP 80 (HTTP); TCP 3306 (MySQL).
Con iptables possono essere chiuse le porte che si desiderano rendere inutilizzabili sull’interfaccia WAN migliorando significativamente la sicurezza della rete.
Nei nostri articoli pfSense, come usarlo per configurare un firewall sul cloud e Configurare un server OpenVPN con pfSense abbiamo presentato una distribuzione software basata su BSD che è tra i migliori firewall con tante funzionalità integrate.
Chi avesse a che fare con un dispositivo basato su kernel Linux direttamente connesso alla rete Internet e non potesse servirsi di soluzioni evolute come pfSense può comunque ottenere i risultati prefissi padroneggiando proprio l’utilizzo di iptables.
Digitando il comando sudo iptables -L
sul dispositivo Linux in locale o da remoto dopo aver stabilito una connessione SSH, è possibile verificare le regole NAT/firewall eventualmente in essere.
Dal momento che le regole imposte mediante iptables vengono immediatamente applicate, quando si utilizzasse una sessione remota via SSH è fondamentale non commettere errori madornali, per non rischiare di rimanere chiusi fuori dalla macchina, con l’impossibilità di accedervi nuovamente a distanza.
Le seguenti due regole di esempio indicano a iptables di accettare le connessioni solo dall’IP pubblico indicato verso la porta sulla quale è in esecuzione il daemon SSHd per la gestione delle richieste di connessione mediante protocollo SSH:
In questo caso si è ipotizzato che la porta sulla quale è in ascolto il server SSHd è quella standard (TCP 22). Supponendo di disporre di un indirizzo IP pubblico di tipo statico, inserendolo al posto di INDIRIZZO_IP si farà in modo che iptables accetti soltanto le richieste di connessione da quell’IP rigettando qualunque altra.
Si supponga di avere un server dedicato o cloud direttamente collegato alla rete Internet: dopo esserci assicurati l’accesso via SSH si potranno bloccare le connessioni su tutte le altre porte di comunicazione impartendo i comandi che seguono:
iptables -P INPUT DROP
iptables -P FORWARD DROP
Come si vede, effettuando una scansione da un terminale client connesso da IP pubblico differente, nessuna porta appare aperta:
Con una policy come iptables -A INPUT -p tcp --dport 80 -j ACCEPT
è possibile fare in modo di accettare tutto il traffico in ingresso sulla porta 80.
In questo modo, come si vede, da IP pubblici di terze parti si vedrà soltanto la porta 80 (HTTP):
Ripetendo la scansione con il dispositivo client connesso al router con IP statico usato per l’amministrazione del server remoto si vedrà aperta anche la porta 22 (SSH):
Negli esempi abbiamo utilizzato l’utilità PingTools Network Utilities per Android ma esistono decine di utilità similari.
Se si consentisse o si bloccasse il traffico sulla base dell’IP client utilizzato, suggeriamo di attrezzarsi con almeno un paio IP statici forniti dai vari operatori di telecomunicazioni. In questo modo non si correrà il rischio di vedersi definitivamente sbattuti fuori dal server remoto nel caso in cui, ad esempio, tale indirizzo statico dovesse cambiare (per esempio a seguito di una modifica contrattuale).
Importante anche aggiungere le seguenti regole che consentono di accettare la gestione del traffico sull’interfaccia di loopback e di lasciare entrare tutto il traffico manualmente richiesto (altrimenti non si potranno neppure aggiornare o installare i pacchetti software):
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
È bene evidenziare che usando l’opzione -I
senza specificare alcuna numerazione, la nuova regola sarà posta in cima a quelle già presenti (quindi con la massima priorità); usando -A
la nuova policy sarà aggiunta in coda.
Usando la sintassi iptables -D
le regole possono essere eventualmente cancellate.
Con pochi semplici passi si è ottenuto un firewall software che permette il transito tutti i dati in uscita ma filtra tutto il traffico in ingresso permettendo sugli IP client di terzi, esclusivamente la connessione sulla porta 80 (si potrà poi eventualmente aprire poi anche la porta 443, HTTPS) mentre dall’IP statico usato per scopi amministrativi anche il collegamento via shell SSH.
A titolo esemplificativo, nell’articolo Come bloccare l’uso di server DNS alternativi all’interno della rete locale abbiamo visto come usare iptables per impedire l’utilizzo di server DNS diversi da quelli impostati sul router.