Version: 0.3Par fabrice mise à jour: juin 2007

Configuration d'un pare feu(firewall) avec iptables (GNU/Linux)


Commentaires


Fichier de configuration:/etc/pare-feu.conf

#fichier de configuration de /etc/init.d/pare-feu

#executable iptables
ipchains="iptables"

#adresse du réseau local
mynet=192.168.0.0/24

#interface à protéger (connecté au net)
inet=ppp0

#interface local (connecté au réseau local)
ilocal=eth0

#
# LOG
#
# Active ou non les logs pour les drop des trames
# venant de $inet effectuant une connection TCP
logdropextsyn="1"

# Active ou non les logs pour les trames 
# venant de l'exteieur vers des ports < 1024
logdropextport="1"

# Active ou non les logs pour les trames 
# venant de l'exterieur mais avec des adresse du reseau local
logdropextmynet="1"

#prefixe des logs pour les trames de type extsyn
logextsyn="extsyn"
#prefixe des logs pour les trames de type extport
logextport="extport"
#prefixe des logs pour les trames de type extmynet
logextmynet="extmynet"

#
#Redirection (passage par un proxy)
#
redirection_http="0"
redirection_http_source_port="80"
redirection_http_destination_port="8080"

#
#Bloc le ping
#
ping_net_bloc="1"
ping_local_bloc="0"

#masquage d'ip
masquage_ip="1"



Script de lancement du pare-feu:/etc/init.d/pare-feu

#! /bin/bash

#MODULES NOYAU NECESSAIRES
#
# A mettre dans /etc/modules
#
#iptables
#ipt_MASQUERADE
#ipt_LOG
#
#iptable_filter
#iptable_mangle
#iptable_nat
#
fch_conf=/etc/$(basename $0).conf

if [ ! -f $fch_conf ];then
	echo "Impossible de trouver le fichier de configuration: $fch_conf"
	exit 1
fi

#insére le fichier de configue
. $fch_conf

#affiche les cmd
#set -x


case "$1" in
  start)

	#efface toute les regles
	echo "# NE TRAVAILLE QUE SUR PREROUTING #"
	echo "###################################"
	echo "Efface les anciennes regles"
	for i in nat filter mangle
	do
		echo -e "\tEfface les regles de la table: $i"
		$ipchains -t $i -F
	done

	echo "Efface les regles utilisateurs"
	for i in nat filter mangle
	do
		echo -e "\tEfface les regles utilisateur de la table: $i"
		$ipchains -t $i -X
	done
	
	# FILTER ACCEPT
	echo "Definie la politique par default (filter)"
	for i in INPUT OUTPUT FORWARD
	do
		echo -e "\tPolicy filter $i : ACCEPT"
		$ipchains -P $i ACCEPT
	done
	
	# NAT ACCEPT
	echo "Definie la politique par default (nat)"

	for i in POSTROUTING OUTPUT
	do
		echo -e "\tPolicy nat $i : ACCEPT"
		$ipchains -t nat -P $i ACCEPT
	done
	# NAT DROP
	for i in PREROUTING
	do
		echo -e "\tPolicy nat $i : DROP"
		$ipchains -t nat -P $i DROP
	done
	#Creation des chaines

	#chaine "log-and-drop", log et ignore le paquet
	echo "Creation  des chaines de log-drop"
	for i in $logextsyn $logextport $logextmynet 
	do
		echo -e "\tCreation de la chaine : $i"
		$ipchains -t nat -N $i
	done

	echo -n "Log les paquets droppées pour l'interface $inet (préfixe:$logextsyn ) : "
	
	if [ $logdropextsyn = "1" ];
	then
	    	$ipchains -t nat -A $logextsyn -j LOG --log-prefix "$logextsyn "
		echo "Oui"
	else
		echo "Non"
	fi	
	
	$ipchains -t nat -A $logextsyn -j DROP
	    
	echo -n "Log les paquets acceptées pour l'interface $inet (préfixe:$logextport ) : "
	
	if [ $logdropextport = "1" ];
	then
	    	$ipchains -t nat -A $logextport -j LOG --log-prefix "$logextport "
		echo "Oui"
	else
		echo "Non"
	fi
	$ipchains -t nat -A $logextport -j DROP 
	
	echo -n "Log les paquets droppées pour l'interface $inet (préfixe:$logextmynet ) : "
	
	if [ $logdropextmynet = "1" ];
	then
	    	$ipchains -t nat -A $logextmynet -j LOG --log-prefix "$logextmynet "
		echo "Oui"
	else
		echo "Non"
	fi	
	$ipchains -t nat -A $logextmynet -j DROP 

	#
	#Interdit de sortir sur internet pour certainee ip
	#

	#$ipchains -A FORWARD -s 192.168.0.20 -i eth0 -j $logextsyn
	#$ipchains -A INPUT -s 192.168.0.20 -i eth0 -j $logextsyn
	#active le masquage
	#
	echo -n "Masquage d'IP :"	
	if [ $masquage_ip = "1"  ];
	then
		$ipchains -t nat -A POSTROUTING -s $mynet -j MASQUERADE
		$ipchains -A FORWARD -s $mynet -i $ilocal -j ACCEPT
		echo "Oui (depuis $ilocal de $mynet)"
	else
		echo "Non"
	fi

	#
	#BLOCAGE ET LOG DES PINGS
	#

	echo ""	
	echo "Blocage des pings"
	echo -en "\t $ilocal : "
	if [ $ping_local_bloc = "1" ];
	then
		$ipchains -t nat -A PREROUTING -i $ilocal -p icmp -s 0.0.0.0/0 --icmp-type \
			echo-request -j LOG --log-prefix="Bloc_Ping_local "
		$ipchains -t nat -A PREROUTING -i $ilocal -p icmp -s 0.0.0.0/0 --icmp-type echo-request -j DROP
		echo "Oui"
	else
		echo "Non"
	fi

	echo -en "\t $inet : "
	if test $ping_net_bloc = "1"
	then
		$ipchains -t nat -A PREROUTING -i $inet -p icmp -s 0.0.0.0/0 --icmp-type \
			echo-request -j LOG --log-prefix="Bloc_Ping_net "
		$ipchains -t nat -A PREROUTING -i $inet -p icmp -s 0.0.0.0/0 --icmp-type echo-request -j DROP
		echo "Oui"
	else
		echo "Non"
	fi
	
	echo ""	
	
	 ###
	#WEB#
	 ###
	
		#
		# Entree
		#
		echo "Interface: $inet"

		echo -e "\t-Bloque les paquets provenant de $mynet"
		for i in tcp udp icmp
		do
			$ipchains -t nat -A PREROUTING -i $inet -s $mynet -p $i -j $logextmynet
		done
		
		echo -e "\t-Bloque et log tout ce qui provient de $inet par les ports de 0 a 1023"
		$ipchains -t nat -A PREROUTING -i $inet -j $logextport -p tcp --destination-port 0:1023
		$ipchains -t nat -A PREROUTING -i $inet -j $logextport -p udp --destination-port 0:1023
		
		echo -e "\t-Bloque les etablissements de connexions TCP provenant de $inet (syn=1 et ack=0)"
		$ipchains -t nat -A PREROUTING -i $inet -j $logextsyn -p tcp --syn

		
		#$ipchains -A INPUT -i $inet -d ! $mynet -p udp -j $logextmynet
		#$ipchains -A INPUT -i $inet -d ! $mynet -p udp -j $logextmynet

	
		echo -e "\t-Accepte toute les réponses par le web sur les ports 1024 à 65525 (ACK=1)"
		$ipchains -t nat -A PREROUTING -i $inet -j ACCEPT -p tcp --destination-port 1024:65525 ! --syn
		$ipchains -t nat -A PREROUTING -i $inet -j ACCEPT -p udp --destination-port 1024:65525
		
		echo -e "\t-Politique par defaut: Refus"
		$ipchains -t nat -A PREROUTING -i $inet -j DROP -p tcp
		$ipchains -t nat -A PREROUTING -i $inet -j DROP -p udp
		$ipchains -t nat -A PREROUTING -i $inet -j DROP -p icmp
		
		#
		# Sorties
		#
		echo -e "\t-Accepte toute les sorties vers le web"
		$ipchains -A OUTPUT -j ACCEPT


	echo ""
	
	 #####
	#LOCAL#
	 #####
		echo "Interface: $ilocal"
		#on accepte tout
		echo -e "\t-ACCEPT pour $mynet sur $ilocal"
	
		$ipchains -t nat -A PREROUTING -i $ilocal -s $mynet -p tcp -j ACCEPT 
		$ipchains -t nat -A PREROUTING -i $ilocal -s $mynet -p udp -j ACCEPT
		$ipchains -t nat -A PREROUTING -i $ilocal -s $mynet -p icmp -j ACCEPT

		echo -e "\t-lo accepte tout"
		$ipchains -A INPUT -i lo -j ACCEPT

	 #######
	#OPTIONS#
	 #######

		#active le forwarding
		echo 1 > /proc/sys/net/ipv4/ip_forward

		#active le proxy transparent (prerouting)
		echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

	###############"
	#
	# redirection HTTP
	#
	###################
	
	echo ""
	echo -n "Redirection HTTP : "
	if test $redirection_http = "1"
	then
	    $ipchains -t nat -A PREROUTING -i $ilocal -p tcp \
	    --destination-port $redirection_http_source_port -j REDIRECT \
	    --to-port $redirection_http_destination_port
    
	    $ipchains -t nat -A PREROUTING -i io -p tcp \
	    --destination-port $redirection_http_source_port -j REDIRECT \
	    --to-port $redirection_http_destination_port
	    
	    echo "$redirection_http_source_port->$redirection_http_destination_port"
	else
	   echo "Aucune"
	fi
	;;
	
    stop)
	#efface toute les regles
	for i in nat filter mangle
	do
		echo -e "\tEfface les regles de la table: $i"
		$ipchains -t $i -F
	done
	for i in INPUT OUTPUT FORWARD
	do
		echo -e "\tPolicy filter $i : ACCEPT"
		$ipchains -P $i ACCEPT
	done
	
	# NAT ACCEPT
	echo "Definie la politique par default (nat)"

	for i in PREROUTING POSTROUTING OUTPUT
	do
		echo -e "\tPolicy nat $i : ACCEPT"
		$ipchains -t nat -P $i ACCEPT
	done

	#Creation des chaines

	echo "Pare-feu stop"
	;;
	
     status)
	echo "**Table filter:"
	$ipchains -L -v -n
	echo " "
	echo "**Table nat:"
	$ipchains -t nat -L -v -n        
	;;

      *)
        echo "Usage: $0 {start|stop|status}"
	exit 1
	;;
esac