<h2>But de ce document</h2>
<p class="spip">Ce document me sert de mémo pour installer une passerelle avec iptables sous Debian.</p>

<p class="spip">Ce document n’expliquera pas le fonctionnement d’iptable mais uniquement la mise en place des scripts et la configuration d’un firewall minimaliste.</p>

<h2>Script pour désactiver le firewall</h2>
<p class="spip">Ce script que nous pouvons nommer et placer dans « <strong class="spip">/etc/firewall-stop</strong> » permettra de désactiver le firewall :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>#!/bin/sh<br />
<br />
# Nous vidons les chaînes :<br />
iptables -F<br />
# Nous supprimons d'éventuelles chaînes personnelles :<br />
iptables -X<br />
<br />
# Nous les faisons pointer par défaut sur ACCEPT<br />
iptables -P INPUT ACCEPT<br />
iptables -P OUTPUT ACCEPT<br />
iptables -P FORWARD ACCEPT<br />
<br />
# Cette ligne permet de supprimer toutes les redirections de ports<br />
iptables -t nat -F</code></div>
<p class="spip"><strong class="spip">Attention </strong> : Nous verrons au chapitre « <strong class="spip">Utilisation des dossiers « if-pre-up » et « if-post-down</strong> », qu’il ne faut pas utiliser de caractères spéciaux, d’espaces et de points dans le nom de ce fichier. Il est important également de ne pas oublier la première ligne « # !/bin/sh »</p>

<h2>Script pour activer le firewall</h2>
<p class="spip">Ce script que nous pouvons nommer et placer dans « <strong class="spip">/etc/firewall-start</strong> » permettra de démarrer le firewall :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>#!/bin/sh<br />
 <br />
# REMISE à ZERO des règles de filtrage<br />
iptables -F<br />
iptables -t nat -F<br />
<br />
# Mise en place des régles par défaut<br />
iptables -P INPUT DROP<br />
iptables -P FORWARD ACCEPT<br />
iptables -P OUTPUT ACCEPT<br />
 <br />
# On enlève le firewall sur le loopback et le reseau local<br />
iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A INPUT -i eth0 -j ACCEPT<br />
 <br />
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  <br />
 <br />
# Ouverture de ports<br />
# Exemple pour un port TCP (ici 80)<br />
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT<br />
# Exemple pour un port UDP (ici 110)<br />
# iptables -A INPUT -p udp --dport 110 -j ACCEPT<br />
# Exemple d'un ensemble de ports (de 2072 a 2080 inclus)<br />
# iptables -A INPUT -p tcp --dport 2072:2080 -j ACCEPT<br />
<br />
# J'accepte le protocole ICMP (i.e. le "ping")<br />
iptables -A INPUT -p icmp -j ACCEPT<br />
<br />
# J'accepte le protocole IGMP (pour le multicast)<br />
iptables -A INPUT -p igmp -j ACCEPT<br />
<br />
# J'accepte les packets entrants relatifs à des connexions déjà établies<br />
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT<br />
<br />
# Décommentez les deux lignes suivantes pour que le serveur FTP éventuel<br />
# soit joignable de l'extérieur<br />
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT<br />
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT<br />
<br />
# Décommentez la ligne suivante pour que le serveur SSH éventuel<br />
# soit joignable de l'extérieur<br />
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT<br />
<br />
# A placer en FIN DU FICHIER<br />
iptables -A INPUT -j DROP</code></div>
<h2>Arrêt et démarrage manuel du firewall</h2>
<p class="spip">Avant de lancer les scripts, il faut les rendre exécutables :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># chmod +x /etc/firewall-start<br />
# chmod +x /etc/firewall-stop</code></div>
<p class="spip">Ensuite, il est possible de lancer manuellement le firewall et de vérifier le résultat :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># /etc/firewall-start<br />
# iptables -L -v</code></div>
<p class="spip">Il est possible également de l’arrêter manuellement et de vérifier le résultat :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># /etc/firewall-stop<br />
# iptables -L -v</code></div>
<p class="spip">Nous allons voir dans les chapitres suivants deux méthodes pour activer ou désactiver automatiquement le firewall.</p>

<h2>Lancement automatique du firewall au démarrage de l’ordinateur</h2>
<p class="spip">Pour activer le firewall automatiquement au démarrage de l’ordinateur, il faut créer le script « <strong class="spip">/etc/init.d/firewall</strong> » contenant les lignes suivantes :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>#!/bin/sh<br />
stop() {<br />
/etc/firewall-stop<br />
}<br />
<br />
case $1 in<br />
"start")<br />
/etc/firewall-start<br />
;;<br />
"stop")<br />
stop<br />
;;<br />
"restart")<br />
stop<br />
/etc/firewall-start<br />
;;<br />
esac</code></div>
<p class="spip">Rendre ce script exécutable avec la commande :</p>

<p class="spip"><code class='spip_code' dir='ltr'># chmod +x /etc/init.d/firewall</code></p>

<p class="spip">Créer les liens permettant de démarrer automatiquement le script au démarrage de l’ordinateur :</p>

<p class="spip"><code class='spip_code' dir='ltr'># update-rc.d firewall defaults </code></p>

<p class="spip">La commande suivante permet d’arrêter le firewall :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /etc/init.d/firewall stop</code></p>

<p class="spip">La commande suivante permet de vérifier que les règles sont biens effacées :</p>

<p class="spip"><code class='spip_code' dir='ltr'># iptables -L -v</code></p>

<p class="spip">La commande suivante permet de démarrer le firewall :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /etc/init.d/firewall start</code></p>

<p class="spip">La commande suivante permet de vérifier que les règles sont bien mises en place :</p>

<p class="spip"><code class='spip_code' dir='ltr'># iptables -L -v</code></p>

<h2>Utilisation des dossiers « if-pre-up » et « if-post-down »</h2>
<p class="spip">Les scripts placés dans le dossier « <strong class="spip">/etc/network/if-post-down.d</strong> » seront lancés automatiquement après chaque arrêt d’une interface réseau.</p>

<p class="spip">Les scripts placés dans le dossier « <strong class="spip">/etc/network/if-pre-up.d</strong> » seront lancés automatiquement avant chaque démarrage d’une interface réseau.</p>

<p class="spip">Mais pour que les scripts fonctionnement, il faut respecter quelques règles :
<br /></p>
<li> Il doivent être exécutables (chmod +x)
<br /><li> Ils doivent Indiquer l’interpréteur de commande sur la première ligne (ex : # !/bin/sh)
<br /><li> Le nom ne doit contenir que des caractères, chiffres, ’_’ et ’-’ (Pas de points)
<p class="spip">Quand le script est exécuté, il peut utiliser plusieurs variables ( :
<br /></p>
<li> IFACE : Nom de l’interface physique concernée (eth0, lo,..)
<br /><li> LOGICAL : Nom de l’interface logique
<br /><li> ADDRFAM, METHOD, MODE, PHASE et VERBOSITY
<p class="spip">Le script peut donc utiliser ces variables pour s’adapter en conséquence.</p>

<p class="spip"><strong class="spip">ATTENTION</strong> : En plaçant le script d’arrêt du firewall  dans le dossier « if-post-down », celui-ci sera exécuté quelque soit l’interface réseau arrêté. Par exemple si le firewall est destiné à filtrer l’interface eth0, il sera désactivé lorsque l’interface lo sera arrêtée, ce qui peut entraîner une grosse faille de sécurité.</p>

<p class="spip">Pour remédier à ce problème, il faut ajouter au début du script un test pour qu’il s’exécute uniquement pour l’interface concernée</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>f [ $IFACE != "eth2" ]; then<br />
 exit<br />
fi </code></div>
<h2>Configuration du fichier  /etc/network/interfaces »</h2>
<p class="spip">Une autre méthode pour arrêter et démarrer un firewall est d’utiliser les directives « <strong class="spip">pre-up</strong> » et « <strong class="spip">post-down</strong> » dans le fichier « <strong class="spip">/etc/network/interfaces</strong> ». Exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>auto eth0<br />
iface eth0 inet dhcp<br />
  pre-up /etc/firewall-start<br />
  post-down /etc/firewall-stop</code></div>
<h2>Activation de l’ip forwarding</h2>
<p class="spip">Pour autoriser les paquets entrant sur une interface réseau à transiter sur une autre interface réseau, il faut activer l’ip forwarding. Cela peut se faire manuellement avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># echo 1 > /proc/sys/net/ipv4/ip_forward</code></p>

<p class="spip">Mais dans ce cas, l’ip forwarding sera désactivé au prochain redémarrage de l’ordinateur. Pour l’activer en permanence, sous Debian, il existe au moins trois méthodes.</p>

<p class="spip">La première consiste à ajouter la ligne précédente dans le fichier de lancement du firewall « <strong class="spip">firewall-start</strong> »</p>

<p class="spip">La deuxième méthode consiste à l’activer lors du démarrage d’une interface réseau (ex : lo) en modifiant le fichier « <strong class="spip">/etc/network/interfaces</strong> », ce qui donne :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iface lo inet loopback<br />
  up echo 1 > /proc/sys/net/ipv4/ip_forward</code></div>
<p class="spip">La troisième méthode est de mettre « <strong class="spip">ip_forward=yes</strong> » à la place de « <strong class="spip">ip_forward=no</strong> » dans le fichier « <strong class="spip">/etc/network/options</strong> ». Ce qui donne dans mon cas :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>ip_forward=yes<br />
spoofprotect=yes<br />
syncookies=no</code></div>
<h2>Détail configuration Netfilter / Iptables</h2>
<h3>Netfilter utilise 3 tables :</h3>
<br /><li> filter : C’est la table par défaut (si l’option -t est omise). Elle contient les chaînes prédéfinies <strong class="spip">INPUT</strong> (pour les paquets entrant dans la machine), <strong class="spip">FORWARD</strong> (pour les paquets routés à travers la machine) et <strong class="spip">OUTPUT</strong> (pour les paquets générés localement). 
<br /><li> nat : Cette table est consultée lorsqu’on rencontre un paquet qui crée une nouvelle connexion. La table est composée de trois chaînes prédéfinies : <strong class="spip">PREROUTING</strong> (pour modifier les paquets dès qu’ils entrent), <strong class="spip">OUTPUT</strong> (pour modifier les paquets générés localement, avant le routage) et <strong class="spip">POSTROUTING</strong> (pour modifier les paquets lorsqu’ils sont sur le point de sortir). 
<br /><li> mangle : Cette table est employée pour effectuer une modification spéciale des paquets. Jusqu’au noyau 2.4.17, elle offrait deux chaînes prédéfinies : <strong class="spip">PREROUTING</strong> (pour modifier les paquets entrants, avant le routage) et <strong class="spip">OUTPUT</strong> (pour modifier les paquets générés localement, avant le routage). Depuis le noyau 2.4.18, trois autres chaînes prédéfinies sont aussi prises en charge : <strong class="spip">INPUT</strong> (pour les paquets entrants, destinés à la machine elle-même), <strong class="spip">FORWARD</strong> (pour modifier les paquets routés à travers la machine) et <strong class="spip">POSTROUTING</strong> (pour modifier les paquets lorsqu’ils sont sur le point de sortir).
<h3>Début du script du firewall</h3>
<p class="spip">Cette première ligne est importante :</p>

<p class="spip"><code class='spip_code' dir='ltr'>#!/bin/sh</code></p>

<p class="spip">Ensuite, il est possible de mettre des commentaires</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ************************************************<br />
# ** Script de configuration d'iptables         **<br />
# ** Créé par Tony Galmiche le 26/06/2006       **<br />
# ************************************************</code></div>
<p class="spip">Il est possible et même conseillé de définir des variables :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>inet=eth0<br />
ilan=eth1<br />
idmz=eth2</code></div>
<h3>Les modules</h3>
<p class="spip">Selon vos besoins, vous allez avoir besoin de charger les modules suivants (ou d’autres), placez ces lignes au début de votre script de firewall.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>modprobe ip_conntrack_ftp<br />
modprobe ip_tables<br />
modprobe ip_nat_ftp<br />
modprobe ip_nat_irc<br />
modprobe iptable_filter<br />
modprobe iptable_mangle<br />
modprobe iptable_nat</code></div>
<p class="spip">Par exemple, le module ip_conntrack_ftp vous permettra de faire du FTP passif aussi bien que du FTP actif.</p>

<h3>Effacer les règles existantes</h3>
<p class="spip">Les commandes suivantes permettent d’effacer toutes les règles existantes :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># Supprime les chaînes de la table filter (INPUT, FORWARD et OUTPUT)<br />
iptables -F<br />
# Supprime les chaînes personnelles de la table filter<br />
iptables -X<br />
<br />
# Supprime les chaînes de la table nat (PREROUTING, OUTPUT et POSTROUTING)<br />
iptables -t nat -F<br />
# Supprime les chaînes personnelles de la table nat<br />
iptables -t nat -X<br />
<br />
# Supprime les chaînes de la table mangle<br />
# -> PREROUTING, OUTPUT, INPUT, FORWARD et POSTROUTING<br />
iptables -t mangle -F<br />
# Supprime les chaînes personnelles de la table mangle<br />
iptables -t mangle -X</code></div>
<h3>Définir les règles par défaut</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code># Définition du comportement par défaut pour les chaines de la table filter<br />
# -> On bloque les entrées et on autorise tout le reste<br />
iptables -P INPUT   DROP<br />
iptables -P OUTPUT  ACCEPT<br />
iptables -P FORWARD ACCEPT</code></div>
<h3>Pour accepter tout ce qui ce passe sur l’interface lo</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code># Autoriser les paquets pour lo<br />
iptables -A INPUT  -i lo -j ACCEPT<br />
iptables -A OUTPUT -o lo -j ACCEPT</code></div>
<p class="spip">J’ai également vu ces règles, mais je ne suis pas certain de leur utilité :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A FORWARD -i lo -j ACCEPT<br />
iptables -A FORWARD -o lo -j ACCEPT</code></div>
<h3>Pour accepter tout ce qui ce passe sur le lan</h3>
<p class="spip">Première méthode trouvée :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT</code></div>
<p class="spip">Deuxième méthode trouvée :</p>

<h3>Accepter les connexions HTTP</h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -A INPUT -i eth0 -p tcp --sport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT</code></p>

<p class="spip"><strong class="spip">Commentaire </strong> : On veut pouvoir se connecter à notre serveur web de l’extérieur, et naviguer depuis notre serveur. On autorise donc les connexions entrantes nouvelles (NEW), déjà établies (ESTABLISHED) ou en relation (RELATED). Comme HTTP possède un port bien défini (80), il est présent dans la liste des ports de /etc/services : on peut donc l’indiquer comme &mdash;sport (port source) ou -dport (port de destination) en indiquant son nom. Il en va de même pour SSH, car il est aussi présent dans /etc/services.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>modprobe ip_conntrack<br />
iptables -A INPUT -i eth0 --protocol tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT<br />
iptables -A OUTPUT -o eth0 --protocol tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT</code></div>
<h3>Accepter les connexions SSH</h3>
<p class="spip">Premier exemple : On accepte en entrée uniquement si une connexion est déjà établie</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -A INPUT -i eth0 -p tcp --sport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT</code></p>

<p class="spip">Deuxième exemple : On accepte en entrée et sortie dans tous les cas</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT<br />
iptables -A OUTPUT -p tcp --sport ssh -o eth0 -j ACCEPT</code></div>
<h3>Accepter les connexions SMTP</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A OUTPUT -o ppp0 -p tcp --sport 1024: -d smtp.wanadoo.fr --dport 25 -m state --state ! INVALID -j ACCEPT<br />
iptables -A INPUT -i ppp0 -p tcp -s smtp.wanadoo.fr --sport 25 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT</code></div>
<h3>Accepter les connexions DNS</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A OUTPUT -o ppp0 -p udp --sport 1024: --dport 53 -m state --state ! INVALID -j ACCEPT<br />
iptables -A INPUT -i ppp0 -p udp --sport 53 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT</code></div>
<h3>Accepter les connexions FTP</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>modprobe ip_conntrack_ftp<br />
iptables -A INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT<br />
iptables -A OUTPUT -o eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT <br />
iptables -A INPUT -i eth0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A OUTPUT -o eth0 -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT <br />
iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT<br />
iptables -A OUTPUT -o eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT</code></div>
<p class="spip">Pour cette connexion, il faut charger le module "<strong class="spip">conntrack_ftp</strong>".</p>

<p class="spip">On autorise :
<br /></p>
<li> la réception de paquets provenant d’une machine extérieure utilisant le protocole tcp sur le port de départ 21 avec une connexion déjà établie.
<br /><li> l’émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port d’arrivé 21 pour une connexion déjà établie ou une nouvelle connexion.
<br /><li> la réception de paquets provenant d’une machine extérieure utilisant le protocole tcp sur le port de départ 20 avec une connexion déjà établie.
<br /><li> l’émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port d’arrivé 20 pour une connexion déjà établie ou provenant d’une autre connexion
<br /><li> la réception de paquets provenant d’une machine extérieure utilisant le protocole tcp sur le port de départ et arrivée entre 1024 et 65535 avec une connexion déjà établie.
<br /><li> l’émission de paquets vers une machine extérieure utilisant le protocole tcp sur le port de départ et arrivée 1024 et 65535 pour une connexion déjà établie ou provenant d’une autre connexion.
<h3>Se protéger des scan de port</h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT</code></p>

<h3>Se protéger contre le ping de la mort</h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT</code></p>

<h3>Autoriser le protocole icmp (ex : ping)</h3>
<p class="spip">Autoriser le ping sans restriction :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -A INPUT -p icmp -j ACCEPT</code></p>

<p class="spip">Autoriser le ping, mais dans la limite de 2 pings par seconde (&mdash; limit 2/s).</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A INPUT  -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A INPUT  -p icmp -m limit --limit 2/s -j ACCEPT</code></div>
<p class="spip">Le protocole ICMP, même s’il présente quelques dangers, rend tout de même quelques services appréciables, dans le cas d’erreurs de transmission et aussi dans la découverte du MTU. Il se trouve que, pour les messages d’erreur ICMP, l’en-tête du paquet qui a généré l’erreur est reproduite dans le message. Le suivi de connexion ICMP s’en sert pour déclarer ce paquet "RELATED".</p>

<p class="spip">En revanche, pour la passerelle elle-même,  si on a activé SMTP et DNS, il peut s’avérer intéressant d’ajouter la ligne :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -A INPUT -p icmp  -m state --state RELATED -j ACCEPT</code></p>

<p class="spip">De cette manière, une erreur ICMP passera, mais votre passerelle ne répondra pas aux pings, ni à aucune autre interrogation ICMP.</p>

<h3>Autoriser le protocole IGMP (pour le multicast)</h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -A INPUT -p igmp -j ACCEPT</code></p>

<h3>Autoriser les connexions tcp et udp déjà établies à rentrer</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A INPUT -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT</code></div>
<h3>Refuse les connections de la machine 12.13.14.15 </h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -I INPUT -s 12.13.14.15 -j DROP</code></p>

<h3>Refuser l’accès web pour tous les utilisateurs sauf root</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -A OUTPUT -o eth0 -p tcp --dport http -j REJECT --reject-with tcp-reset<br />
iptables -I OUTPUT -o eth0 -p tcp --dport http -m owner --uid-owner root -j ACCEPT</code></div>
<h3>Activer le masquerading (translation d’adresses)</h3>
<p class="spip">Le masquerading permet aux ordinateurs d’un réseau de se connecter à internet en utilisant l’adresse publique du routeur Internet.</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</code></p>

<p class="spip">Nous pourrions restreindre le masquerading à une plage d’IPs du réseau local :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o ppp0 -j MASQUERADE</code></p>

<p class="spip">La même règle écrite différemment pour le masque de sous-réseau :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE</code></p>

<p class="spip">Ou même à une liste d’IP bien définie :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -t nat -A POSTROUTING -s 192.168.0.10 -o ppp0 -j MASQUERADE<br />
iptables -t nat -A POSTROUTING -s 192.168.0.11 -o ppp0 -j MASQUERADE</code></div>
<h3>Transférer des ports sur la passerelle</h3>
<p class="spip">Dans certain cas, il peut-être intéressant de rediriger un port particulier sur un autre port. Par exemple, la commande suivante permet de rediriger les requêtes envoyées sur le port 1000 vers le port  2000 :</p>

<p class="spip"><code class='spip_code' dir='ltr'>iptables -t nat -I PREROUTING -p tcp --dport 1000 -j REDIRECT --to-ports 2000</code></p>

<p class="spip">Pour information, la commande suivante permet d’avoir la liste des ports redirigés :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># iptables -t nat -L<br />
Chain PREROUTING (policy ACCEPT)<br />
target     prot opt source               destination<br />
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:1000 redir ports 2000</code></div>
<h3>Transférer des ports sur d’autres serveurs (NAT)</h3>
<p class="spip">Vous n’avez qu’une seule adresse IP et deux serveurs doivent être accessibles : le serveur web et la passerelle Internet. La translation d’adresses va venir à votre rescousse, on va re-diriger les ports concernés vers les bonnes destinations.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -t nat -A PREROUTING -j DNAT -i eth0 -p TCP --dport smtp --to-destination 192.168.1.1<br />
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p TCP --dport http --to-destination 192.168.1.2</code></div>
<p class="spip">Si vous souhaitez que tous les surfeurs passent par votre cache Internet et que tous les mails circulent via la passerelle de messagerie, ce n’est pas un problème. Il n’y aura même pas à configurer les clients. Cela est particulièrement utilisé pour des entreprises ayant un antivirus sur le relais de messagerie.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -t nat -A PREROUTING -j DNAT -i eth2 -p TCP --dport http --to-destination 192.168.1.3:3128<br />
iptables -t nat -A PREROUTING -j DNAT -i eth2 -p TCP --dport smtp --to-destination 192.168.1.1</code></div>
<h3>Optimisation de la taille des paquets</h3>
<p class="spip"><code class='spip_code' dir='ltr'>iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth0 --clamp-mss-to-pmtu</code></p>

<h3>Liste succincte des adresses de ports : </h3>
<p class="spip">Pour plus d’informations, voir /etc/services</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">port</strong></th><th scope='col'><strong class="spip">service</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>20</td><td>ftp</td></tr>
<tr class="row_odd"><td>21</td><td>ftp</td></tr>
<tr class="row_even"><td>22</td><td>ssh</td></tr>
<tr class="row_odd"><td>25</td><td>smtp</td></tr>
<tr class="row_even"><td>80</td><td>http</td></tr>
<tr class="row_odd"><td>110</td><td>pop3</td></tr>
<tr class="row_even"><td>143</td><td>imap</td></tr>
<tr class="row_odd"><td>220</td><td>imap3</td></tr>
<tr class="row_even"><td>443</td><td>https</td></tr>
<tr class="row_odd"><td>2401</td><td>cvs</td></tr>
<tr class="row_even"><td>6667</td><td>irc</td></tr>
</tbody>
</table>
<h2>Gestion des logs du firewall</h2>
<p class="spip">Les commandes suivantes permettent d’activer les logs :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># ATTENTION : Désactiver cette ligne pour ne pas saturer syslog<br />
# --log-level, permet de forcer le niveaux des logs<br />
#iptables -t filter -A INPUT -j LOG --log-prefix "[FW] " --log-level=0<br />
#iptables -t filter -A INPUT -j LOG --log-prefix "[FW] "<br />
<br />
# Log uniquement si INPUT vient du réseau local<br />
#iptables -t filter -A INPUT -i $iLAN -j LOG --log-prefix "[FW] "<br />
<br />
# Log uniquement si INPUT vient de l'adresse IP 192.168.0.2<br />
#iptables -t filter -A INPUT -s 192.168.0.2 -j LOG --log-prefix "[FW] "<br />
#iptables -t filter -A INPUT -s 192.0.0.13  -j LOG --log-prefix "[FW] "</code></div>
<p class="spip">La commande suivante permet de ne pas afficher les logs du noyau dans la console (fonctionnement par défaut) :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># Ne pas afficher les logs dans la console<br />
# Le premier chiffre correspond au niveau des logs à afficher<br />
# Je ne connais pas l'utilité des 3 autres chiffres, donc je n'y touche pas<br />
# 0 -> Aucun log<br />
# 7 -> Valeur par défaut<br />
# 8 -> Tous les logs (Debug)<br />
echo "0 4 1 7" > /proc/sys/kernel/printk</code></div>
<p class="spip">Pour info, voici la signification des niveaux de logs :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Niveau</strong></th><th scope='col'><strong class="spip">Niveau</strong></th><th scope='col'><strong class="spip">Description</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>EMERG</td><td>0</td><td>le système est inutilisable</td></tr>
<tr class="row_odd"><td>ALERT</td><td>1</td><td>une action doit être entreprise immédiatement</td></tr>
<tr class="row_even"><td>CRIT</td><td>2</td><td>conditions critiques </td></tr>
<tr class="row_odd"><td>ERR</td><td>3</td><td>conditions d’erreurs </td></tr>
<tr class="row_even"><td> WARNING</td><td>4</td><td>conditions d’avertissements </td></tr>
<tr class="row_odd"><td> NOTICE</td><td>5</td><td>normal, mais conditions significatives </td></tr>
<tr class="row_even"><td> INFO</td><td>6</td><td>informatif </td></tr>
<tr class="row_odd"><td> DEBUG</td><td>7</td><td>messages de niveau déboguage </td></tr>
</tbody>
</table>
<p class="spip">Pour avoir un fichier spécial de log pour le firewall, il faut ajouter la ligne suivante dans le fichier « <strong class="spip">/etc/syslog.conf</strong> » :</p>

<p class="spip"><code class='spip_code' dir='ltr'>kern.warning /var/log/firewall.log</code></p>

<h2>Stocker les logs dans MySQL avec Ulog</h2>
<p class="spip">Je n’ai pas testé, mais j’ai noté quelques liens intéressants sur le sujet :
<br /></p>
<li> <a href="http://ftp.traduc.org/doc-vf/gazette-linux/html/2005/121/lg121-A.html" class="spip_out">http://ftp.traduc.org/doc-vf/gazette-linux/html/2005/121/lg121-A.html</a> 
<br /><li> <a href="http://iptables-tutorial.frozentux.net/fr/x4032.html" class="spip_out">http://iptables-tutorial.frozentux.net/fr/x4032.html</a>
<br /><li> <a href="http://www.regit.org/article.php3?id_article=20" class="spip_out">http://www.regit.org/article.php3 ?id_article=20</a>
<br /><li> <a href="http://www.inl.fr/Nulog,35.html" class="spip_out">http://www.inl.fr/Nulog,35.html</a>
<h2>Test du firewall avec Nmap</h2>
<p class="spip">Nmap sans option permet déjà d’afficher les ports ouverts sur un serveur :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ nmap 192.0.0.3<br />
<br />
Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2006-06-28 13:18 CEST<br />
Interesting ports on ws003.ltsp (192.0.0.3):<br />
Not shown: 1675 closed ports<br />
PORT    STATE SERVICE<br />
22/tcp  open  ssh<br />
111/tcp open  rpcbind<br />
113/tcp open  auth<br />
984/tcp open  unknown</code></div>
<p class="spip">L’option -A permet d’afficher le nom et la version des logiciels utilisés et l’option -T4 permet d’accélérer le rendu du résultat :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ nmap -A -T4 192.0.0.3<br />
<br />
Starting Nmap 4.10 ( http://www.insecure.org/nmap/ ) at 2006-06-28 13:20 CEST<br />
Interesting ports on ws003.ltsp (192.0.0.3):<br />
Not shown: 1675 closed ports<br />
PORT    STATE SERVICE VERSION<br />
22/tcp  open  ssh     OpenSSH 3.8.1p1 Debian-8.sarge.4 (protocol 2.0)<br />
111/tcp open  rpcbind  2 (rpc #100000)<br />
113/tcp open  ident   OpenBSD identd<br />
984/tcp open  status   1 (rpc #100024)<br />
Service Info: OS: OpenBSD</code></div>
<p class="spip">L’option -O permet de détecter le système d’exploitation :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># nmap -O 192.0.0.3<br />
...<br />
MAC Address: 00:A0:CC:66:87:35 (Lite-on Communications)<br />
Device type: general purpose<br />
Running: Linux 2.4.X|2.5.X|2.6.X<br />
OS details: Linux 2.4.7 - 2.6.11<br />
Uptime 0.135 days (since Wed Jun 28 10:09:41 2006)</code></div>
<p class="spip">La commande suivante permet de scanner tout un réseau en même temps :</p>

<p class="spip"><code class='spip_code' dir='ltr'># nmap 192.0.0.1/24</code></p>

<p class="spip">L’option -A permet d’avoir un maximum d’informations (scan agressif)</p>

<p class="spip"><code class='spip_code' dir='ltr'># nmap -A 192.0.0.3</code></p>

<p class="spip">Il est possible de spécifier plusieurs postes à analyser en les séparant par une virgule et un espace :</p>

<p class="spip"><code class='spip_code' dir='ltr'># nmap 192.0.0.3, 192.0.0.1</code></p>

<p class="spip">Il est possible d’analyser une série consécutive de postes avec cette syntaxe :</p>

<p class="spip"><code class='spip_code' dir='ltr'># nmap 192.168.0.1-9 </code></p>

<p class="spip">Pour plus d’option : <strong class="spip">man nmap</strong></p>

<h2>Analyses des paquets avec tcpdump</h2>
<p class="spip">Le paquet et le programme <strong class="spip">tcpdump</strong> permettent d’analyser les paquets envoyés ou reçus sur une interface réseau. Par exemple, la commande suivante, permet d’analyser tous les paquets qui passent par par l’interface par défaut (eth0) :</p>

<p class="spip"><code class='spip_code' dir='ltr'># tcpdump</code></p>

<p class="spip">Cette commande permet d’analyser uniquement les paquets en provenance de l’adresse 192.168.0.1</p>

<p class="spip"><code class='spip_code' dir='ltr'># tcpdump src 192.168.0.1</code></p>

<p class="spip">Analyser uniquement le port 80 de la source 192.168.0.1</p>

<p class="spip"><code class='spip_code' dir='ltr'># tcpdump src 192.168.0.1 and port 80</code></p>

<p class="spip">La commande suivante avec un maximum de paramètres permet d’afficher les informations en clair pour éventuellement récupérer les mots de passes qui circulent en clair avec une messagerie :</p>

<p class="spip"><code class='spip_code' dir='ltr'># tcpdump -x -X -s 0 src host 192.168.0.1 and dst host 212.208.225.1 and port 53 and udp</code></p>

<p class="spip">La commande suivante permet d’écouter sur l’interface tun0 les paquets en provenance de 10.8.0.1 de type icmp (ping)</p>

<p class="spip"><code class='spip_code' dir='ltr'>tcpdump -i tun0 src 10.8.0.1 and icmp</code></p>

<h2>Analyses des paquets avec Ethereal</h2>
<p class="spip">Ethereal utilise tcpdump et d’autres logiciels pour analyser d’une manière très évoluée les paquets qui transitent sur un réseau. Il est quasiment capable de reconstituer une page Web complète en assemblant tous les paquets qui transitent sur le réseau.</p>

<h2>Autres sources d’informations</h2>
<p class="spip">Page de man d’iptable en français (incontournable) :
<br /></p>
<li> <a href="http://www.delafond.org/traducmanfr/man/man8/iptables.8.html" class="spip_out">http://www.delafond.org/traducmanfr/man/man8/iptables.8.html</a>
<p class="spip">Plusieurs mémos dont je me suis inspiré pour ce document :
<br /></p>
<li> <a href="http://www.tryxy.net/index.php/Firewall_et_Routeur_avec_Iptables" class="spip_out">http://www.tryxy.net/index.php/Firewall_et_Routeur_avec_Iptables</a>
<br /><li> <a href="http://people.via.ecp.fr/~alexis/formation-linux/firewall.html" class="spip_out">http://people.via.ecp.fr/ alexis/formation-linux/firewall.html</a>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>27/06/06</td><td>Création par Tony GALMICHE</td></tr>
<tr class="row_odd"><td>0.2</td><td>15/08/06</td><td>Mise en ligne</td></tr>
<tr class="row_even"><td>0.3</td><td>25/09/06</td><td>Ajout de compléments concernant les redirections de ports</td></tr>
<tr class="row_odd"><td>0.4</td><td>16/02/07</td><td>Ajout « Refuser l’accès web pour tous les utilisateurs sauf root »</td></tr>
<tr class="row_even"><td>0.5</td><td>08/04/07</td><td>Petite correction suite à remarque sur le forum</td></tr>
</tbody>
</table>