Configuration d'un pare feu(firewall) avec iptables (GNU/Linux)
Commentaires
- Toute demande de connection TCP de l'exterieur vers l'interieur
est bloquer. Le réseau local ne fournit aucun serveur TCP à l'exterieur
- Toute connection aux ports <1024 sont bloquées (TCP ou UDP)
- Les ports >1024 en UDP sont donc vulnérables. Vérifier que votre machine ne fait tourner aucun daemon ecoutant sur ces ports, où alors bloqué tout les ports UDP
- Le script lit le fichier de configuration (.conf), il ne faut pas oubliez de lancer grace au repertoires rcX.d le fichier /etc/init.d/pare-feu (X represente votre run-level)
#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"
#! /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