Il firewall Linux

Esistono diverse applicazioni firewall per Linux, ma ciò che potresti non rendertene conto è che, al centro di tutti questi programmi, c'è un'unica applicazione onnipresente che è integrata direttamente nel kernel di Linux: iptables. Questo è il firewall Linux. Indipendentemente dal programma che usi per configurare il tuo firewall su Linux, alla fine tutto si riduce a iptables. Tutto ciò che fanno questi altri programmi è configurarlo.

Quindi, ecco la domanda: se quei programmi configurano semplicemente iptables, perché non configurarlo semplicemente direttamente da solo? Fare così è più facile di quanto tu possa pensare!


Sfondo di rete

Se hai familiarità con i termini di rete, come le connessioni, IP, TCP e Porta, sentiti libero di saltare al passaggio successivo. Altrimenti, se sei nuovo al networking, continua a leggere per familiarizzare con i termini che dovrai comprendere, per seguire questo tutorial.

Si prega di notare che i termini e le definizioni di seguito sono stati intenzionalmente troppo semplificati. Sono pensati per gli utenti di tutti i giorni, non per gli amministratori di sistema. Quindi, se sei un sysadmin esperto o hai un CCNA in tasca, ti prego di scusarmi per non entrare nei dettagli.

TCP / IP

TCP / IP è un protocollo che consente ai computer di comunicare tra loro su reti Internet ed Ethernet.

Il fallimento è l'ultima risorsa.

Immagina un Rete Ethernet come una piccola rete locale (LAN - rete locale), come il PC di casa, il laptop e lo smartphone. È una piccola rete eterogenea che è isolata dal resto del mondo. Una rete di tali reti è ciò che tutti conosciamo come il Internet: un insieme di reti interconnesse.

TCP / IP è una combinazione di due protocolli che lavorano a diversi livelli nella gerarchia della catena di comunicazione di rete. Non approfondiremo i dettagli su quella gerarchia. TCP sta per Protocollo di controllo del trasferimento, e la sua responsabilità principale è garantire che la comunicazione abbia successo. Controlla la correttezza dei dati inviati e ne garantisce il successo. Ha diversi algoritmi per eseguire checksum sofisticati, correzione automatica e riprovare. Il fallimento è l'ultima risorsa. Il nome, IP proviene dal protocollo Internet. Puoi associarlo al "numero di telefono" del tuo PC. Ogni macchina in grado di comunicare su Internet deve avere un indirizzo IP - un numero di telefono unico - in modo che i pacchetti di comunicazione possano trovare le loro destinazioni. UN pacchetto è un piccolo pezzo di dati all'interno di un flusso di comunicazione, che è autonomo e può essere controllato per la correttezza. In sostanza, possiamo dire che i nostri computer inviano pacchetti TCP su Internet utilizzando il protocollo IP.

Ogni comunicazione di rete è legata a uno specifico porta. Le porte di rete vanno da 0 a 2 ^ 16 (65536). Ogni connessione di rete ha una porta in uscita per chi la avvia e una porta in entrata per chi sta ascoltando i messaggi di altri computer. Possono esserci diverse connessioni tra diversi computer su porte identiche. Tuttavia, un computer può parlare su più porte contemporaneamente. Quindi, in pratica, le porte sono buone per identificare i servizi e definire i canali di comunicazione, ma non limitano la quantità di dati o connessioni.

Alcuni computer possono avere indirizzi IP simili. Potresti aver notato che sia il tuo computer a casa che al lavoro hanno indirizzi IP che assumono la forma di qualcosa sulla falsariga di 192.168.something.something, o 10.0.something.something, o 172.16.something.something. Questi sono i cosiddetti indirizzi IP privati ​​che possono essere utilizzati solo all'interno della tua LAN. Non puoi andare su Internet con indirizzi IP come questo. Sono simili ai numeri interni della rete telefonica della tua azienda.

Gateway e Bridge

UN ponte è ciò che i computer con indirizzi IP reali (pubblici) passano a Internet.

Essenzialmente, questi computer hanno i diritti e le capacità di comunicare tra loro direttamente su Internet. Ma poiché non ci sono connessioni dirette tra tutti i computer del mondo (sarebbe abbastanza difficile da realizzare), i bridge sono responsabili della connessione di segmenti di Internet.

Mantenendo viva la nostra analogia telefonica, puoi immaginare che questi ponti siano simili ai centri telefonici della tua città o del tuo quartiere. Se si effettua una chiamata a un altro numero locale (i computer a sinistra nel nostro schema), la comunicazione potrebbe essere stata effettuata direttamente dal proprio centro telefonico collegando fisicamente la linea con quella del vicino. Tuttavia, se si preferisce chiamare lo zio Bob distante, la chiamata dovrebbe essere reindirizzata su diversi centri telefonici fino a quando il telefono dello zio potrebbe essere collegato. Questi formano a ponte tra la tua città e la sua città.

UN porta è un modo per computer da una rete privata (LAN con indirizzi IP privati) per comunicare con altri computer su Internet.

Una rete privata è come la rete telefonica privata della tua azienda. Puoi chiamare i numeri interni, ma per chiamare qualcuno che è al di fuori della rete della tua azienda - come tua moglie a casa - devi prima chiamare un numero speciale o un prefisso.

I computer funzionano in un modo simile. Quando si è su una rete privata, si dispone di un cosiddetto computer gateway. Quando il tuo computer tenta di parlare con un altro computer su Internet, lo farà automagicamente contattare prima il gateway e richiedere "una linea" al mondo esterno. Il gateway parlerà con il computer trovato su Internet e inoltrerà il messaggio al computer. Tu, come utente ordinario, non vedi alcuna differenza tra un bridge e un gateway. Il tuo computer saprà come gestirli.


Definizione di un firewall

Un firewall è un programma in esecuzione su un gateway, bridge o PC / laptop / smartphone che è in grado di filtrare i pacchetti di rete in entrata, in uscita e inoltrati. Un firewall è essenzialmente uno strumento che ti consente di limitare l'accesso dell'utente o della rete a Internet e l'accesso di qualcun altro da Internet alla tua rete.

E sì, il tuo router via cavo o Wi-Fi domestico è, in effetti, un firewall per tutti i tuoi computer e gadget che si connettono a Internet attraverso di esso.


Il problema che risolveremo

Per impostare il contesto, immaginiamo un'architettura di rete molto possibile. Ho visto molte piccole aziende che gestiscono qualcosa di simile a questo.

Quello che abbiamo qui è in realtà qualcosa di abbastanza semplice:

  • Alcuni computer e altri dispositivi connessi in rete: le scatole verdi
  • Un server di posta elettronica: la casella rossa
  • Un server Microsoft Active Directory: la scatola blu
  • Un gateway, che è anche un firewall, per la nostra rete che esegue Linux: la scatola nera
  • Tra tutti questi è un semplice switch di rete

Nella sezione seguente, configureremo iptables su quel gateway, in modo che consenta a tutti i dispositivi nella rete di connettersi a Internet. Ci consentirà di connetterci ad esso, tramite SSH, e permetterà ai server di posta esterni di raggiungere il server di posta all'interno della nostra rete - un computer che non ha nemmeno un indirizzo IP pubblico; solo uno privato.


Componenti di Iptables

Il nome di Iptables in realtà ha un significato nella sua funzionalità. È un insieme di tabelle di indirizzi IP e porte con alcune azioni ad esse collegate. Nei termini di iptable, queste tabelle sono indicate come Catene. Un iptables vuoto non configurato potrebbe apparire come questo:

csaba ~ # iptables -L Chain INPUT (policy ACCEPT) target prot opt ​​destinazione destinazione Chain FORWARD (policy ACCEPT) target prot opt ​​destinazione destinazione Chain OUTPUT (policy ACCEPT) target prot opt ​​destinazione sorgente

Puoi osservare che ci sono tre catene principali:

  • INGRESSO - tutte le connessioni in entrata
  • INOLTRARE - connessioni che passano attraverso
  • PRODUZIONE - connessioni in partenza da questo server

Il termine, "politica ACCETTA"tra parentesi significa che ACCEPT è impostato come criterio predefinito per quella particolare catena, quindi, quando non esiste una corrispondenza per una connessione, verrà applicata tale regola. Sono disponibili tre concetti principali che è possibile utilizzare durante la configurazione del firewall:

  • criterio predefinito ACCEPT e nega in modo selettivo tutto ciò che è necessario - potrebbe essere difficile specificare tutto ciò che è negato. Non consiglio questo approccio.
  • criterio predefinito DROP o REJECT e consente in modo selettivo tutto ciò che è necessario - questo è meglio, ma ha un problema. Se commetti un errore nella configurazione di iptables, puoi facilmente rimanere con catene vuote negando l'accesso a tutto e tutti, incluso te. Quindi, a meno che tu non abbia sempre accesso fisico al tuo server / computer firewall, ti consiglio di utilizzare il prossimo approccio.
  • criterio predefinito ACCEPT e una politica esplicita per DROP tutto e quindi consentire in modo selettivo tutto ciò che serve - questa è una soluzione combinata tra le prime due possibilità. Verrà utilizzata una politica di default ACCEPT, quindi se qualcosa va storto, è possibile eseguire il login su SSH o qualsiasi altra connessione remota utilizzata per il firewall. Allo stesso tempo, una regola DROP esplicita per qualsiasi connessione non abbinata garantisce la tua sicurezza. Permettere solo la conoscenza e l'effettiva necessità di utilizzare offre la migliore protezione possibile.

Aggiunta di regole a Iptables

Ci sono due modi per aggiungere una nuova regola a iptables. Uno è inserirlo all'inizio di una catena. L'altra opzione è di aggiungerla alla fine di una catena. Perché è importante in quale ordine si verificano le regole?

Importante: iptables controlla le regole in una catena dall'alto verso il basso. Interromperà la sua ricerca alla prima partita.

È necessario progettare le regole in modo tale da considerare il comportamento sopra descritto di iptables. Dopo la prima corrispondenza di una regola, iptables eseguirà le azioni specificate dalla regola e quindi interromperà la ricerca. Se nessuna regola corrisponde alla connessione selezionata, si applica la politica predefinita.

Inserimento di una nuova regola

Diciamo che vogliamo aggiungere una regola al nostro iptables che permetterà a chiunque di connettersi alla porta 22 sul nostro firewall. La porta 22 è la porta per il protocollo SSH. Ovviamente, un buon amministratore del server cambierà questa porta in qualcosa di inaspettato per ovvi motivi di sicurezza / oscurità, ma questa è un'altra storia per un altro tutorial. Ci atterremo con 22.

csaba ~ # iptables -I INPUT -i eth0 -p tcp -dip 22 -j ACCEPT csaba ~ # iptables -L Chain INPUT (policy ACCEPT) destinazione target opt ​​opt ​​destinazione ACCEPT tcp - ovunque ovunque tcp dpt: ssh

Ho presunto che l'indirizzo IP di Internet con l'IP pubblico su di esso sia sull'interfaccia di rete, chiamato eth0. Analizziamo questo comando:

  • -io - sta per inserire la regola
  • INGRESSO - specifica la catena desiderata
  • -io - sta per interfaccia di rete - nel nostro caso, eth0
  • -p - è per protocollo (tcp o udp)
  • --sportello 22 - è per la porta di destinazione 22 - ha un corrispondente --sport versione per la verifica della porta di origine
  • -j - in realtà viene da "jump" ed è seguito da un'azione, nel nostro caso, dall'azione per accettare la connessione

Tuttavia, potresti già aver intuito che questa regola ha scarso effetto in questo momento. La nostra politica predefinita è ACCEPT, quindi accettare esplicitamente qualcosa non ci offre alcuna funzionalità aggiuntiva. Ora, ricorda il terzo modo consigliato di configurare il nostro firewall: la regola esplicita per negare tutto ciò che non corrisponde. Aggiungiamo questa regola.

Regole di aggiunta

Vogliamo aggiungere una regola che blocchi il traffico in entrata. Ma attenzione: vogliamo solo bloccare ciò che potrebbe essere dannoso. Se blocchiamo tutto, non saremo in grado di fare nulla, perché le risposte alle nostre richieste saranno respinte. Ad esempio, quando si esplora una pagina Web, si effettua una richiesta, quindi si riceve una risposta. Questa risposta arriva nel tuo computer, quindi, sulla catena INPUT, dobbiamo avere una regola per consentirglielo.

Innanzitutto, aggiungeremo una regola per accettare il traffico in entrata per le connessioni già stabilite, come le risposte alle richieste.

csaba ~ # iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT csaba ~ # iptables -L Chain INPUT (policy ACCEPT) target prot opt ​​destinazione sorgente ACCEPT tcp - ovunque ovunque tcp dpt: ssh ACCEPT tutto - ovunque ovunque ctstate RELATED, ISTABLISHED

Ora che abbiamo salvaguardato le nostre connessioni esistenti e le risposte alle connessioni che abbiamo avviato, possiamo negare tutto ciò che non è stato abbinato.

csaba ~ # iptables -A INPUT -i eth0 -p tcp -j DROP csaba ~ # iptables -L Catena INPUT (politica ACCEPT) destinazione target destinazione opt opt ​​ACCEPT tcp - ovunque ovunque tcp dpt: ssh ACCEPT tutto - ovunque ovunque ctstate CADUTA CORRELATA E STABILITA 'tcp - ovunque

Abbiamo aggiunto un'altra riga, con una regola per DROP tutte le connessioni corrispondenti. Ricorda: questa regola si applica solo se nessuno dei precedenti corrisponde effettivamente.

Ci sono due modi per rifiutare una connessione.

  1. È possibile utilizzare DROP, che equivale a comporre un numero di telefono inesistente con la differenza che, dopo un po 'di tempo, la connessione di rete scade. Con un numero di telefono, un robot ti informa che il numero non esiste. Ma il risultato finale dal punto di vista del chiamante è lo stesso: pensa che la destinazione non esista.
  2. Il secondo modo per rifiutare la connessione è con la regola, REJECT e un messaggio opzionale. Questo è analogo al numero che stai cercando di chiamare occupato. Potresti sapere che c'è un numero, sai che può essere chiamato, ma semplicemente si rifiuta di rispondere alle tue chiamate. Facoltativamente, puoi fornire un messaggio con una regola REJECT; il valore predefinito è "Porta ICMP non raggiungibile" o qualcosa di simile.

Consenti ai computer di accedere a Internet

A questo punto, abbiamo alcune regole di base per la catena INPUT. Ma abbiamo una rete di computer con indirizzi IP privati. Dobbiamo fornire un gateway per Internet. Anche questo è fatto da iptables: il firewall.

Network Address Translation (NAT)

Probabilmente, hai già sentito questo termine: NAT. Questo si riferisce alla procedura di traduzione di un indirizzo di rete a un altro e inoltro delle informazioni tra i due. È più frequentemente utilizzato in architetture come la nostra. Il gateway deve eseguire NAT per tradurre qualsiasi IP del computer dalla LAN nel proprio IP pubblico e quindi tornare indietro.

Il routing è la procedura con cui un sistema può capire su quali interfacce di rete e verso quale gateway può comunicare per raggiungere la sua destinazione. Ogni computer ha una propria tabella di routing per determinarlo. Iptables può collegarsi a questa procedura di routing in due punti diversi: prima e dopo la procedura.

Nating con Iptables

csaba ~ # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 89.72.31.243

Questo comando aggiunge una regola come POSTROUTING alla tabella NATing (-t nat). POSTROUTING significa essenzialmente che i pacchetti prima passano il meccanismo di routing sul gateway e, solo dopo, vengono modificati. La regola -j SNAT significa Source NAT; l'indirizzo di origine dei pacchetti verrà modificato all'indirizzo indicato nell'interfaccia -o eth0 - nel nostro caso, all'indirizzo IP specificato dall'opzione, --a-fonte. Quindi, chiunque sia contattato da un computer nella tua rete supporrà che stia parlando direttamente al tuo gateway. Non avrà assolutamente alcun indizio sul fatto che i pacchetti sono destinati a computer diversi. Il gateway, utilizzando iptables, manterrà un elenco interno di tutti gli indirizzi IP tradotti e, quando arriverà una risposta, annullerà la modifica e passerà la risposta al computer all'interno della rete.


Consenti il ​​client da Internet al server di posta elettronica

Un altro problema che dobbiamo affrontare è cosa fare quando abbiamo un server dietro un firewall. Dobbiamo consentire ai clienti, provenienti da Internet, di comunicare in qualche modo con il nostro server. Questo è il caso del nostro server di posta. Quando arriva un'e-mail che deve essere consegnata a un account di posta sul nostro server, il server di posta di invio dovrà connettersi a quello di ricezione.

Ma il nostro server di posta ha solo un indirizzo IP privato. Non è possibile che un computer esterno possa connettersi direttamente. D'altra parte, il nostro gateway ha un IP esterno a cui chiunque potrebbe connettersi. La soluzione? Apri una porta sul nostro gateway in modo che una richiesta da Internet a quella porta passi effettivamente al nostro server di posta elettronica. La risposta, ovviamente, viaggerà attraverso il gateway fino al cliente. Il trucco è di usare qui un diverso tipo di NAT, chiamato Destination NAT. Questo cambia la destinazione dei pacchetti e quindi li ripristina quando si verifica la risposta. Pensa a DNAT come il contrario di SNAT.

Mancia: Potresti conoscere questa funzione come "Server virtuale", se hai mai giocato con i piccoli router domestici.

csaba ~ # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.1.2:25

Quindi, cosa sta succedendo qui? Un pacchetto arriva al nostro gateway sulla porta 25 (la porta utilizzata per SMTP, il protocollo di posta elettronica utilizzato dall'intero Internet). La regola sopra coglie questo pacchetto a causa del --sport 25 opzione, che sostanzialmente dice "Abbina tutto ciò che va a questa porta sull'interfaccia specificata da -io et0. Ora che il pacchetto è abbinato, cambia la sua destinazione dalla macchina corrente (il gateway) a quella specificata da --fino a destinazione."Si noti che è possibile specificare esplicitamente la porta dopo l'indirizzo IP separandola con due punti.

Infine, nota che questo è nel gancio PREROUTING. La destinazione deve essere cambiata prima che l'instradamento avvenga effettivamente. Altrimenti, i pacchetti finirebbero sul gateway e non troverebbero alcun modo al server di posta.


Persistente configurazione di iptables

Le regole che inserisci o aggiungi a iptables sono in memoria. Dopo un riavvio, parodia: tutto è finito! Per salvare la tua configurazione, dovresti scaricarla in un file, in questo modo:

csaba ~ # iptables-save> /some/directory/my_rules.fw

Il nome del file non ha importanza, né la sua estensione. Per ripristinare le regole, esegui questo comando all'avvio del computer.

iptables-restor < /some/directory/my_rules.fw

Se dai un'occhiata al contenuto salvato, vedrai che sono gli stessi parametri che abbiamo usato con i comandi di iptables. Ci sono alcune piccole differenze, ma puoi facilmente capire il file salvato e persino scrivere manualmente i tuoi file e caricarli.


Pensieri finali

In chiusura, ecco alcuni pensieri su quando e quando non utilizzare un firewall con un computer Linux.

Usa un firewall su Linux quando si configura un server (come un gateway nel nostro esempio) o quando si dispone di un computer con informazioni importanti direttamente esposte a Internet. Prima di saltare a configurare il tuo iptables, considera il potenziale pericolo. Chiediti: il mio computer è conosciuto su Internet? Ci sono alcuni miliardi di computer là fuori. Se il tuo è solo uno, la possibilità di essere preso di mira è incredibilmente basso. Ci sono persone direttamente interessate alle tue informazioni? Gli hacker non perdono tempo a rubare dati casuali nella speranza che possano trovare qualcosa. Di solito sanno quello che stanno cercando e quindi prendono di mira i computer che contengono le informazioni desiderate. Naturalmente, ci sono innumerevoli attacchi contro computer casuali che tentano di installare qualche tipo di worm o virus, ma su Linux, sei immune dal design.

Non perdere tempo con la configurazione di un firewall su Linux quando si tratta di un computer che è sempre dietro un firewall, ad esempio il PC di casa dietro il router di casa o quando non si dispone di informazioni particolarmente importanti sul laptop. Se si mantengono al minimo i servizi che ascoltano sulla rete e si dispone di una password decentemente sicura, è possibile dimenticare il firewall. Personalmente non ho un personal computer, laptop o smartphone con un firewall in esecuzione. Ho, tuttavia, un router di casa con un firewall ben configurato.

Penso che tu possa tranquillamente applicare queste idee anche a Mac OSX. Se sei un utente di Windows, mi dispiace: un firewall è la tua prima linea di difesa. Per Linux o MacOSX, però, un firewall è l'ultima linea di difesa. Una password accuratamente selezionata e che non esegue servizi inutili dovrebbe gestire la maggior parte della protezione del computer.

Grazie per aver letto. Domande?