Ceci est une ébauche, la suite bientôt.
Dans ce genre de cas, la machine gateway possède deux liaisons internet avec chacune une IP publique. Le besoin naturel dans ce cas est de pouvoir utiliser les deux liaisons indépendamment et pouvoir ainsi établir une connexion sur un des liens en indiquant comme IP de destination, l'IP de la connexion tout en pouvant utiliser le deuxième liens pour établir une autre connexion. Autre cas encore, celui d'un site web héberger sur ou derrière la machine, votre hébergeur vous met à disposition deux liens internet permettant ainsi d'augmenter votre bande passante et vous souhaitez qu'une répartition de charge soit faite entre ces deux liens.
Le problème est que lorsque la machine reçoit une demande de connexion sur un lien, la demande arrive jusqu'au service écoutant sur le réseau et que lorsque celui-ci souhaite répondre, la table de routage de la machine sert à déterminer le lien à utiliser pour faire sortir notre réponse. La logique veut pour que tout fonctionne correctement que le lien utilisé soit le même que celui qu'a empreintée la demande du client. Cependant, le client étant sur le réseau Internet, c'est la route par défaut qui s'applique. Ainsi une connexion entrant sur la liaison 2 peut très bien ressortir par la liaison 1 en fonction du contenu de la table de routage.
Il est nécessaire à lors de mettre en place des règles de routages spécifique pour chacune des liaisons internet.
Ceci passe alors par création dans notre cas de 2 autres tables de routage qui existeront en parallèle de la table par défaut. Il s'agira ensuite d'établir des règles pour spécifier quel trafic utilisera ces tables sachant que par défaut, tout le reste du trafic utilise la table default.
Il faut donc créer une table de routage supplémentaire par liaison internet. Ceci ce passe de la manière suivante :
[ ` grep -c cnx1 /etc/iproute2/rt_tables` -eq 0 ] && echo 4 cnx1 >> /etc/iproute2/rt_tables
Ici, on commence par vérifier que cette table n'existe pas avant de la créer en lui indiquant un ID (ici 4). On répétera donc cette étape autant de fois qu'il y a de liaison internet. Le nom de la table (cnx1 ici) et son ID doivent être unique. Il faut ensuite définir le contenu de ces tables de routage.
Chaque table doit contenir les informations nécessaires à l'établissement du trafic qui l’utilisera. Ainsi il est important de définir un règle de routage par défaut permettant les réponses aux demandes des clients : On utilisera ici l'interface de la liaison concerné pour s'assurer que le trafic sortira bien par cette interface. Il faudra également ajouter les règles nécessaires à l'établissement de la connexion initial du client : par exemple dans notre schéma d'exemple il faudra ajouter que le réseau LAN est accessible via l'interface eth2 pour les requêtes HTTP transmises au serveur Web puisse être routées.
ip route add [LAN] dev eth2 table cnx1 ip route add default dev eth0 table cnx1
[LAN] : L'IP du réseau. Exemple : 192.168.0.0/24
Il faudra ensuite ajouter des règles de routage permettant de dire que le traffic entrant par une connexion soit routé en utilisant la table de routage dédiée à cette connexion.
ip rule add from [ip-cnx1] table cnx1
[ip-cnx1] : L'IP publique de la connexion 1. Exemple : 82.33.44.55
Dans le cas particulier où vous faites du PRE-ROUTING, c’est-à-dire que vous redirigez le trafic arrivant sur la machine gateway vers une autre derrière elle, il faut s'assurer que les réponses emprunteront exactement le circuit inverse et ressortiront par la même interface que les demandes. Pour cela, il faut utiliser la fonctionnalité de conn-mark d'iptables (de Netfilter en réalité) pour suivre les connexions, les marquer avec le module de marquage et ensuite ajouter une règle pour faire en sorte que ces trames marquées soient routées en utilisant la table de routage de l'interface de sortie.
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i eth0 -j CONNMARK --set-mark [MARK1] iptables -t mangle -A PREROUTING -m connmark --mark [MARK1] -j MARK --set-mark [MARK1] * **[MARK1] : ** La marque utilisé pour le trafic de l'interface de la liaison 1. Exemple : //4// * **[MARK2] : ** La marque utilisé pour le trafic de l'interface de la liaison 2. Exemple : //5//
ip rule add fwmark [MARK1] table cnx1 ip rule add fwmark [MARK2] table cnx2
Il est nécessaire que les réseaux vers lesquels le PREROUTING est fait, soient connue de la table de routage de l'interface d'entrée. Si vous faite le routage vers un poste d'un LAN dans notre exemple, ce réseau ayant déjà été ajouté dans les tables de routages, cela devrait fonctionner sans autre modification. Si en outre, vous disposer d'autres réseaux (une DMZ par exemple), il est nécessaire qu'ils soient connus de vos tables de routages si vous souhaitez faire du PREROUTING vers ces réseaux :
ip route add [DMZ] dev [INTERFACE DMZ] table cnx1 ip route add [DMZ] dev [INTERFACE DMZ] table cnx2
Avec :