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