Il mio Ubuntu e il firewall.

Ho scritto da qualche parte che sul mio portatile c’e’ anche una Ubuntu (c’e’ una partizione FreeBSD, una Opensolaris e una Ubuntu, per essere sinceri) e qualcuno mi ha scritto chiedendo che roba uso per il firewall. Probabilmente la gente si aspetta che io abbia chissa’ che cosa (in quel caso preferisco la primitiva robustezza di ipfw, a dire il vero) di fantascientifico. In realta’ non uso niente di quanto consigliato (firestarter, ufw, roba cosi’), e mi sono semplicemente fatto uno script per poter stare in pace sulla rete. Peraltro, la mia attuale linea DSL a Duesseldorf si comporta come un bridge, per cui quando sono a casa l’ IP con cui sono in rete ce l’ha la mia ethernet: non vengo nattato, quindi non sono protetto.

Temo quindi che rimarrete delusi, ma semplicemente volevo uno script facile che mi permettesse di sapere se tutto era andato a buon fine e se le tabelle fossero alzate. E’ una cosa primitivissima che alla fine si limita a non permettere nulla e a lasciarmi uscire con tutto, piu’ qualche ammennicolo. Contiene alcune cose Quick&Dirt per l’installazione semplice (dopo il ripristino della home directory su un altro PC Ubuntu), e basta.
Allora, la mia configurazione, circa, e’ basata su tre cose. Siccome spesso devo collegarmi via modem UMTS (quando sono di chiamata ma vado a spasso) allora devo ottimizzare le chiamate al DNS. Per questa ragione mi limito ad usare un pdnsd, cioe’ una cache delle entry sul dns.Ovviamente su ubuntu uso iptables, e per loggare uso rsyslogd. Inoltre voglio lasciare la porta 10000 aperta per avere la famosa porta da configurare nei software tipo torrent, col quale scarico software e altro, ovviamente tutto squisitamente legale. (e maschile. AH! La tauromachia!). Non voglio pero’ lasciare troppo gioco, quindi in definitiva permetto solo due connessioni TCP aperte per singolo IP.

Non so piu’ quali siano i pacchetti di default, ma per installarli dovrebbe bastare un

@sudo apt-get install iptables pdnsd rsyslogd

Dopodiche’, siccome lascio i miei script personali nella directory ~/bin , ho semplicemente creato uno script che alza il firewall , in questo modo:

$vi /home/uriel/bin/firewall.sh


#/bin/bash
#set -x


IPTABLES_CMD=`which iptables` 
INTERNAL_PORTS="53"
INTERNAL_USERS[53]="pdnsd"
LOG_LEVEL="4"
PROTO="tcp udp icmp"
SERVICES_AFFECTED="pdnsd rsyslog"

TABLES="mangle nat filter"
OPEN_PORTS="10000"


##################################
#
# Pulizie
#
##################################

echo -n "Il mio iptables: " && $IPTABLES_CMD -V

echo
echo "Ripuliamo le tabelle"


for a in $TABLES
do
echo "-Pulita $a:"
$IPTABLES_CMD -v --flush -t $a
done

echo "Ripuliamo le catene"
$IPTABLES_CMD -v -X

echo "Ripuliamo eventuali tabelle porche"
$IPTABLES_CMD -v -F

echo " "
#Definiamo le policy per la tabella mangle
echo "Definiamo le policy per la tabella mangle"

$IPTABLES_CMD -v -t mangle -P  PREROUTING ACCEPT
$IPTABLES_CMD -v -t mangle -P  INPUT ACCEPT
$IPTABLES_CMD -v -t mangle -P  FORWARD ACCEPT
$IPTABLES_CMD -v -t mangle -P  OUTPUT ACCEPT
$IPTABLES_CMD -v -t mangle -P  POSTROUTING ACCEPT

#Definiamo le policy per la tabella nat

echo "Definiamo le policy per la tabella nat"


$IPTABLES_CMD -v -t nat -P PREROUTING ACCEPT
$IPTABLES_CMD -v -t nat -P OUTPUT ACCEPT
$IPTABLES_CMD -v -t nat -P POSTROUTING ACCEPT

#Definiamo le policy per la tabella filter
echo "Definiamo le policy per la tabella filter"
$IPTABLES_CMD -v -t filter -P INPUT DROP
$IPTABLES_CMD -v -t filter -P FORWARD DROP
$IPTABLES_CMD -v -t filter -P OUTPUT ACCEPT

echo "Stato attuale delle tabelle"
$IPTABLES_CMD -L


##################################
#
# Pulizia //END
#
# Iniziamo con l'autopsia dei pacchetti morti
#
##################################

$IPTABLES_CMD -N analyze

for a in $PROTO
do
$IPTABLES_CMD -A analyze -p $a -j LOG --log-level $LOG_LEVEL --log-prefix "fw-ANA-$a:"
done

$IPTABLES_CMD -A analyze  -j DROP -m comment --comment "ANALYZED AND DESTROYED"


##################################
#
# Autopsia //END
#
# Dura lex sed lex
#
##################################

echo "Forwardiamo le porte internamente:"
for a in $INTERNAL_PORTS
do
echo "Utente: ${INTERNAL_USERS[$a]} , Porta $a"
$IPTABLES_CMD -t nat -A OUTPUT  -p tcp -m owner ! --uid-owner  ${INTERNAL_USERS[$a]} --dport $a -j LOG  --log-level $LOG_LEVEL --log-prefix "fw-tcp-$a-$b: "
$IPTABLES_CMD -t nat -A OUTPUT  -p tcp -m owner ! --uid-owner  ${INTERNAL_USERS[$a]} --dport $a -j DNAT --to 127.0.0.1:$a -m comment --comment "NAT"
$IPTABLES_CMD -t nat -A OUTPUT  -p udp -m owner ! --uid-owner  ${INTERNAL_USERS[$a]} --dport $a -j LOG  --log-level $LOG_LEVEL --log-prefix "fw-udp-$a-$b: "
$IPTABLES_CMD -t nat -A OUTPUT  -p udp -m owner ! --uid-owner  ${INTERNAL_USERS[$a]} --dport $a -j DNAT --to 127.0.0.1:$a -m comment --comment "NAT"
done
echo "...Ok."

echo "Apriamo le porte che ci servono:"
for a in $OPEN_PORTS
do
echo "Aperta: $a"
$IPTABLES_CMD -A INPUT -p tcp --dport $a -j ACCEPT -m comment --comment "IN-$a-tcp"
$IPTABLES_CMD -A INPUT -p udp --dport $a -j ACCEPT -m comment --comment "IN-$a-udp"
$IPTABLES_CMD -A INPUT -p tcp --syn --dport $a     -m connlimit --connlimit-above 2 -j analyze -m comment --comment "LIMIT-$a-tcp"
done
echo "...Ok."

echo -n "Settiamo  i TTL (32/1)"
$IPTABLES_CMD -t mangle -I POSTROUTING -o lo     -j TTL --ttl-set 1
$IPTABLES_CMD -t mangle -I POSTROUTING -o dummy0 -j TTL --ttl-set 1
$IPTABLES_CMD -t mangle -I POSTROUTING -o eth0   -j TTL --ttl-set 255 
$IPTABLES_CMD -t mangle -I POSTROUTING -o eth1   -j TTL --ttl-set 255
$IPTABLES_CMD -t mangle -I POSTROUTING -o wlan0  -j TTL --ttl-set 255 
$IPTABLES_CMD -t mangle -I POSTROUTING -o ppp0   -j TTL --ttl-set 255
echo "..Ok"

echo -n "-Traffico su localhost.." 
$IPTABLES_CMD -A INPUT  -i lo  -m comment --comment "Localhost-IN"  -j ACCEPT
$IPTABLES_CMD -A OUTPUT -o lo  -m comment --comment "Localhost-OUT" -j ACCEPT
echo "..Ok"

echo -n "Chiudiamo il resto e inviamolo in log"
$IPTABLES_CMD -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES_CMD -A OUTPUT -j ACCEPT  -m comment --comment "OUT-PERMITTED"
$IPTABLES_CMD -A INPUT  -j analyze -m comment --comment "IN-FORBIDDEN"
echo "..Ok"

##################################
#
# Dura lex //END
#
# Riavviamo e vediamo cosa abbiamo fatto
#
##################################

echo  "Costruiamo il logger:"
echo "if $msg contains 'fw-' then /var/log/firewall.log" > /etc/rsyslog.d/firewall.conf
cat /etc/rsyslog.d/firewall.conf
echo "..Ok."

echo  "Riavviamo i servizi che servono"
for a in $SERVICES_AFFECTED 
    do
    service $a restart
    done
echo "..Ok" 
    
echo -n "Creiamo il link verso /etc"
    ln -s -b /home/uriel/bin/firewall.sh /etc/firewall.sh
    
echo "..Ok"

echo ".Ok."
echo "-Fine configurazione:"
echo " "
echo " "
$IPTABLES_CMD -L
$IPTABLES_CMD -t nat -L OUTPUT


Quello che faccio e’ semplicemente far eseguire il file quando la macchina si collega in rete, oppure (a seconda) eseguirlo a mano.Di per se’ a quel punto il logger iniziera’ a loggare le attivita’ del firewall in /var/log/firewall.log.

Sul piano della rete (anche in questo sarete delusi) lo script non fa nulla di che: si limita a bloccare qualsiasi cosa in entrata (tranne la 10000) e a costringervi ad usare un dns locale che fa cache, in modo da velocizzare. Ovviamente il dns deve uscire (altrimenti non risolve) quindi la regola di passare per la cache NON deve valere per lui.

La parte dei link che trovate sotto e’ dovuta al fatto che non mi va di reinstallarlo ogni volta che faccio upgrade di ubuntu, o che lo reinstallo, per cui mi limito a farlo girare (tanto devo usare sudo comunque, altrimenti non funzionerebbe iptables) e lui si crea il link in /etc/firewall.sh. Visto che lo script e’ di proprieta’ di root, niente di che.Lo svantaggio e’ che vi logga molto, ma alla fine dei conti vi rendete conto di quanta merda vi arriva quando siete su internet.

Quindi sarete delusi, non e’ niente di speciale. Niente colori ultravivaci. Del resto, quando mi capita di vedere sullo IOS o sul firewall OS di Cisco  delle configuraizioni gigantesche tendo ad incazzarmi, perche’ e’ come cercarsi i guai.

Uriel