Voici le contenu du script fire-script.sh.
#!/bin/sh
# ------------------------------------------
# essai de firewall avec iptable
# le 29/11/2003
# Rév° 08/02/2004
# ------------------------------------------

script_start (){
        echo " "
        echo "initialisations"
        echo " "
        echo "chargement des modules de suivi/masquage pour ftp et irc"
        modprobe ip_conntrack_ftp
        modprobe ip_conntrack_irc
        
        # Activation de la passerelle
        echo "mise en place du forwarding"
        echo 1 > /proc/sys/net/ipv4/ip_forward
        
        # Pas de spoofing
        echo "no spofing"
        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 
        
        # Pas de synflood
        echo "no synflood"
        if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
                echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        fi
        
        # nous vidons toutes les chaines existantes
        echo "remise à zéro des tables..."
        iptables -F
        # idem pour les chaines perso
        iptables -X
        
        # Nouvelle chaine pour placer dans les log
        echo "Definition pour les log: intitulé dans syslog: '[IPTABLES DROP] : ' "
        iptables -N LOG_DROP
        iptables -A LOG_DROP -m limit --limit 15/minute -j LOG --log-prefix '[IPTABLES DROP] : '

        # nous faisons une chaine pour droper silencieusement:
        iptables -A LOG_DROP -j DROP
        
        # Nous faisons pointer sur DROP (effacement complet des paquets entrants)
        echo "interdiction de tout les paquets par defaut"
        iptables -P INPUT DROP
        iptables -P OUTPUT DROP
        iptables -P FORWARD DROP
        
        # Nous pointons les tables nat et mangle sur accept, toutes les autres 
        # (c'est à dire filter uniquement) pointent sur drop
        echo "tout sur 'nat' et 'mangle' est 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
        
        iptables -t mangle -F
        iptables -t mangle -X
        
        iptables -t mangle -P PREROUTING ACCEPT
        iptables -t mangle -P INPUT ACCEPT
        iptables -t mangle -P FORWARD ACCEPT
        iptables -t mangle -P POSTROUTING ACCEPT
        
        
        # Jusqu'ici, rien ne passe:
        #  -> ni du net vers le serveur
        #  -> ni du reseau local vers le serveur
        #  -> ni du serveur vers le reseau local
        #  -> ni du serveur vers lui même
        
        # Ouvrons quelques portes en considerans le resau local 'sûr'
        
        # Les process locaux peuvent parler entre eux
        echo " "
        echo "autorisation sur 'lo'"
        iptables -A INPUT -i lo -j ACCEPT
        iptables -A OUTPUT -o lo -j ACCEPT
        
        # On veut pouvoir ouvrir une connexion avec le modem adsl
        # iptables -A INPUT -i eth0 -j ACCEPT
        echo "regle en attente..."
        # iptables -A OUTPUT -o eth0 -j ACCEPT
        echo "regle en attente..."
        
        
        # Le reseau local peut aussi parler avec le serveur
        echo "autorisation pour: "
        echo " -> ncc1701d -> eth1"
        iptables -A INPUT -i eth1 -j ACCEPT
        echo " -> ncc1701d <- eth1"
        iptables -A OUTPUT -o eth1 -j ACCEPT
        echo " -> ncc1701d -> usb0"
        iptables -A INPUT -i usb0 -j ACCEPT
        echo " -> ncc1701d <- usb0"
        iptables -A OUTPUT -o usb0 -j ACCEPT
        echo " -> ncc1701d -> wlan0"
        iptables -A INPUT -i wlan0 -j ACCEPT
        echo " -> ncc1701d <- wlan0"
        iptables -A OUTPUT -o wlan0 -j ACCEPT
        
        # A present, on peut pinger en interne, uniquement, mais on ne
        # peut pas encore allez sur le net
        
        # On accept les connexions du reseau local vers le net
        echo "forwarding pour: "
        echo " -> eth1 -> ppp0"
        iptables -A FORWARD -i eth1 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
        echo " -> usb0 -> ppp0"
        iptables -A FORWARD -i usb0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
        echo " -> wlan0 -> ppp0"
        iptables -A FORWARD -i wlan0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
        # On accept les connexions venant du net UNIQUEMENT si ce celles-ci
        # on ete initialisees par le reseau local
        echo "accepter les paquets en réponse à une demande du réseau local: "
        echo " -> ppp0 -> eth1"
        iptables -A FORWARD -i ppp0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
        echo " -> ppp0 -> usb0"
        iptables -A FORWARD -i ppp0 -o usb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
        echo " -> ppp0 -> wlan0"
        iptables -A FORWARD -i ppp0 -o wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT
        
        # Ouvrons le net  pour les clients traversant le serveur
        echo "masquerade"
        echo " -> reseau 192.168.2.0/24"
        iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
        echo " -> reseau 192.168.3.0/24"
        iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o ppp0 -j MASQUERADE
        
        # Jusqu'ici, le serveur peut parler avec le reseau local, mais pas avec le net
        # (mais le reseau local peux parler avec le net)
        # de plus, le net ne peut pas parler avec le serveur (ni avec le reseau local,
        # sauf pour les connexions déjà établies depuis les hotes du reseau local)
        
        # On va ouvrir quelques portes du serveur vers le net
        echo " "
        echo "ouverture de quelques portes:"
        # le dns:
        echo " - requetes dns serveur -> net"
        iptables -A OUTPUT -o ppp0 -p udp --sport 1024: --dport 53 -m state --state ! INVALID -j ACCEPT
        echo " - réponses de net aux demandes du serveur"
        iptables -A INPUT -i ppp0 -p udp --sport 53 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
        
        # le courrier (smtp):
        echo " - courrier smtp serveur -> net"
        iptables -A OUTPUT -o ppp0 -p tcp --sport 1024: --dport 25 -m state --state ! INVALID -j ACCEPT
        echo " - réponse du net aux requetes smtp d'exim"
        iptables -A INPUT -i ppp0 -p tcp --sport 25 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
        
        # on doit pouvoir récupérer du courrier via fetchmail sur le port 110 (pop3)
        echo " - courrier pop3 serveur -> net"
        iptables -A OUTPUT -o ppp0 -p tcp --dport 110 -m state --state ! INVALID -j ACCEPT
        echo " - réponse du net aux requetes pop3"
        iptables -A INPUT -i ppp0 -p tcp --sport 110 -m state --state RELATED,ESTABLISHED -j ACCEPT

        # wwwoffle doit pouvoir allez sur le net
        echo " - proxy du serveur -> net"
        iptables -A OUTPUT -o ppp0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
        echo " - réponse du net aux requetes de wwwofle"
        iptables -A INPUT -i ppp0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
        
        # leafnode doit pouvoir allez sur le net
        echo " - leafnode du serveur -> net"
        iptables -A OUTPUT -o ppp0 -p tcp --dport 119 -m state --state NEW,ESTABLISHED -j ACCEPT
        echo " - réponse du net aux requetes de leafnode"
        iptables -A INPUT -i ppp0 -p tcp --sport 119 -m state --state ESTABLISHED -j ACCEPT
        
# ----------------------------------------------
        # le ftp doit passer du serveur vers internet:
        echo " - requete ftp (actif et passif) du serveur -> net"
        echo " - réponse du net aux requetes ftp"
        iptables -A INPUT  -p tcp -m tcp --sport ftp -m state --state ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -p tcp -m tcp --dport ftp -m state --state NEW,ESTABLISHED -j ACCEPT
        # active FTP
        iptables -A INPUT  -p tcp -m tcp --sport ftp-data -m state --state ESTABLISHED,RELATED -j ACCEPT
        iptables -A OUTPUT -p tcp -m tcp --dport ftp-data -m state --state ESTABLISHED -j ACCEPT
        # passive FTP
        iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT

        # Maintenant, on veux acceder depuis le net, à divers service du serveur.
        echo " "
        echo "ouverture des ports pour l'acces du net vers mes serveurs:"
        # ssh:
        echo " -> ouverture ssh net -> serveur"
        iptables -A INPUT -p tcp --dport 22 -i ppp0 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport 22 -o ppp0 -j ACCEPT
        
        # le serveur apache:
        echo " -> ouverture http net -> serveur"
        iptables -A INPUT -p tcp --dport www -i ppp0 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport www -o ppp0 -j ACCEPT
        
        # le serveur ftp?
        echo " -> ouverture ftp net -> serveur"
        # iptables -A INPUT -p tcp --dport www -i ppp0 -j ACCEPT
        # iptables -A OUTPUT -p tcp --sport www -o ppp0 -j ACCEPT
        
        # la partie sécurisee du  serveur apache:
        echo " -> ouverture https net -> serveur"
        iptables -A INPUT -p tcp --dport https -i ppp0 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport https -o ppp0 -j ACCEPT
        
        # Nous ouvrons 'un peu' sur le protocole ICMP, au moins pour récupérer les
        # messages d'erreurs pour nos propres demandes (du serveur car nous avions
        # déjà tout ouvert pour les hotes du reseau local)
        echo "Autorisation de réponse(s) icmp"
        iptables -A INPUT -p icmp -m state --state RELATED -j ACCEPT
        
        # ---------------------------------------------------------------------------------
        # Toutes les règles qui n'ont pas passé les
        # règles du firewall seront refusées et loguées...
        # facile :
        echo "---------------------------------------------------------------------------------"

        echo "on bloque silencieusement certains ports"
# *************************************
# les services fermés silencieusement
# *************************************
#       for p in auth
#       do
#         iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
#       done

#        for p in netbios-ns microsoft-ds
#        do
           echo "port 135"
           p=135
           iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
           iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
           echo "port 136"
           p=136
           iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
           iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
           echo "port 137"
           p=137
           iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
           iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
           echo "port 138"
           p=138
           iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
           iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
           echo "port 4762"
           p=4762
           iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
           iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
#        done

        echo "tous les paquets qui ne sont pas valables iront dans /var/log/syslog"
        iptables -A FORWARD -j LOG_DROP
        iptables -A INPUT -j LOG_DROP
        iptables -A OUTPUT -j LOG_DROP 
        echo "---------------------------------------------------------------------------------"
        
        # ---------------------------------------------------------------------------------
        echo "Fin"
}

script_stop() {

        echo " "
        echo "Arret du firewall"
        echo " "

        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

        iptables -t mangle -F
        iptables -t mangle -X
        iptables -t mangle -P PREROUTING ACCEPT
        iptables -t mangle -P OUTPUT ACCEPT

        echo " [pare-feu desactivé! ]"
}

script_restart() {
        script_stop
        sleep 2
        script_start
}

case "$1" in
        'start')
                script_start
        ;;
        'stop')
                script_stop
        ;;
        'restart')
                script_restart
        ;;
        'status')
                iptables -L
                iptables -t nat -L
                iptables -t mangle -L
        ;;
        *)
                echo "Usage: fire-script.sh {start|stop|restart|status}"
esac

Ce site est continuellement en chantier, surtout la partie 'Journal de bord' (cf 'Documentations').
Cependant, vous pouvez quand même me contacter et me donner vos avis/idées/corrections à rsuinux <at> gmx.fr

Mise en place du site:   11 Juillet 2001     Dernière mise à jour: 22/11/04

Vous êtes     à être passé me voir!

Valid HTML 4.01! Valid CSS!