Table des matières

iptables

Sujet : iptables par l'exemple
Niveau : Intermédiaire
Auteur : 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