@sudo apt-get install iptables pdnsd rsyslogd
$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
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.
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