Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 23 Sep 2004 10:11:59

smilebob
Apôtre du libre
 
Lieu: Sévenans, Territoire de Belfor
Date d'inscription: 23 Sep 2004
Messages: 81
Site web

[Script] Exemple De Firewall Utilisant Iptables (Source)

A mes début sous GNU/Linux, il j'ai très tôt ressenti le besoin d'implémenter un firewall en mettant en oeuvre le fabuleux outil qu'est IPTABLES. Mais au début, son utilisation peu parâitre complexe. C'est pourquoi je vous propose de vous inspirer du script que j'utilise comme firewall. Je sais certain diront qu'il n'est pas parfait, mais il n'est là que comme introduction à iptables et comme base de travail. Alors amusez-vous :

Code:






KIKOX=192.168.0.10 # La Passerelle
LINDOWS=192.168.0.20 # PC du réseau sous LinuX
WINDOWS=192.168.0.30 # PC du réseau sous Windows


AZGAARD=192.168.0.10/24


FIREWALL=$KIKOX


WEB=$KIKOX    # mettre "" si aucun serveur web
PORT=80       # le port du serveur web


FTP=$KIKOX
FTPPORT=21


DONKEY=$KIKOX


INTERNE="eth0" # : interface vers le réseau éthernet à  protéger
EXTERNE="ppp0" # : interface vers internet (ADSL)


IPTABLES=/sbin/iptables

mode=$1

case "$mode" in
    'start')
        echo  "SmileBoB Firewall: "    
    
        # on efface toutes les règles existantes
        for table in filter nat mangle; 
          do
            $IPTABLES -t $table -F
            $IPTABLES -t $table -X
        done
         
        # avant tout, on accepte tout ce qui vient du réseau interne 
        $IPTABLES -A INPUT -s $AZGAARD -j ACCEPT

        # on accepte toute les reponses associées au trafic sortant
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

        # on accepte les recherches DNS à partir des serveurs de nom connus (/etc/resolv.conf)
        for DNS in $(grep ^n /etc/resolv.conf | awk '{print $2}'); 
          do
            $IPTABLES -t filter -A INPUT -s $DNS -j ACCEPT
        done

    
        # on accepte les demandes de connexion ssh
        $IPTABLES -A INPUT -p tcp --destination-port ssh -j ACCEPT
    
        # si un serveur web est défini, on s'occupe de lui :)
        if [ -n "$WEB" ]
        then
            echo ""
            echo "Section WEB :"
            # on accepte les requêtes HTTP entrantes
            $IPTABLES -t filter -A INPUT -p tcp --source-port www -j ACCEPT
            $IPTABLES -t filter -A INPUT -p tcp --destination-port www -j ACCEPT
            echo " Port WWW $PORT ouvert : [OK]"
            
            if [ $FIREWALL != $WEB ]  # si le serveur web n'est pas sur la passerelle
            then
                # on pense a activer le port forwarding du firewall vers notre serveur web
                $IPTABLES -t nat -A PREROUTING -p tcp -d $FIREWALL --dport http -j DNAT --to $WEB:$PORT
                echo " Forwarding WWW sur $WEB port $PORT:  [OK]"
            fi
        fi

        if [ -n "$FTP" ]
            
            then
            echo ""
            echo "Section FTP :"
            #on accepte les requete ftp entrantes
            $IPTABLES -t filter -A INPUT -p tcp --source-port ftp -j ACCEPT
            $IPTABLES -t filter -A INPUT -p tcp --destination-port ftp -j ACCEPT
            echo " Port FTP $FTPPORT ouvert : [OK]"
            echo "interface web ouverte"
            if [ $FIREWALL != $FTP ] #si le serveur n'est pas sur la passerelle
                then
                # on forward 
                $IPTABLES -t nat -A PREROUTING -p tcp -d $FIREWALL --dport ftp -j DNAT --to $FTP:$FTPPORT
                echo " Forwarding FTP sur $FTP port $FTPPORT :  [OK]"
                fi
             fi
                 
        if [ -n "$DONKEY" ]
            then
            echo ""
            echo "Section Emule :"
            #on accept sur les port entrants par défault d'eMULE
                    $IPTABLES -A INPUT -p tcp --dport 4662 -j ACCEPT
            $IPTABLES -A INPUT -p tcp --dport 34037 -j ACCEPT
            $IPTABLES -A INPUT -p tcp --dport 34038 -j ACCEPT
            echo " Emule ouverture du port entrant 4662 : [OK]"
            $IPTABLES -A INPUT -p udp --dport 4672 -j ACCEPT
            echo " Emule ouverture du port entrant 4672 : [OK]"
           # on accepte les sorties pour emule
            $IPTABLES -A INPUT -p tcp --sport 4662 -j ACCEPT
            echo " Emule ouverture du port sortant 4662 : [OK]"
            $IPTABLES -A INPUT -p udp --sport 4672 -j ACCEPT
            echo " Emule ouverture du port sortant 4672 : [OK]"
             
        if [ $FIREWALL != $DONKEY ] 
            then
            # Redirection car emule n'est pas sur la passerelle
        $IPTABLES -t nat -I PREROUTING -p tcp -s ! $AZGAARD --dport 4662 -j DNAT --to $WINDOWS
            echo " Forwarding du port 4662 : [OK]"
            echo " Forwarding du port 4672 : [OK]"
            $IPTABLES -t nat -I PREROUTING -p udp -s ! $AZGAARD --dport 4672 -j DNAT --to $WINDOWS
            fi
            fi

           
            



        # on refuse et on entre dans le journal tout ce qui est entrant et qui n'est pas sur loopback 
        $IPTABLES -N logdeny
        $IPTABLES -t filter -A logdeny -j LOG --log-prefix "Pfirewall : "
        $IPTABLES -t filter -A logdeny -j DROP
        $IPTABLES -t filter -A INPUT -i ! lo -m state --state NEW,INVALID -j logdeny

    
        
        # on active la conversion d'adresse réseau (IP forwarding)

        if [ -n "$INTERNE" ]
        then
            echo 1 > /proc/sys/net/ipv4/ip_forward
            
            # on accepte les paquets entre internet et le réseau interne si :
            # - connexion existente
            # inititation d'une nouvelle conexion par un membre du réseau interne
            $IPTABLES -A FORWARD -i $EXTERNE -o $INTERNE -m state --state ESTABLISHED,RELATED -j ACCEPT
            $IPTABLES -A FORWARD -i $INTERNE -o $EXTERNE -j ACCEPT

            if [ $EXTERNE = ppp0 ]
            then
                # on convertit toute adresse IP sortante en l'IP externe du firewall (dynamique ici)
                $IPTABLES -t nat -A POSTROUTING -s $AZGAARD -o $EXTERNE -j MASQUERADE
   else
    # on convertit toute adresse IP sortante en l'IP externe du firewall (fixe ici)
    $IPTABLES -t nat -A POSTROUTING -o $EXTERNE -j SNAT --to $FIREWALL
            fi
        fi
            
        echo "[ OK ]"
    ;;

     'stop')
        echo 0 > /proc/sys/net/ipv4/ip_forward

        # on efface toutes les règles existantes
        for table in filter nat mangle; do
            $IPTABLES -t $table -F
            $IPTABLES -t $table -X
        done
    ;;
    
    *)
        echo "usage $0 start|stop"
    ;;
esac

LinuX c'est bien tout seul et c'est encore mieux à plusieurs smile
http://smilebob.ath.cx

Hors ligne

 

#2 30 Dec 2004 07:18:13

asteroid
Humain(e) libre
 
Lieu: Sud france - Nîmes (30)
Date d'inscription: 30 Dec 2004
Messages: 44
Site web

Re: [Script] Exemple De Firewall Utilisant Iptables (Source)

En voila un autre :

/etc/rc.d/firewall free, ouvre toutes les portes
/etc/rc.d/firewall start, active le firewall
/etc/rc.d/firewall restart, relance le firewall

Attention :
- Ce firewall est concu pour laisser passer les connexions vers un serveurs ftp situé sur une autre machine du réseau.

Code:

#!/bin/sh
#
# hacked by asteroid
#src : http://olivieraj.free.fr

fw_start() {
EXTIP="`ifconfig ppp0 | awk /ppp0/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
echo "ACTIVATION DU FIREWALL"
echo "-L'ip courante est $EXTIP"
echo "-Chargement des modules necessaire à iptables"
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc

#Activation du forwarding
echo "-Activation du forwading dans ip_forward"
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
DATA=1024:65535

######################
#     PURGE          #
######################

echo "-Mise à zero des règles et tables prédéfinies"
# Suppression de toutes les chaînes pré-définies de la table FILTER
iptables -t filter -F

# Suppression de toutes les chaînes utilisateur de la table FILTER
iptables -t filter -X

# Suppression de toutes les chaînes pré-définies de la table FILTER
iptables -t nat -F

# Suppression de toutes les chaînes utilisateur de la table FILTER
iptables -t nat -X

# Par defaut, toute les paquets sont détruits
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP

# Police par default sur la table nat 
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT


echo "-Mise en place des règles de filtrage"
########################################
# Autorise l'interface loopback à dialoguer avec elle-même #
########################################
iptables -t filter -A OUTPUT -o lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
iptables -t filter -A INPUT  -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT


##########################################
# Autorise les connexions avec le réseau connecté à l'interface eth0 #
##########################################
iptables -t filter -A OUTPUT -o eth0 -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -t filter -A INPUT  -i eth0 -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT

###########################################
# Autorise les connexions avec le réseau connecté à l'interface eth1    #
###########################################
iptables -t filter -A OUTPUT -o eth1 -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -A INPUT  -i eth1 -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT

###########################################
#     WELCOME IN RELITY ASTER !!          #
###########################################

# autorise tout ce qui sort et n'est pas INVALID (requetes initiales)
iptables -t filter -A OUTPUT -o ppp0 -p all -m state --state ! INVALID -j ACCEPT
# autorise tout ce qui rentre qui est deja etablie
iptables -t filter -A INPUT  -i ppp0 -p all -m state --state RELATED,ESTABLISHED -j ACCEPT

# autorise le traffic à transiter par eth0 pour conneceté local au net (client)
iptables -t filter -A FORWARD -i eth0 -o ppp0 -s 192.168.0.0/24 -m state --state ! INVALID -j ACCEPT
iptables -t filter -A FORWARD -i ppp0 -o eth0 -d 192.168.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT

# autorise le traffic à transiter par eth1 pour conneceté local au net (client)
iptables -t filter -A FORWARD -i eth1 -o ppp0 -s 192.168.1.0/24 -m state --state ! INVALID -j ACCEPT
iptables -t filter -A FORWARD -i ppp0 -o eth1 -d 192.168.1.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autorise le masquage d'ip pour que local communique avec le net
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE

# autorise le ping sur le reseau
iptables -t filter -A INPUT -i ppp0 -p icmp -m state --state ! INVALID -j ACCEPT
iptables -t filter -A OUTPUT -o ppp0 -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT

# autorise l'acces ssh depuis net sur fw
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

#translation de port pour le ftp

iptables -A OUTPUT -p tcp --dport ftp -o eth0 -j ACCEPT
iptables -A OUTPUT -p tcp --dport ftp-data -o eth0 -j ACCEPT 
iptables -A INPUT -p tcp --sport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --sport ftp-data -i eth0 -j ACCEPT 

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport ftp -j DNAT --to 192.168.0.2
iptables -A FORWARD -p tcp --dport ftp -j ACCEPT

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 20 -j DNAT --to 192.168.0.2
iptables -A FORWARD -p tcp --dport 20 -j ACCEPT

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport $DATA -j DNAT --to 192.168.0.2
iptables -A FORWARD -p tcp --dport $DATA  -j ACCEPT

iptables -A FORWARD -p tcp --dport ftp -i eth0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --sport ftp -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --sport 20 -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --dport 20 -i eth0 -o ppp0 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp --sport $DATA -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --dport $DATA -i eth0 -o ppp0 -m state --state ESTABLISHED -j ACCEPT

#avertissement coloré JAUNE durant l'init
echo -e 'E[1;33mLE FIREWALL SEMBLE OPERATIONNEL'; tput sgr0

}


fw_free() {
echo "Suppression de toutes protection"
echo "********************ATTENTION**************"
echo "*****ceci va autoriser tout le traffic*****"
echo "* Votre machine est vulnerable et l'acces *"
echo "*des machines de votre réseaux est bloqué *"
echo "*******************************************"
# Suppression de toutes les chaînes pré-définies de la table FILTER
iptables -t filter -F

# Suppression de toutes les chaînes utilisateur de la table FILTER
iptables -t filter -X

# Par defaut, toute les paquets de la table FILTER sont acceptés
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT



# Suppression de toutes les chaînes pré-définies de la table NAT
iptables -t nat -F

# Suppression de toutes les chaînes utilisateur de la table NAT
iptables -t nat -X

# Par defaut, toute les paquets de la table NAT sont acceptés
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT



# Suppression de toutes les chaînes pré-définies de la table MANGLE
iptables -t mangle -F

# Suppression de toutes les chaînes utilisateur de la table MANGLE
iptables -t mangle -X

# Par defaut, toute les paquets de la table MANGLE sont acceptés
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT


# Supprime du NAT dans le kernel
# OK pour tout accepter, mais il ne faut pas rigoler quand même !
echo 0 > /proc/sys/net/ipv4/ip_forward


# Desactive les options anti-spoofing du kernel
for Filter in /proc/sys/net/ipv4/conf/*/rp_filter; do
  echo 0 > $Filter
done

# Desactive les options anti-ping du kernel
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
}



fw_restart() {
  fw_start
}


case "$1" in
'start')
  fw_start
  ;;
'free')
  fw_free
  ;;
'restart')
  fw_restart
  ;;
*)
  echo "usage $0 start|free|restart"
esac
exit

Free Your mind, Free Your Engine ... Get a Slackware !!

Hors ligne

 

Pied de page des forums

Powered by FluxBB