Shorewall

Shorewall introduzione

Questa è solo una intro vedere la parte più interessante shorewall con più ip pubblici

Pagina che prima stava dentro quella dei firewall in generale ma ora che sta crescendo merita una pagina sua

Uno strumento che consente di avere un livello di astrazione e quindi una più facile configurazione di un firewall basato su iptables è shorewall.
L'ho studiato partendo da questa introduzione

What is Shorewall?

Shorewall legge i file di configurazione con l'aiuto di iptables, iptables-restore, ip and tc utilities configura Netfilter e la rete di linux. Non ha compatibilità con Netfilter ipchains e questo permette di disporre delle possibilità di connection state tracking. Shorewall non è un demone ma effettua solo la configurazione. Il programma però può essere usato per monitorare il traffico netfilter.
Ci sono due valide alternative http://www.kmyfirewall.org/ e http://www.fs-security.com/ che però secondo la guida sono meno potenti.

Shorewall Concepts

Le impostazioni di configurazione sono contenute in /etc/shorewall.
Shorewall vede la rete come una serie di zone.

#NAME                  DESCRIPTION
fw                     The firewall itself
net                    The Internet
loc                    Your Local Network
dmz                    Demilitarized Zone

Il file di configurazione delle zone è /etc/shorewall/zones
Eccone un esempio
#ZONE   TYPE    OPTIONS                  IN                          OUT
#                                                OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4
dmz     ipv4

Sono solo configurazione di nomi la prima identifica il firewall stesso. Il nome fw si trova dentro la variabile $FW che può essere usato attraverso la configurazione di shorewall per riferirsi alla zona firewall.

Per definire gli host/s alle zone e associarli alle interfacce c'è il firewall /etc/shorewall/interfaces

#ZONE     INTERFACE     BROADCAST     OPTIONS
net            eth0              detect            dhcp,routefilter
loc            eth1              detect
dmz          eth2              detect

Nell'esempio sopra una zona corrisponde a una interfaccia di rete. Per far corrispondere invece a delle reti magari definite sulla stessa interfaccia si può fare così.

#ZONE      INTERFACE     BROADCAST     OPTIONS
net        eth0          detect        dhcp,routefilter,nets=(!192.168.0.0/23)
loc        eth1          detect        nets=(192.168.0.0/24)
dmz        eth2          detect        nets=(192.168.1.0/24)

Il ! indica l'esclusione.

Per definire singoli host bisogna usare il file /etc/shorewall/hosts
Le policy di default per la gestione dei pacchetti stanno in /etc/shorewall/policy le più tipiche sono le seguenti

  • ACCEPT - Accept the connection.
  • DROP - Ignore the connection request.
  • REJECT - Return an appropriate error to the connection request.

Per definire le eccezioni a queste policy c'è il file /etc/shorewall/rules . Non c'è bisogno di preoccuparsi dei pacchetti che hanno una connessione stabilita e come le connessioni vengono manipolate (per esempio i pacchetti di errore e le richieste che usano tcp come ftp.)

Per ogni richiesta che entra nel firewall prima viene controllata nel file rules se non viene trovata nessuna regola allora si passa al file policy. Se c'è un'azione di default definita nella policy /etc/shorewall/shorewall.conf l'azione è invocata prima della policy. Nelle distribuzioni standard di shorewall la policy DROP ha un'azione di default chiamata Drop e la policy di REJECT ha un'azione chiamata Reject. Ecco un file delle policy

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

Le azioni di default sono usate per fare il discard di certi pacchetti in modo silenzioso in mono da non ingombrare il log.
Se si leva il commento alla regola superiore il firewall ha pieno accesso a internet.
Le policy definite a livello superiore permettono tutte le connessioni dalla rete locale ad internet.
Drop= scartano tutte le connessioni dal internet al firewall o alla rete locale, tranne se non si leva il commento. Questo tipo di connessioni è necessario che vengano loggate usando la priorità info syslog priority (log level)
Se si leva la riga di commento accetterà tutte le connessioni dalla rete verso il firewall
Tutte le altre connessioni verranno reject e verranno loggate.

Shorewall non ha un controllo diretto di dove le informazioni vengono loggate ma dipende dal demone di loggin (syslog, rsyslog, syslog-ng, ulogd, etc.). Il LOGFILE /etc/shorewall/shorewall.conf dice dove trovare il log. Per maggiori info http://www.shorewall.net/shorewall_logging.html

Per fare in modo che shorewall consenta l'accesso via ssh che usa la porta 22 nel file delle rules mettere

#ACTION    SOURCE    DEST        PROTO    DEST PORT(S)
ACCEPT         net               $FW        tcp         22

File di setup per configurazioni comuni si possono trovare http://www.shorewall.net/shorewall_quickstart_guide.htm
Mentre per esempi un po' più complessi http://www.shorewall.net/shorewall_setup_guide.htm
Per un controllo più fino dei log http://www.shorewall.net/shorewall_logging.html

Compile then Execute

Per attivare e disattivare shorewall manualmente vedere in basso le regole nel riquadro

Si esegue un approccio di compilazione ed esecuzione. Se la compilazione non va buon fine non viene messo niente in esecuzione. Gli script per la compilazione sono in /var/lib/shorewall e sono chiamati al corrispondente comando che viene eseguito. Per esempio /sbin/shorewall start genererà uno script chiamato /var/lib/shorewall/.start . Se la compilazione è senza errore lo script verrà eseguito e copierà se stesso in /var/lib/shorewall/firewall . Quando un /sbin/shorewall stop or /sbin/shorewall clear vengono eseguiti in seguenza il /var/lib/shorewall/firewall viene lanciato per compiere le operazioni richieste.

In debian ho solo lanciato

/etc/init.d/shorewall restart

Altre guide segnalate

Con un solo ip pubblico http://www.shorewall.net/three-interface.htm
Con più ip pubblici disponibili http://www.shorewall.net/shorewall_setup_guide.htm

Shorewall con più ip pubblici

Andiamo ad analizzare questo caso perchè è quello che al momento mi serve.

Shorewall Concepts

zones

Creiamo il file delle zones
/etc/shorewall/zones

#ZONE       TYPE             OPTIONS
fw          firewall
net         ipv4
loc         ipv4
dmz       ipv4

il firewall viene visto come una zona ed è memorizzato nella variabile $FW quando il file zones viene processato.
Tranne per fw il firewall non fa niente alle zone servono solo come riferimento per l'amministratore.

policy

Definiamo le policy
/etc/shorewall/policy

#SOURCE ZONE     DESTINATION ZONE    POLICY     LOG LEVEL    LIMIT:BURST
loc              net                 ACCEPT
net              all                 DROP       info
fw        net            ACCEPT        info
all              all                 REJECT     info
  • questo dice che gli utenti della mia area locale possono accedere ad internet loc —> net
  • che dalla rete verso tutte le altre zone non si possa entrare drop
  • tutto il resto viene usato il reject in modo che eventualmente si possa capire che succede.
  • senza la terza regola il firewall non naviga

Network Interfaces

Definiamo le interfacce

/etc/shorewall/interfaces
Vediamo due esempi semplice e con più interfacce per una zona.

Semplice

#ZONE    INTERFACE      BROADCAST     OPTIONS
net      eth0           detect
loc      eth1           detect
dmz      eth2           detect

Più interfacce su una zona

#ZONE    INTERFACE      BROADCAST     OPTIONS
net      eth0           detect
loc      eth1           detect
loc      eth2           detect

Si possono definire zone più complicate usando il file /etc/shorewall/hosts ma nella maggior parte dei casi non è necessario.

Addressing, Subnets and Routing

qui c'è tutta una parte che spiega come funzionano le reti e gli strumenti, niente di nuovo.

Setting Up Your Network

Ci sono due sezioni routed se il firewall deve ruotare i pacchetti perchè diretti a una sottorete di indirizzi ip pubblici e non routerd se invece i pacchetti sono inoltrati direttamente.

Se il firewall deve ruotare i pacchetti bisogna impostare dentro shorewall.conf la direttiva

IP_FORWARDING=On

Routed

Dato che il router ha un'interfaccia per ogni sottorete grazie alla sola tabella di routing gira i pacchetti tranquillamente.

Non-routed

Dato che la maggior parte delle volte non si hanno a disposizione molti ip pubblici si dovrà ricorrere ad altri strataggemmi per far funzionare il tutto.

SNAT

Quando si deve uscire tramite internet mascherando gli indirizzi ip privati con un unico ip pubblico si deve usare il file
/etc/shorewall/masq
ecco un esempio

#INTERFACE     SUBNET               ADDRESS
eth0           192.168.201.0/29     192.0.2.176

dove:

  • eth0 è l'interfaccia pubblica che esce su internet
  • 192.168.201.0/29 è la rete interna che dev'essere nattata
  • 192.0.2.176 è l'indirizzo pubblico con cui tutti devono uscire.

Questa è la configurazione base tutti escono con lo stesso indirizzo ma si possono fare configurazione più complesse.

DNAT

Fa l'opposto del source nat cioè permette le connessioni dall'esterno verso l'interno ecco l'esempio. Il file da modificare è quello delle rules /etc/shorewall/rules

#ACTION  SOURCE  DEST               PROTO  DEST    SOURCE    ORIGINAL
#                                          PORT(S) PORT(S)   DEST
DNAT     net     loc:192.168.201.4  tcp    www

dove net è la zona da cui vengono le richieste loc e la zona di destinazione e poi vi è la porta di destinazione

Proxy ARP

se si hanno ip pubblici nella dmz che si vogliono usare girando i pacchetti dall'interfaccia pubblica, al momento non mi server.

One-to-one NAT

mapping diretto ip pubblici verso privati

Rules

Con le impostazioni settate fin'ora c'è un accesso completo sicuramente vogliamo restringerlo.

Ecco le rules che si possono indicare per fare il ping tra le zone

#ACTION  SOURCE  DEST               PROTO  DEST   
#                                          PORT(S)
ACCEPT   net     dmz                icmp   echo-request
ACCEPT   net     loc                icmp   echo-request
ACCEPT   dmz     loc                icmp   echo-request
ACCEPT   loc     dmz                icmp   echo-request

Ecco altri esempi di comunicazione per pop3 e web server

#ACTION  SOURCE          DEST               PROTO  DEST    COMMENTS 
#                                                  PORT(S)
ACCEPT   net             dmz:192.0.2.178    tcp    smtp    #Mail from
                                                           #Internet
ACCEPT   net             dmz:192.0.2.178    tcp    pop3    #Pop3 from
                                                           #Internet
ACCEPT   loc             dmz:192.0.2.178    tcp    smtp    #Mail from local
                                                           #Network
ACCEPT   loc             dmz:192.0.2.178    tcp    pop3    #Pop3 from local
                                                           #Network
ACCEPT   $FW             dmz:192.0.2.178    tcp    smtp    #Mail from the
                                                           #Firewall
ACCEPT   dmz:192.0.2.178 net                tcp    smtp    #Mail to the
                                                           #Internet
ACCEPT   net             dmz:192.0.2.177    tcp    http    #WWW from
                                                           #Internet
ACCEPT   net             dmz:192.0.2.177    tcp    https   #Secure WWW
                                                           #from Internet
ACCEPT   loc             dmz:192.0.2.177    tcp    https   #Secure WWW
                                                           #from local
                                                           #Network

Qui invece le regole per usare un server dns

#ACTION  SOURCE          DEST               PROTO  DEST    COMMENTS 
#                                                  PORT(S)
ACCEPT   net             dmz:192.0.2.177    udp    domain  #UDP DNS from
                                                           #Internet
ACCEPT   net             dmz:192.0.2.177    tcp    domain  #TCP DNS from
                                                           #Internet
ACCEPT   loc             dmz:192.0.2.177    udp    domain  #UDP DNS from
                                                           #Local Network
ACCEPT   loc             dmz:192.0.2.177    tcp    domain  #TCP DNS from
                                                           #Local Network
ACCEPT   $FW             dmz:192.0.2.177    udp    domain  #UDP DNS from
                                                           #the Firewall
ACCEPT   $FW             dmz:192.0.2.177    tcp    domain  #TCP DNS from
                                                           #the Firewall
ACCEPT   dmz:192.0.2.177 net                udp    domain  #UDP DNS to
                                                           #the Internet
ACCEPT   dmz:192.0.2.177 net                tcp    domain  #TCPP DNS to
                                                           #the Internet

E qui le regole per comunicare con il firewall

#ACTION  SOURCE          DEST               PROTO  DEST    COMMENTS 
#                                           PORT(S)
ACCEPT   loc             dmz                tcp    ssh     #SSH to the DMZ
ACCEPT   net             $FW                tcp    ssh     #SSH to the
                                                           #Firewall

Odds and Ends

Qui vi è un esempio di configurazione che non riporto

DNS

separare interno ed esterno del dns , sembra interessante

Some Things to Keep in Mind

Tutti gli indirizzi ip configurati sul firewall sono nella zona $FW (fw)

Starting and Stopping the Firewall

Ecco i comandi

shorewall start
shorewall stop
shorewall restart
shorewall clear # per rimuover ogni traccia del firewall
shorewall version # per sapere che versione c'è installata

/etc/shorewall/routestopped
ci stanno gli host che possono funzionare, non ho capito ancora il modo, quando si lancia shorewall stop

Shorewall come servizio o Shorewall Installation and Upgrade

La pagina per le installazioni è http://www.shorewall.net/Install.htm
Fare l'installazione su ubuntu server così

apt-get update
apt-get install shorewall

Dopo che la configurazione sopra è stata completata
setting startup=1 in /etc/default/shorewall.

Aggiornare shorewall all'ultima versione

Su ubuntu 10.04 dove ho installato e usato parecchio shorewall installandolo dai repository si ha la versione 4.4.6 (o 4.4.8) in ongi caso una versione abbastanza indietro rispetto all'ultima e quindi manca di alcune funzionalità importanti.
Scaricando il tar decomprimendolo e lanciando install.sh viene aggiornato tutto senza problemi e controllando di nuovo la versione shorewall version si vede che è stato aggiornato.

Salvo diversa indicazione, il contenuto di questa pagina è sotto licenza Creative Commons Attribution-ShareAlike 3.0 License