Firewall à plusieurs interfaces
Par Minitux le vendredi, mai 22 2009, 23:44 - Sécurité - Lien permanent
Voici le cas où vous êtes dans un réseau d'entreprise avec votre routeur qui fait aussi pare-feu pour votre réseau interne.
Vous avez donc une patte sur Internet une autre sur votre lan et enfin un dernière sur votre dmz.
1 - Les interfaces :
Notre firewall aura la connexion à Internet sur son interface eth2 et disposera de 2 pattes sur des réseaux privés eth0 et eth1.
- eth0 192.168.1.0 pour notre dmz sur l'interface eth0
- eth1 192.168.2.0 pour notre lan sur l'interface eth1
- la connexion Internet sur eth2 avec l'ip 1.2.3.4
2 - On commence par tout remettre à zéro :
Je vous conseille de tout mettre dans un script sh, ceci permettra de le relancer plus facilement.
On remet la police par défaut à ACCEPT :
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
On remet les polices par défaut pour la table NAT :
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
On vide (flush) toutes les règles existantes :
iptables -F
iptables -t nat -F
Et enfin, on efface toutes les chaînes qui ne sont pas à defaut dans la table filter et nat :
iptables -X
iptables -t nat -X
Activation du forwarding pour que les paquets traversent la machine :
echo 1 > /proc/sys/net/ipv4/ip_forward
Ensuite quelques astuces pour les attaques de type spoofing et bloquer le icmp
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
fi
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Chargement des modules pour le ftp
modprobe ip_nat_ftp
modprobe iptable_nat
3 - Création des chaines pour les logs
On va rajouter 2 nouvelles chaînespour ajouter des nouvelles cibles comme des logs...
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
On remet la politique par défaut à DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
4 - Les règles :
On autorise tout sur l'interface lo :
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Notre serveur web sur la DMZ a pour ip 192.168.1.2 et l'on souhaite que toutes les requêtes provenant d'internet arrivant sur l'adresse IP 1.2.3.4 soit redirigées sur le serveur web de la DMZ.
iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
Pour le moment notre serveur n'est pas accessible car toutes nos règles sont à DENY par défaut.
On va autoriser le ssh depuis notre machine seulement :
iptables -A INPUT -i eth1 -s 192.168.2.42 -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.2.42 -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
On va autoriser l'accès à Internet pour notre lan :
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -o eth1 -i eth2 -j ACCEPT
Autorisation au LAN de consulter les pages web du serveur de la DMZ :
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Autorisons notre firewall à transmettre des paquets TCP à destination du port 80 provenant de l'adresse publique vers le serveur web de la DMZ que nous avons naté précédemment.
iptables -A FORWARD -i eth2 -o eth0 -p tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth2 -i eth0 -p tcp --source-port 80 -m state --state ESTABLISHED -j ACCEPT
On va permettre au LAN de dialoguer sur Internet avec la même adresse ip avec une règle de nat
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
Mais aussi pour le serveur web
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
Pour tout le reste :
iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP
5 - Le petit plus le script init.d
Si vous avez enregistré votre script de firewall dans /etc/firewall.sh
#!/bin/bash
. /etc/init.d/functions
RETVAL=0
# Fonction pour le lancement du firewall
start() {
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=0
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/firewall
echo
}
# Fonction pour arrêter le firewall (on flush)
stop() {
echo -n "Flush des règles IpTables: "
/sbin/iptables -F
RETVAL=0
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/firewall
echo
@@}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
/sbin/iptables -L
/sbin/iptables -t nat -L
@@RETVAL=0
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
RETVAL=1
esac
exit
N'oubliez pas le chmod +x sur votre script /etc/firewall.sh ainsi que sur celui de l'init.d
-6 - Liens vers d'autres billets
Filtrer le ftp avec iptables
Firewall à une interface
Présentation d'iptables