Shorewall (Italiano)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tango-preferences-desktop-locale-modified.pngThe translation of this article or section does not reflect the original text.Tango-preferences-desktop-locale-modified.png

Reason: Not updated since its initial translation in 2008, out of sync with English page (Discuss in Talk:Shorewall (Italiano))

Un firewall è un sistema designato alla prevenzione di accessi non autorizzati alla o dalla tua rete privata (che può anche essere solo il sistema stesso). Possono essere implementati sia con hardware dedicato, con software o con una combinazione di entrambi. Nel caso che tratteremo il nostro piccolo server tuttofare sarà il firewall della nostra azienda. Questa parte è un po' complicata e necessita di tuning per la messa a punto che dipende dai servizi installati sul nostro server. Mettetevi il cuore in pace non potete far a meno di un firewall, quindi studiare, studiare :) I firewall sono utiltizzati in special modo per prevenire che utenti esterni alla nostra rete possano accedere alla nostra rete locale, ma anche per l'opposto motivo: prevenire che utenti "interni" possano accedere a servizi internet non autorizzati.

Ogni messaggio (meglio: ogni pacchetto) che entra o esce dalla nostra rete sarà analizzato dal firewall che, in base ai criteri di sicurezza impostati, potrà abilitare (allow) o negare (deny) la richiesta.

Shorewall

Shoreline Firewall, più comunemente conosciuto come Shorewall, è un tool ad alto livello per configurare Netfilter. Le "regole" del firewall sono descritte usando dei file di configurazione testuale relativamente semplici da capire ed interpretare nascondendo la complessità insita in iptables. Shorewall legge questi file di configurazione e, con l'aiuto dell'utility iptables, configura Netfilter secondo le tue esigenze. Shorewall può essere utilizzato sia in un sistema dedicato che in un sistema GNU/Linux standalone. Vista la sua completezza e la sua ottima documentazione[link interrotto 2020-08-04] è di certo una ottima soluzione.

Installazione

Installiamo Shorewall. E' nel repository [community] che dovrebbe essere attivato in /etc/pacman.conf

pacman -S shorewall

Pacman provvederà anche ad installare correttamente le dipendenze iptables e iproute

Configurazione

Il file di configurazione primario di Shorewall possiamo editarlo così :

sudoedit /etc/shorewall/shorewall.conf

il file è ben documentato, per il momento controlliamo solo che questi valori siano corretti :

IP_FORWARDING=On #Per le funzionalità di gateway
STARTUP_ENABLED=Yes #Ricordarsi di mettere "Yes" !
SUBSYSLOCK=/var/lock/shorewall

Shorewall viene fornito con dei file di esempio già quasi pronti all'uso. i file si trovano in /etc/share/shorewall/Samples. Li possiamo anche trovare così:

 pacman -Ql shorewall | grep Sample

Noi abbiamo un classico server con due interfacce (eth0 e eth1), dunque quelli che a noi interessano ti trovano in /usr/share/shorewall/Samples/two-interfaces e ce li copiamo in /etc/shorewall :

sudo cp /usr/share/shorewall/Samples/two-interfaces/* /etc/shorewall/

Ora bisogna leggere la relativa guida per configurare correttamente i file. Leggere con attenzione la guida, è molto importante!. Comunque possiamo fare un semplice sunto della questione andando a vedere i file di configurazione che ci servono.

/etc/shorewall/interfaces

Qui devo definire gli "alias" delle mie interfacce che poi saranno usati negli altri file di configurazione. Per noi sarà così :

#ZONE   INTERFACE BROADCAST        OPTIONS
net     eth1      detect           tcpflags,nosmurfs
loc     eth0      detect           dhcp,tcpflags,routefilter,nosmurfs,logmartians

Quindi da questo momento la mia scheda "interna" la chiamerò 'loc', quella esterna 'net'. Per le opzioni si veda la guida.

/etc/shorewall/zones

Shorewall vede la rete dove sta girando come composta da zone. nella configurazione di esempio two-interface sono usate i seguenti nomi di zona definiti nel file /etc/shorewall/zones :

#ZONE   TYPE     OPTIONS                 IN                      OUT
##                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4

Notate che Shorewall assegna una zona anche al firewall stesso: quando il file /etc/shorewall/zones viene processato, il nome della zona firewall viene memorizzato nella variabile shell $FW che può essere usata per riferirsi al firewall nei file di configurazione.

Quindi abbiamo (anzi era già ok) tre zone:

net -> internet
fw -> il firewall ossia il server stesso
loc -> la rete locale

Ricordiamoci questo, perchè quando definiremo le regole (Rules) per abilitare (allow) o negare (deny) il traffico tra le interfacce faremo sempre riferimento alle zone. Ad esempio voglio collegarmi al server dalla rete locale via ssh ? Dovrò creare una regole apposita da loc -> $fw. Oppure voglio accedere a internet dal firewall stesso ? Dovrò creare una regola da $fw -> net

/etc/shorewall/policy

Questo file serve per le policy di dafault del nostro server. In file è autodocumentato e dovrei capire il meccanismo che usa shorewall per configurare il firewall. Ad esempio contiene :

#SOURCE    DEST        POLICY      LOG LEVEL    LIMIT:BURST
loc        net         ACCEPT
net        all         DROP        info

La zona "all" non esiste in /etc/shorewall/zones, viene usata per riferirsi a tutte le zone. Dunque di dafault il mio firewall farà passare il traffico dalla rete interna a internet (loc net ACCEPT) e bloccherà tutto quello che arriva dall'esterno. Per abilitare il server/firewall ad accedere a internet (altrimenti non funzioneranno nemmeno gli aggiornamenti!!) e i pc della rete locale ad accedere ai servizi del server devo aggiungere/modificare queste policy :

#SOURCE    DEST        POLICY      LOG LEVEL    LIMIT:BURST
$FW        net         ACCEPT
loc        $FW         ACCEPT
$FW        loc         ACCEPT

Ora anche il mio server può collegarsi a internet, e dalla rete locale posso collegarmi al server (ad esempio con ssh).

/etc/shorewall/rules

In questo file vengono definite le eccezioni alle policy di dafault definite in /etc/shorewall/policy Editando il file possiamo notare che si commenta da solo. Solo un appunto. Questo file fà uso delle cosiddette macro, delle configurazioni predefinite che shorewall fornisce già pronte. Le posso vedere in /usr/share/shorewall e sono tutti quei file che iniziano con "macro.". Ad esempio guardiamo macro.DNS e macro.HTTP :

#ACTION SOURCE  DEST    PROTO   DEST    SOURCE  ORIGINAL        RATE    USER/
##                              PORT    PORT(S) DEST            LIMIT   GROUP
PARAM   -       -       udp     53
PARAM   -       -       tcp     53
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
#ACTION SOURCE  DEST    PROTO   DEST    SOURCE  ORIGINAL        RATE    USER/
##                               PORT    PORT(S) DEST            LIMIT   GROUP
PARAM   -       -       tcp     80
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

vediamo che shorewall definisce per il DNS le porte UDP e TCP 53 così nel mio file di configurazione basta che metta:

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE
DNS/ACCEPT      $FW             net
HTTP/ACCEPT     loc             $FW

Anzichè

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE
ACCEPT          $FW             net             tcp     53
ACCEPT          $FW             net             udp     53
ACCEPT          loc             $FW             tcp     80

Per ultimo blocchiamo il PING dall'esterno e lo abilitiamo all'interno:

Ping/ACCEPT     loc             $FW
Ping/REJECT     net             $FW
ACCEPT          $FW             loc             icmp
ACCEPT          $FW             net             icmp

Comodo e più facile da leggere :)

IP Masquerading (SNAT)

Le reti delle classi

  • 192.168.0.0
  • 172.16.0.0 - 172.31.0.0
  • 10.0.0.0

sono riservate alle reti locali e non vengono instradate mai su internet. Per permettere ad uno dei nostri utenti sulla rete locale di connettersi ad un host su internet deve intervenire il firewall facendo credere all'host remoto che la richiesta arrivi da lui. Quando riceve risposta dall' host remoto il firewall gira i pacchetti sul computer interno che ha generato la richiesta. Questo processo prende il nome di "Network Address Translation (NAT)".

Nei sistemi GNU/Linux, questo processo è anche conosciuto come "IP Masquerading" oppure a volte è usato anche il termine "Source Network Address Translation (SNAT)". Shorewall segue la seguente convenzione con Netfilter:

  • Masquerade descrive il caso in cui il firewall trova automaticamente l'indirizzo dell'interfaccia esterna
  • SNAT il caso in cui viene specificato in modo esplicito l'indirizzo

In Shorewall, entrambi Masquerading e SNAT sono configurati con il file /etc/shorewall/masq. Normalmente si usa Masquerading se l'indirizzo dell'interfaccia esterna eth1 ha un indirizzo IP dinamico e SNAT se l'indirizzo IP è statico.

Per noi il file /etc/shorewall/masq dovrebbe essere così :

#INTERFACE              SOURCE          ADDRESS
eth1                    eth0            

Se l'indirizzo esterno è statico lo possiamo inserire nella terza colonna del file /etc/shorewall/masq. Probabilmente funzionerà lo stesso anche omettendo questa configurazione ma il processo SNAT (specificando l'indirizzo) dovrebbe essere più efficente.

Naturalmente le possibilità sono molte, come ad esempio permettere sono a determinati host di navigare su internet, oppure specificare particolari porte. Per i dettagli vi rimando alla guida di shorewall.

Port Forwarding (DNAT)

Spesso capita di dover "girare" le richieste sulle porte del firewall ad una macchina interna della nostra rete. Supponiamo ad esempio di avere un web server sulla macchina interna con IP 192.168.20.10 che vogliamo far raggiungere dall'esterno quando "puntano" il browser sul mio server/firewall sulla posta 8080. Basta mettere in /etc/shorewall/rules :

DNAT        net        loc:192.168.20.10:80        tcp        8080

Cosa c'e' di più facile ? :D

Avvio del servizio

Prima assicuriamoci che il parametro del file /etc/shorewall/shorewall.conf

STARTUP_ENABLED=Yes

sia correttamente impostato, poi posso avviare il firewall in due modi. Con il classico

sudo /etc/rc.d/shorewall start

Oppure con la sua utility

sudo shorewall start

La sua utility ha anche funzionalità aggiuntive come ad esempio

sudo shorewall status

che mi mostra lo stato del firewall. Diamo un occhio alle altre opzioni (reset, save, show ...) che vedo con

sudo shorewall --help

che sono utilissime in fase di definizione delle regole. Solo a configurazione ultimata lo posso far partire nel modo tradizionale. Se non ricevo messaggi di errore è giunta l'ora di mettere anche shorewall nella riga "DAEMONS" del file /etc/rc.conf

DAEMONS=(... ... ... ... ... shorewall ... ... ...)

così ad ogni riavvio del server il mio firewall sarà up and running.

Problemi ?

A volte si pastrocchia un po' con shorewall, ma spesso basta dare un occhio al file di LOG :

sudo tail -f /var/log/iptables.log

mentre si tenta "qualcosa". Vedrete subito i motivi del blocco.

Considerazioni

Come già detto questa materia è complessa e và posta in opera con cognizione di causa. Spesso una errata configurazione del firewall pregiudica il funzionamento di altri servizi o, peggio, ci si espone a pericoli (informatici, ovvio) inutili. Qualcuno storcerà in naso per la soluzione adottata, cioè ogni buon amministratore di rete raramente fà coincidere il firewall con il server aziendale optando per un hardware esterno. Giusto. Ma questo esula dallo scopo di questa (breve) guida. Chi acquista dimestichezza con la materia non avrà nessuna difficoltà a farlo da sè, sia che opti per soluzioni software che hardware dedicate. Il consiglio che posso dare è (se possibile) disabilitare shorewall quando si prova un nuovo servizio per escludere problemi riconducibili ad un errato filtraggio dei pacchetti. Ad esempio se installo Samba e mi dimentico di permettere il traffico sulle sue porte tra il firewall e la rete locale inutile dire che non funzionerà un tubo. Quindi occhio: è fondamentale saper leggere i log di sistema per individuare i problemi !