====== iptables ====== >**Sujet** : iptables par l'exemple >**Niveau** : Intermédiaire >**Auteur** : [[utilisateurs:smilebob]] (23 novembre 2004) ===== Introduction ===== Il peut parfois sembler difficile à un débutant de configurer lui-même son firewall à l'aide d' ''iptables''. En réalité, si l'on dispose d'un exemple de script bien commenté, cela devient assez aisé de personnaliser son firewall. ===== Exemple de script ====== #!/bin/bash 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 Vous pouvez, si vous le désirez, le copier dans ''/etc/init.d'' puis créer un lien pour lancer le script automatiquement au démarrage. ===== Liens ===== * [[http://www.netfilter.org/]] : site officiel (en anglais)