Prérequis

Les seuls prérequis pour comprendre et réaliser les manipulations décrites dans cet article sont :

  • savoir éditer un fichier texte
  • savoir taper des commandes en console

Versions et Distributions

Pour mes serveurs j'utilise la distribution Debian qui en plus d'être extrêmement stable a le bon goût d'être développé uniquement par des bénévoles à travers le monde qui se soucient énormément du {Libre} et attachent ainsi une grande importance à ce que leur distribution soit la plus libre possible. J'utilise la version stable la plus récente au moment de la rédaction de cette article : Debian Sarge.

Tous les outils que je vais utiliser, ainsi que la méthode sont toutefois génériques et communes à la plupart des distributions. Pour ce qui est de la version du noyau, j'utilise un noyau 2.6.8, mais les manipulations doivent fonctionner avec tous les noyaux de la branche 2.6. Pour connaître la version de votre noyau, tapez la commande suivante :

shell# uname -r
2.6.8-2-686-smp

Les deux premiers chiffres du champs permettent d'indiquer quelle est la version majeure du noyau.

Pour ce qui est de l'outil iptables, j'utilise la version 1.2.11, mais les manipulations devraient fonctionner avec n'importe quelle version 1.x de cet outil. Une fois de plus, pour connaître la version, tapez :

shell# iptables -V
iptables v1.2.11

Activer le transfert sur IPv4

Pour des raisons de sécurité, le noyau n'autorise pas le transfert des paquets ip ayant pour destination une adresse n'appartenant pas à la pile. Afin de permettre ce relayage des adresses, il suffit de mettre à {1} une variable particulière accessible par le biais du système de fichier {proc} :

shell#  echo 1 > /proc/sys/net/ipv4/ip_forward

Désormais, le serveur est capable de relayer les paquets ip. Cependant ceci n'est pas suffisant pour accéder à internet en passant par le routeur car, bien que les paquets passent, il n'est pas possible de router les adresses correspondant aux réseaux locaux vers l'internet.

Masquerading

Pour pallier à ce problème, il est possible de mettre en place un système un peu complexe qui permet au serveur de faire passer les paquets provenant du réseau vers l'internet comme si c'était le serveur lui-même qui envoyait les paquets. Lorsqu'une réponse reviend, il lui suffit alors de se rappeler qui l'avait demandée pour faire de nouveau suivre les paquets vers le destinataire sur le réseau.

Ce processus s'appele le masquerading, et il se met en place grâce par le biais de la commande {iptables} suivante :

shell#  iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

Si on analyse un peu la trame ci-dessus on trouve les parties suivantes :

  • -A POSTROUTING -t nat qui signifie que l'on ajoute cette commande à la fin de la chaîne de traitement POSTROUTING, dans la table nat (Network Address Translation);
  • -o eth0 qui signifie que l'on fait transférer les paquets vers internet par le biais de l'interface eth0;
  • -j MASQUERADE est la commande magique qui effectue le processus décrit ci-dessus.

Configuration IP

Maintenant que le serveur sait transférer les paquets provenant du réseau local vers l'internet, il faut indiquer aux machines du réseau comment passer par ce dernier pour joindre internet. Je suppose ici que les machines sont déjà en réseau et arrivent à atteindre le serveur précédemment configuré.

Pour signaler que les paquets à destination d'internet doivent passer par le biais de notre serveur dont on suppose que l'adresse IP est 192.168.0.1, on ajoute une route par défaut à destination du serveur :

shell#  route add default gw 192.168.0.1

Pour vérifier que vous accédez bien à l'internet à partir des machines du réseau, vous pouvez essayer de pinger (envoyer des paquets pour tester) des machines sur internet, par exemple google.fr :

shell#  ping 209.85.135.99
 PING 209.85.135.99 (209.85.135.99) 56(84) bytes of data.
 64 bytes from 209.85.135.99: icmp_seq=1 ttl=245 time=65.8 ms
 64 bytes from 209.85.135.99: icmp_seq=2 ttl=245 time=66.3 ms
 64 bytes from 209.85.135.99: icmp_seq=3 ttl=245 time=69.5 ms

--- 209.85.135.99 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 65.878/67.243/69.509/1.640 ms

Vous pouvez également vous assurer que les paquets passent bien par votre serveur en traçant le chemin vers une adresse spécifiée. Selon votre distribution, vous pouvez utiliser l'outil traceroute ou tracepath :

shell#  tracepath -n 209.85.135.99
 1:  192.168.50.12     0.155ms pmtu 1500
 1:  192.168.50.2      5.862ms
 2:  192.168.254.254 122.727ms
 3:  212.27.51.10    124.025ms
 4:  209.85.135.99  100.023ms

Ensuite

Maintenant que votre serveur vous permet de router vos paquets vers internet, vous voudrez certainement lui permettre également de :

  • vous offrir la configuration du réseau dynamiquement par le biais d'un serveur DHCP
  • vous protéger efficacement des intrusions à l'aide d'un bon firewall
  • ...