• User

    Script Firewall automatico per PC desktop e server

    Analizza il sistema per individuare la scheda di rete connessa ad INTERNET, eventuale scheda connessa alla LAN e chiede conferma degli indirizzi IP e maschere di rete ed indirizzo del Router trovati.
    Visualizza le regole attuali delle catene di iptables e forma le nuove catene per configurare il FIREWALL
    Lo script seguente, chiamato firewall_Ubuntu81.sh, dovra' avere i permessi di esecuzione dati in una shell con il comando:
    chmod +x /percorso del file/firewall_Ubuntu81.sh
    dopodiche' si potra' mandarlo in esecuzione.
    Per verificare il buon funzionamento del Firewall andare sul sito di pcflank da dove potrete verificare:
    Stealth test
    Trojans test
    Advanced port scanner
    Exploits test
    e constatare cosi' il grado di sicurezza raggiunto.

    
    #!/bin/bash
    #               Script firewall_Ubuntu81.sh
    # creato venerdì-28-novembre-2008 da xymaster con ZIDE1.sh
    #------------ Descrizione Script------------------
    # Analizza il sistema per individuare la scheda di rete connessa ad INTERNET, eventuale scheda connessa alla LAN
    # e chiede conferma degli indirizzi IP e maschere di rete ed indirizzo del Router trovati.
    # Visualizza le regole attuali delle catene di iptables e forma le nuove catene per configurare il FIREWALL
    
    #------------------variabili globali---------------
    IPTABLES=`which iptables`
    LOOPBACK="lo"
    INTERNET="Assente"
    LAN="Assente"
    NET="Assente"
    MASK="Assente"
    IP_INTERNET="Assente"
    IP_LAN="Assente"
    pass=""
    conf=""
    #-----------------funzioni-------------------------
    function domanda () {
    #chiamare con testo domanda
    #restituisce finestra con testo domanda con bottoni Ok per rispondere si o annulla per rifiutare
        zenity --question --text "$1"
    }
    function avviso () { con testo messaggio tipo messaggio
    zenity --info --text="$1"
    }
    function errore () { con testo messaggio tipo messaggio
    zenity --error --text="$1"
    }
    function attenzione () { con testo messaggio tipo messaggio
    zenity --warning --text="$1"
    }
    
    gest_err (){
    if [ $? != 0 ]
    then 
    gdialog --title "Visualizza Errori" --textbox /tmp/prv.$$ 22 72
    elif [ $# = 1 ];then
            avviso "$1 OK"
    fi
    rm -rf /tmp/prv.$$ 2> /dev/null
    }
    
    function get_password () {
    local utente_attivo=$(whoami)
    pass=`zenity --entry --hide-text --text="immetti la password di $utente_attivo:"`
    #azzera il timestamp di sudo (quello che vi consente di non digitare la password se ripetete sudo entro tot tempo)
    sudo -k
    #cancella completamente il timestamp
    sudo -K
    #verifica validita' password
    echo "$pass" | sudo -S ls > /dev/null
    if [ $? != 0 ];then
    errore "Password errata. Termino lo script"
    exit 1
    fi
    }
    if [ $EUID -ne 0 -a "x$1" != "x--" ]
    then
        attenzione "Lo script richiede l'esecuzione con i permessi di root. Riparto come ROOT"
        get_password
        echo "$pass" | sudo -S $0 "--">|/tmp/prv.$$ 2>&1;gest_err
        exit 0
    fi
    
    #-------Inizio Script-------------------------
    #analizzo /etc/resolv.conf 
    gw=`cat /etc/resolv.conf`
    #trovo IP router 
    IP_GW=`echo ${gw##*nameserver} | cut -d ' ' -f1`
    #prelevo primi 3 ottetti IP
    eth=`echo $IP_GW | cut -d . -f1,2,3`
    
    #scansiono tutte le schede di rete ...
    ifconfig -a | cut -d ' ' -f1 | tr '\n' ' ' > /tmp/prv.$$
    for scheda in $(sed -e '/^$/d' /tmp/prv.$$); do
    ipaddr=`ifconfig "$scheda" | grep inet | cut -d: -f2 | cut -d ' ' -f1`
    if [ "$ipaddr" != "" -a "$scheda" != "lo" ];then
    #se indirizzo IP scheda di rete ha i primi 3 ottetti uguali a quelli dell'IP del router
    if [ `echo $ipaddr | cut -d . -f1,2,3` = $eth ];then
        INTERNET="$scheda"
        IP_INTERNET="$ipaddr"
        MASK=`ifconfig "$scheda" | grep inet`
        MASK=`echo ${MASK##*Mask:} | cut -d ' ' -f1`
    else 
        LAN="$scheda"
        IP_LAN="$ipaddr"
        NET="`echo $ipaddr | cut -d . -f1,2,3`.0/24"
    fi
    fi
    done
    rm -f /tmp/prv.$$
    if ! domanda "---Configurazione Internet-----\nScheda $INTERNET - IP $IP_INTERNET\nMask $MASK IP router $IP_GW\n\n---Configurazione LAN---\nScheda $LAN - IP $IP_LAN\n - Rete $NET\n\nConfermi?";then
        exit
    else
         conf=`$IPTABLES -L`
         avviso "---IPTABLES senza FIREWALL---\n$conf"
    fi
    # puliamo tutto prima di applicare le nuove regole
    $IPTABLES -F
    $IPTABLES -t nat -F
    $IPTABLES -t mangle -F
    # impostiamo la policy per i pacchetti in ingresso
    # bloccando il traffico
    $IPTABLES -P INPUT DROP
    # impostiamo la policy per i pacchetti in transito
    # tra le interfacce bloccando il traffico
    $IPTABLES -P FORWARD DROP
    # impostiamo la policy per i pacchetti in uscita
    # abilitando il traffico
    $IPTABLES -P OUTPUT ACCEPT
    # poi facciamo in modo di accettare i pacchetti in entrata
    # che appartengono ad una connessione già esistente
    # o che sono correlati a connessioni preesistenti
    $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    if [ "$NET" != "Assente" ];then
    # abilitiamo il transito di pacchetti provenienti 
    # dalla rete interna (ad es. 192.168.0.*)
    $IPTABLES -A FORWARD -s $NET -j ACCEPT
    fi
    
    # abilitiamo il transito di pacchetti che appartengono
    # ad una connessione già esistente o che siano correlati
    # a connessioni preesistenti
    $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    if [ "$LAN" != "Assente" ];then
    $IPTABLES -A INPUT -i $LAN -m state --state NEW -p tcp -j ACCEPT
    fi
    
    $IPTABLES -A INPUT -i $INTERNET -m state --state NEW -j ACCEPT
    $IPTABLES -A INPUT -i $LOOPBACK -j ACCEPT
    $IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
    # abilitiamo i pacchetti icmp (il ping) per l'interfaccia
    # di loopback
    $IPTABLES -A INPUT -i $LOOPBACK -p icmp -j ACCEPT
    # abilitiamo i pacchetti icmp per la scheda di rete
    $IPTABLES -A INPUT -i $INTERNET -p icmp -j ACCEPT
    
    if [ "$NET" != "Assente" ];then
    # ora abilitiamo i pc della rete interna alla navigazione
    # in internet utilizzando la funzione NAT per un modem
    # condiviso con indirizzo ip dinamico assegnato dal
    # provider
    $IPTABLES -t nat -A POSTROUTING -s $NET -o $LAN -j MASQUERADE
    fi
    
    modprobe ip_nat_ftp
    modprobe ip_conntrack_ftp
    # e infine abilitiamo l'attraversamento dei pacchetti 
    # tra un'interfaccia e l'altra
    echo 1 > /proc/sys/net/ipv4/ip_forward
         conf=`$IPTABLES -L`
         avviso "---IPTABLES con FIREWALL---\n$conf"
    # FINE SCRIPT #