#!/bin/sh
# /etc/init.d/firewall
# Script de configuration "netfilter/iptables"
#
# Exécuter : # update-rc.d firewall start 40 S . stop 89 0 6 .
# (Lire les documents dans /usr/share/doc/iptables/)
#
# Ce script est pour une machine "isolé" qui possèdes des accès internet.
# Il est basé sur la lecture de 
# http://olivieraj.free.fr/fr/linux/information/firewall/
# http://lea-linux.org/reseau/iptables.html
# http://www.trustonme.net/didactels/112.html
#
# Remarque : les modules kernel nécessaires sont chargés automatiquement 
# par le kernel


start() {

        echo "Démarrage du firewall..."

        ######################################
        # Désactivation de IP forwarding
        echo 0 > /proc/sys/net/ipv4/ip_forward
        # Je ne veux pas de spoofing
        if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
        then
          for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
            do
              echo 1 > $filtre
          done
        fi

        # Je ne veux pas de icmp (donc bloque les pings)
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
        echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
        #########################################

        #########################################
        # Initialisation de la tables filter et la politiques par défaut
        iptables -F
        iptables -X
        iptables -P INPUT   DROP
        iptables -P FORWARD DROP
        iptables -P OUTPUT  DROP

        # On va rajouter 2 nouvelles chaînes.
        # Ceci permettra d'ajouter des nouvelles cibles qui
        # auront la possibilité de loguer ce qui se passe.

        # Ici, on logue et on refuse le paquet,
        # on rajoute un préfixe pour pouvoir
        # s'y retrouver dans les logs
        iptables -N LOG_DROP
        iptables -A LOG_DROP -j ULOG --ulog-prefix='[IPTABLES DROP] :'
        iptables -A LOG_DROP -j DROP

        # Ici, on logue et on accepte le paquet,
        # on rajoute un préfixe pour pouvoir
        # s'y retrouver dans les logs
        iptables -N LOG_ACCEPT
        iptables -A LOG_ACCEPT -j ULOG --ulog-prefix='[IPTABLES ACCEPT] : '
        iptables -A LOG_ACCEPT -j ACCEPT

        # Pas de filtrage sur l'interface "loopback"
        iptables -A OUTPUT -o lo -p all -j ACCEPT
        iptables -A INPUT  -i lo -p all -j ACCEPT

        # Règles de connexion à Internet
        # Seul les connexions initialisés par la machine sont autorisées
        # C'est le suivit de connexion
        # Chargement des modules pour le suivit de connexion : 
        #modprobe ip_conntrack
        #modprobe ip_conntrack_ftp
        #modprobe ip_conntrack_irc
        #ce chargement est devenue automatique par le kernel
        #je le laisse ici pour information
        #
        iptables -A OUTPUT -j ACCEPT
        iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

        # J'autorise deux PC l'accés à mon PC pour apache et ssh
        # Leur adresse IP ou hostname 
        IP1=xxx.xxx.xxx.xxx
        IP2=xxx.xxx.xxx.xxx

        ## Serveur web
        # Pas de restriction :
        #iptables -A INPUT -p tcp --dport 80 -j LOG_ACCEPT
        # Restriction et aussi préciser l'interface ppp0 :
        #iptables -A INPUT -i ppp0 -s $IP1 -p tcp --sport  1024:65535  --dport 80 -m state --state NEW -j LOG_ACCEPT
        # Restriction :
        iptables -A INPUT -s $IP1 -p tcp --sport  1024:65535  --dport 80 -m state --state NEW -j LOG_ACCEPT
        iptables -A INPUT -s $IP2 -p tcp --sport  1024:65535  --dport 80 -m state --state NEW -j LOG_ACCEPT

        ## Serveur ssh
        # Pas de restriction :
        #iptables -A INPUT -p tcp --dport 22 -j LOG_ACCEPT
        # Restriction et aussi préciser l'interface ppp0 :
        #iptables -A INPUT -i ppp0 -s $IP1 -p tcp --sport 1024:65535 --dport 22 -j LOG_ACCEPT
        # Restriction :
        iptables -A INPUT -s $IP1 -p tcp --sport  1024:65535 --dport 22 -j LOG_ACCEPT
        iptables -A INPUT -s $IP2 -p tcp --sport  1024:65535 --dport 22 -j LOG_ACCEPT

        ## Pour pouvoir utiliser GnomeMeeting
        #iptables -A INPUT -p tcp --dport 30000:30010 -j ACCEPT
        #iptables -A INPUT -p tcp --dport 1720 -j ACCEPT
        #iptables -A INPUT -p udp --dport 5000:5003 -j ACCEPT

        ## Pour pouvoir utiliser mldonkey
        #EDONKEY_PORT=4662
        #OVERNET_PORT=5865
        #BITTORRENT_PORT=6882
        #OPENNAP_PORT=9999
        ## MLDonkey acting as Edonkey2000 client
        #iptables -A INPUT -p tcp -m tcp --dport $EDONKEY_PORT -j ACCEPT
        #iptables -A INPUT -p udp -m udp --dport $(($EDONKEY_PORT + 4)) -j ACCEPT
        ## MLDonkey acting as Overnet client
        #iptables -A INPUT -p tcp -m tcp --dport $OVERNET_PORT -j ACCEPT
        #iptables -A INPUT -p udp -m udp --dport $OVERNET_PORT -j ACCEPT
        ## MLDonkey acting as BitTorrent client
        #iptables -A INPUT -p tcp -m tcp --dport $BITTORRENT_PORT -j ACCEPT
        ## MLDonkey acting as OpenNap client
        #iptables -A INPUT -p tcp -m tcp --dport $OPENNAP_PORT -j ACCEPT

        # Toutes les règles qui n'ont pas passé les
        # règles du firewall seront refusées et loguées.
        iptables -A FORWARD -j LOG_DROP
        iptables -A INPUT -j LOG_DROP
        iptables -A OUTPUT -j LOG_DROP
        ############################################

        #############################################
        # Initialisation de la tables nat et la politiques par défaut
        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -P PREROUTING  ACCEPT
        iptables -t nat -P OUTPUT      ACCEPT
        iptables -t nat -P POSTROUTING ACCEPT
        ################################################

        echo "...firewall activé!"

}

stop() {

        iptables -F
        iptables -X
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT

        iptables -t nat -F
        iptables -t nat -X
        iptables -t nat -P PREROUTING ACCEPT
        iptables -t nat -P POSTROUTING ACCEPT
        iptables -t nat -P OUTPUT ACCEPT

        echo "Firewall désactivé!"
}

restart() {
        stop
        sleep 2
        start
}

case "$1" in
        'start')
                start
        ;;
        'stop')
                stop
        ;;
        'restart')
                restart
        ;;
        'status')
                iptables -L -n -v
                iptables -t -n -v nat -L
        ;;
        *)
                echo "Usage: /etc/init.d/firewall {start|stop|restart|status}"
esac