Iptables

Dove risiede un firewall

  • Un firewall può risiedere in una macchina (workstation o server) che noi utilizziamo, per proteggerla rispetto alla rete in cui risiede
  • In questo caso i firewall deve connettersi allo stack TCP/IP della macchina
  • Un firewall può essere un apparato esterno che connette la rete ad altre reti (o direttamente ad Internet)
  • A sua volta, questo apparato può essere un dispositivo dedicato (router/firewall commerciale)

Dove risiede un firewall

  • L'apparato può essere anche un PC dotato di più connessioni (una o più schede di rete ed un modem, oppure più schede di rete) su cui gira l'opportuno software.
  • Nel caso il firewall risieda su un PC (dedicato a router, serve o workstation che sia) e che il Sistema Operativo sia Linux, il software per il firewall è IpTables
  • Anche diversi apparati sono in realtà basati su Linux e su IpTables, ma non ne parleremo qui

A cosa serve un firewall

  • Un firewall evita accessi indesiderati ad una macchina o ad una rete
  • Un firewall protegge una macchina o una rete da alcuni tipi di attacco provenienti dall'esterno
  • Un firewall può bloccare l'accesso ad alcuni indirizzi o sevizi Inernet esterni
  • Un firewall può nascondere una rete al resto del mondo
  • Un firewall può consentire di connettere un'intera rete ad Internet utilizzando un solo indirizzo

A cosa serve un firewall

  • Un firewall può consentire di accedere da Internet ad alcuni servizi delle macchine interne

Un po' di teoria: Indirizzamento IP e Reti

  • Sia IP che ICMP, per individuare le macchine, utilizzano l'Indirizzo IP
  • L'indirizzo IP (attualmente - IPv4) è un numero a 32 bit, che viene normalmente indicato come 4 numeri decimali compressi tra 0 e 255, separati da punti (dotted quad)
  • Lo standard entrante invece (IPv6) prevede indirizzi a 128 bit, scritti come fino a otto numeri esadecimali compresi tra 0 a ffff separati da : (ma non ne parleremo qui)

Un po' di teoria: Indirizzamento IP e Reti

  • I pacchetti IP, per andare dal mittente al destinatario su una rete remota, devono attraversare uno o più router
  • Il primo problema che ha ogni macchina, router o no, è conoscere la rete in cui il destinatari risiede. Per fare questo occorre dividere un indirizzo in due parti: rete (le cifre più a sinistra) e host (le cifre più a destra)
  • Per sapere come dividere l'indirizzo si utilizza la netmask, ma non approfondiremo qui questo argomento.

Un po' di teoria: IP e ICMP

  • Tutti i dati che circolano in Internet viaggiano dentro a pacchetti IP (Internet Protocol)
  • I pacchetti IP trasferiscono i dati tra macchine connesse ad Internet
  • Per gestire gli errori di trasmissione oppure alcune operazioni di servizio viene usato anche il protocollo ICMP (Internet Control Message Protocol)
  • Anche i pacchetti ICMP viaggiano tra macchine connesse ad internet.

Un po' di teoria: IP e ICMP

  • Sia i pacchetti IP che ICMP viaggiano tra macchine e non conoscono né utenti né servizi, all'interno delle macchine

Un po' di teoria: reti private

  • Un router, per inviare i pacchetti per una rete ad un altro router deve conoscere la "direzione" della rete di destinazione.
  • Questo è possibile perché sono state assegnate da un'entità superiore (IANA, GARR, ecc.)
  • E se io voglio farmi una rete casalinga, chi mi assegna un gruppo di indirizzi IP da usare?
  • Per questo scopo, la IANA (Internet Assigned Numbers Authority) ha previsto una serie di reti chiamate reti private.

Un po' di teoria: reti private

  • Queste reti sono la 10.x.x.x, le reti dalla 172.16.x.x alla 172.31.x.x e quelle dalla 192.168.0.x alla 192.168.255.x
  • Naturalmente i vari router di Internet non conoscono in che direzione inviare i pacchetti per queste reti (in realtà ce ne sono una gran quantità con gli stessi indirizzi in giro per il mondo), quindi queste reti non sono raggiungibili.
  • Per far comunicare queste reti private con Internet occorre che il router (o il firewall), in possesso di un indirizzo Internet valido e raggiungibile, invii in rete le richieste della rete privata a suo nome

Un po' di teoria: reti private

  • Naturalmente, quando poi gli arriveranno le riposte ai pacchetti inviati, dovrà rigirarle alla macchina interna richiedente
  • Questa tecnica si chiama Network Address Translation o NAT

A cosa NON serve un firewall

  • Un firewall non protegge le macchine dai virus (ma d'altronde in Linux non ne abbiamo)
  • Un firewall non blocca le pagine web in base ai contenuti (al massimo lo può fare un proxy)
  • Un firewall esterno (PC o apparato) non protegge una macchina da attacchi provenienti dalle macchine della stessa mia rete
  • Un firewall non accelera ne rallenta la navigazione in Internet

A cosa NON serve un firewall

  • Un firewall non rende anonime le mie comunicazioni (in caso di NAT non conosco la macchina precisa che ha chiamato, ma so benissimo da che rete).

Le catene standard di filter

  • La tabella filter consente o vieta il transito dei pacchetti; possiede tre catene standard:
  • INPUT controlla i pacchetti che, provenendo da qualunque interfaccia (compresa lo) sono destinati alla macchina (eventualmente dopo le modifiche della catena PREROUTING di nat)
  • OUTPUT controlla tutti i pacchetti generati dalla macchina e che usciranno da qualunque interfaccia (compreso lo)
  • FORWARD controlla i pacchetti che attraversano la macchina (provengono da qualunque interfaccia e sono destinati a qualunque interfaccia)

Le catene standard di filter

  • Naturalmnete nulla transita dalla catena FORWARD se il routing non è abilitato con il comando indicato in una slide precedente (echo 1 > /proc/sys/net/ipv4/ip_forward)

Un po' di teoria: routing

  • Ora, conoscendo l'indirizzo della rete del destinatario, un host (workstation o server) potrà sapere se esso è sulla sua stessa rete o su una diversa.
  • Se la destinazione è sulla stessa rete, manderà il pacchetto all'indirizzo fisico (MAC) della scehda di rete del destinatario
  • Altrimenti lo manderà all'indirizzo fisico del router
  • Un router è collegato direttamente a diverse reti ed al resto di internet tramite altri router
  • Quando ad un router arriva un pacchetto non destinato a lui, controlla la rete a cui esso è destinato.

Un po' di teoria: routing

  • Se il pacchetto è destinato ad una delle reti connesse, il router lo invierà su quella rete
  • Altrimenti sceglierà il router più vicino alla destinazione e lo invierà a quel router
  • Questa operazione deve venire eseguita per qualunque pacchetto.
  • Se mando un pacchetto ad un destinatario, questo risponde ma i router tra lui e me non sanno dove inviare la risposta oppure non possono inviarla, io non riceverò risposta esattamente come se non avessi raggiunto la destinazione.

Che cosa fa una macchina Linux senza firewall

  • Può inviare pacchetti IP, UDP, TCP e ICMP a qualsiasi destinatario
  • Possiede una serie di servizi che rispondono automaticamente ad una serie di richieste standard. Uno tra tutti il servizio echo che risponde ai pacchetti di richiesta ICMP del comando ping
  • Una macchina Linux priva di firewall accetta pacchetti IP, TCP, UDP e ICMP da ogni possibile mittente

Che cosa fa una macchina Linux senza firewall

  • Se vogliamo usarlo per collegare più reti (se vogliamo che instradi i pacchetti, quindi faccia routing) dobbiamo inviare il seguente comando:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    come utente root (o con sudo). Eventualmente inseriremo questo comando in uno script di avvio.
  • Se possiede più di una scheda di rete o un modem con una connessione attiva non instrada i pacchetti entranti da una scheda verso un'altra
  • Comunque la nostra macchina non farà NAT

Un po' di teoria: protocolli di livello superiore

  • Come abbiamo detto, il protocollo IP consente di comunicare tra macchine, il che vuole dire che non mi consente di richiedere un servizio piuttosto di un altro ad un server che ne abbia più di uno
  • Inoltre, come abbiamo detto, IP prevede che ogni pacchetto sia "un mondo a se", quindi, ad esempio, se si perde un pacchetto non viene rimandato.

Un po' di teoria: protocolli di livello superiore

  • Questo comportamento può andare bene se per esempio trasmettiamo dati multimediali "live" in quanto è meglio perdere un dato che attendere che venga re-inviato, oppure se abbiamo dati piccoli, che stanno in un singolo pacchetto, e facciamo prima a gestire noi l'eventuale mancanza di risposta piuttosto che farla gestire dal sistema.
  • Se invece, ad esempio, vogliamo trasferire un file, ci sarebbe molto più comodo se fosse il sistema a preoccuparsi della ritrasmissione degli eventuali pacchetti persi o rovinati.

Un po' di teoria: protocolli di livello superiore

  • Internet mette a disposizione due protocolli di livello superiore. Entrambi introducono il concetto di porta, per consentire di individuare il servizio sul server o per avere più comunicazioni contemporanee con lo stesso server e servizio (magari leggere più immagini contemporaneamente dal sito che stiamo guardando).
  • UDP (User Datagram Protocol) mette a disposizione un servizio utente di trasmissione non sicura, ma veloce (senza le ritrasmissioni)
  • TCP (Transer Control Protocol) mette a disposizione un servizio di trasmissione sicura (gestisce le ritrasmissioni in caso di errore)

Le catene di Iptables

  • Ogni regola fà un eventuale controllo sul pacchetto da esaminare e, se il controllo è positivo, inviano il pacchetto ad una destinazione (target).
  • Se un pacchetto non soddisfa alcuna delle regole nella catena, la sua sorte è determinata dalla politica (policy) della catena, che indica il target cui inviare questo tipo di pacchetti.
  • Ogni catena è costituita da un elenco ordinato di regole.
  • Il target di una regola si indica con il parametro -j <target>, generalmente in fondo alla regola

Le catene di Iptables

  • Per indicare la politica di una catena si usa il parametro -P <nome_catena> <target>
  • Se in una regola non è indicato alcun controllo, tutti i pacchetti la soddisfano.

Le catene di Iptables

  • I target più comuni sono:
    • <nome_catena_utente> richiama una catena definita dall'utente
    • ACCEPT accetta il apcchetto; il pacchetto viene inviato a destinazione senza ulteriori controlli
    • REJECT rifiuta il pacchetto eventualmente con la risposta ICMP indcata nel parametro --reject-with <tipo_risposta>; il pacchetto non viene più processato da alcuna regola della catena o in nessuna altra tabella
    • RETURN (valido solo nelle catene definite dall'utente) continua l'esame del pacchetto con la regola della catena chiamante successiva a quella che ha chiamato questa catena
    • MASQUERADE (solo nella tabella nat, catena POSTROUTING) serve per impostare il NAT con interfacce con IP dinamico (modem o DHCP)
    • SNAT simile a MASQUERADE, si usa se l'interfaccia con l'IP pubblico ha un IP statico (o più di uno), indicando quindi l'IP da usare
    • DNAT (solo nella tabella nat, catene PREROUTING e OUT) modifica l'IP di destinazione di un pacchetto (serve per aprire canali verso macchine interne)

Le catene di Iptables

  • Per aggiungere una regola in fondo ad una catena si utilizza il parametro -A <nome_catena>

La struttura di Iptables

  • Il firewall di Linux, dal kernel 2.6 in poi si chiama Iptables, ed è incorporato nel kernel stesso (eventualmente caricato in tutto o in parte come moduli)
  • Il comando per gestire il firewall, si chiama anch'esso iptables (provate a leggerne le istruzioni con il comando man iptables)

La struttura di Iptables

  • Iptables prevede quattro tabelle, ognuna collegata ad un particolare tipo di operazione:
    • filter che gestisce il normale traffico dei pacchetti, senza modificarne il contenuto
    • nat per gestire appunto il NAT, nelle sue varie forme
    • mangle per modificare i parametri dei pacchetti (in realtà non la utilizzeremo)
    • raw per apportare modifiche ai pacchetti in casi particolari, il più presto possibile (non la useremo)

La struttura di Iptables

  • Ogni pacchetto viene inviato ad una sola catena per ogni tabella, viene inviato almeno alla tabella filter, ma può essere inviato a più di una tabella.
  • Se nel comando iptables non si indica il nome di una tabella con il parametro -t <nome_tabella>, la tabella utilizzata è la filter
  • Ognuna di queste tabelle possiede una serie di catene standard, per gestire i pacchetti nelle varie situazioni.
  • Si possono poi creare delle catene definite dall'utente, che possono venire richiamate come delle funzioni o procedure all'interno delle catene standard

Le catene standard di nat

  • La tabella nat ha tre catene standard:
  • PREROUTING modifica i pacchetti in prima che siano consegnati alla catena INPUT o FORWARD di filter. Serve per pubblicare delle macchine interne della rete.
  • POSTROUTING serve per modificare i pacchetti dopo che sono passati per la catena FORWARD di filter. Si usa per gestire il NAT della rete interna.
  • OUTPUT per gestire i pacchetti generati dalla macchina, prima che vengano instradati verso l'interfaccia si destinazione.

Le catene standard di nat

  • Normalmente per la catena PREROUTING si utilizza il target DNAT e in questo caso si deve indicare con il paramentro --to-destination <IP_macchina_interna> l'IP della macchina interna che riceverà i dati

Le catene standard di nat

  • Nella catena POSTROUTING si usano normalmente due target:
    • SNAT se si usa un IP fisso, nel qual caso si indicherà con il parametro --to-source <ip_esterno> l'IP da utilizzare per i pacchetti uscenti
    • MASQUERADE se si usa un IP dinamico, nel qual caso occorre indicare con il parametro -o <nome_interfaccia> il nome dell'interfaccia di rete con la quale ci si connetterà ad Internet

I controlli nelle regole

  • Ogni regola deve indicare a quali pacchetti si applica. I controlli più comuni sono:
  • L'interfaccia attraverso cui è entrato il pacchetto, che si indica con il parametro -i <nome_interfaccia>
  • L'interfaccia dalla quale uscirà il pacchetto con il parametro -o <nome_interfaccia>
  • L'IP o la rete del mittente con il parametro -s <ip_mittente>[/<bit_rete>]
  • L'IP o la rete del destinatario con il parametro -d <ip_dest>[/<bit_rete>]

I controlli nelle regole

  • Il protocollo con l'opzione -p <protocollo>; il protocollo può essere:
    • TCP nel qual caso posso indicare la porta di provenienza con --source-port <n_porta> e la porta di destinazione con --destination-port <n_porta>
    • UDP nel qual caso posso indicare la porta di provenienza con --source-port <n_porta> e la porta di destinazione con --destination-port <n_porta>
    • ICMP nel qual caso posso indicare un particolare tipo di pacchetto ICMP tramite il parametro --icmp-type <nome_pacchetto_icmp>

I controlli nelle regole

  • Un utile condizione individua i pacchetti appartenenti ad una connessione aperta o le connessioni secondarie di alcuni protocolli: --state ESTABLISHED, RELATED
  • tutte le condizioni possono essere invertite inserendo prima della condizione il carattere !
  • Naturalmente una regola può contenere un numero a piacere di condizioni
  • La regola sarà soddisfatta solo se tutte le condizioni indicate sono soddisfatte

Un esempio: NAT in uscita

  • Se il firewall è connesso a Internet con un modem oppure è connesso ad un router con DHCP, non potremo configurare il NAT indicando l'intirizzo IP da utilizzare per connettere le macchine interne
  • Dovremo allora utilizzare il target MASQUERADE, che utilizza l'indirizzo (che deve essere unico) dell'interfaccia di uscita.
  • Se ad esempio ci connetteremo con un modem, e l'interfaccia verso Internet è quindi ppp0, useremo il seguente script:
    #!/bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Un esempio: NAT in uscita

  • Se ad invece ci connetteremo con un router e la nostra interfaccia di uscita è eth0, configurata in DHCP, useremo il seguente script:
    #!/bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Un esempio: nat in uscita con IP fisso

  • Se invece il nostro firewall ha un IP fisso (eventualmnete più d'uno) possiamo indicare l'IP con il quale le macchine interne raggiungeranno Intenret
  • Per fare questo useremo il seguente script:
    #!/bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.99.0.3
  • L'IP indicato nel parametro --to-source può essere sia quello dell'interfaccia di uscita che un suo alias.

Un esempio: nat in uscita con IP fisso

  • Per aggiungere un alias (indirizzo secondario ad una scheda, per esempio eth0, si usa il seguente comando:
    ifconfig eth0:1 10.99.0.3 netmask 255.255.255.0
    dove il :1 indica la sottointerfaccia, o il numero dell'Alias
  • Nella regola di iptables non si può indicare la sottointerfaccia ma si deve sempre indicare il nome dell'interfaccia principale.

Un esempio: Server Interno

  • Se ora vogliamo che la macchina interna sia visibile all'esterno, dovremo pubblicarla tutta oppure pubblicarne alcuni servizi
  • Per pubblicare l'intera macchina (avendo un indirizzo separato per la macchina interna) modificheremo il precedente script aggiungendo le righe sottolineate:
    #!/bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.99.0.3
    iptables -t nat -A PREROUTING -i eth0 -d 10.99.0.3 -j DNAT --to-destination 10.99.1.2

Un esempio: Server Interno

  • Invece per inviare il servizio WEB dell'indirizzo principale alla macchina interna si deve usare il seguente script:
    #!/bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A PREROUTING -i eth0 -p tcp --destination-port 80 -j DNAT --to-destination 10.99.1.2

Un esempio: Blocco degli accessi dall'esterno per un server o una workstation

  • Potremmo ora pensare di bloccare l'accesso dall'esterno alla nostra macchina (consentendo però di accedere all'esterno dalla macchina).
  • Se aggiungiamo solamente la regola:
    iptables -P INPUT DROP
    efettivamente non entra niente, nemmeno le riposte alle nostre richieste, quindi siamo completamente isolati dalla rete.

Un esempio: Blocco degli accessi dall'esterno per un server o una workstation

  • Se vogliamo effettivamente bloccare tutto il traffico entrante, ma riservarci la possibilità di navigare, useremo quindi il seguente script:
    #!/bin/bash
    iptables -P INPUT DROP
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Un esempio: Blocco degli accessi dall'esterno per un server o una workstation

  • Se vogliamo consentire anche il PING della macchina (e solo quello) dall'esterno, aggiungeremo al riga sottolineata la nostro script:
    #!/bin/bash
    iptables -P INPUT DROP
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Un esempio: Limitazione alla sola navigazione

  • Testo : Se per finire volessimo proteggere la nostra macchina e consentirle anche di accedere solo ai siti WEB, potremo usare il seguente script:
    #!/bin/bash
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
    iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

Un esempio: Limitazione alla sola navigazione

  • Sono state aggiunte le righe sottolineate allo script precedente.
  • Si noti che, oltre al servizio WEB (tcp, porta 80) si è dovuto abilitare anche il servizio DNS (udp porta 53), altrimenti i siti potranno essere raggiunti solo tramite il loro indirizzo IP e non tramite il loro nome, ed il PING (icmp echo-request) per la diagnostica
[any material that should appear in print but not on the slide]