Avec la baisse des prix des connexions haut débit, et l’arrivée massive de l’adsl dégroupé, il est aujourd’hui tout a fait imaginable d’avoir une haut disponibilité d’Internet en combinant 2 ou plusieurs connexions « grand public ».
Le but n’est pas de « booster » une connexion, mais plutôt d’assurer une redondance, vis à vis, dans le carde d’un serveur web par exemple,ou pour l’accès à Internet, lorsque cela est crucial pour l’entreprise.
Mais cela peut aussi être le simple particulier, hésitant à troquer sa « vielle » connexion câble, contre une nouvelle connexion adsl dégroupé, dont il sait pertinemment qu’il aura des problèmes au début avec, et qui souhaite combiner Câble et Adsl pendant un temps.
Dans les 2 cas, comme la structure est assez petite, il n’est pas la peine d’investir dans un » gros » routeur, un petit coin de ressources d’un serveur, ou une vielle antiquité sortie du placard suffiront. Bien sur Linux est de la partie !
Présentation de la solution
Nous allons utiliser l’exemple suivant, dans lequel on souhaite combiner une connexion ADSL et une autre par le câble, afin d’assurer une haute disponibilité d’Internet pour le réseau local. Le serveur tourne sous Gentoo, et fait aussi office de serveur Web.
Les 2 modems sont des modems Ethernet, et le serveur possède 3 cartes réseau :
- Eth0 pour le réseau local
- Eth1 pour la connexion ADSL
- Eth2 pour la connexion Câble
Configuration Logiciel requise pour Linux
La plupart des distributions Linux et des UNIX utilisent couramment les incontournables commandes ifconfig et route. Bien que ces outils fonctionnent, ils montrent quelques comportements inattendus. Nous allons donc utiliser iproute2. Ce nouveau codage de la partie réseau apporte à Linux des performances et des fonctionnalités qui n’ont pratiquement pas d’équivalent parmi les autres systèmes d’exploitation.
Afin de configurer iproute2, les outils utilisateur sont nécessaires, Le paquet concerné s’appelle » iproute » sur Gentoo et Debian.
Certains éléments d’iproute vous imposent l’activation de certaines options du noyau. Dans notre cas, nous aurons besoin du support de NETFILTER.
Nous aurons aussi besoin d’Iptables afin d’assurer une sécurité minimale.
1.3 récupérer tout les paramètres de connexion
Malgré le fait qu’aujourd’hui les connexions « grand publique » ont des IPs fixes ou « quasi-fixes », elles utilisent le Protocole DHCP pour attribuer les adresses IP. Dans notre cas cela n’est pas très pratique car quand une interface sera réinitialisée (par ex changement de modem ou autre), l’attribution DHCP entachera notre jolie table de routage.Afin d’éviter ce petit désagrément, nous allons créer un script recréant intégralement la table de routage, dans le quel nous intégrerons tout les paramètres nécessaires, et recréant aussi les règles iptables Pour cela il faut donc récupérer tous les paramètres des 2 connexions.
Afin d’éviter tout conflit il ne faut activer qu’une interface à la fois pour la récupération des paramètres.
# /etc/init.d/net.eth1 start
* Bringing eth1 up via DHCP… [ ok ]
* eth2 received address 82.62.138.213
# ip route show dev eth1
82.62.138.0/24 scope link src 82.62.138.213
default via 82.62.138.254 src 82.62.138.213
# cat /etc/resolv.conf
nameserver 212.27.39.134
nameserver 212.27.39.135
search fourniseur-adsl.fr
# /etc/init.d/net.eth1 stop
* Bringing eth2 down
* Releasing DHCP lease for eth2… [ ok ]
* Stopping eth2… [ ok ]
Avec ces quelques commandes nous avons pu récupérer :
- l’adresse ip de l’interface : 81.62.138.213
- le réseau de l’interface : 82.62.138.0/24
- l’adresse de la passerelle : 82.62.138.254
- les adresses des serveurs DNS : 212.27.39.134 et 212.27.39.135
La procédure et la même pour eth2 (connexion câble)
Nous pouvons donc commencer à editer notre script, afin de déclarer des variables qui nous faciliterons la tache plutard :
- ETH_* : pour le nom de l’interface
- NET_* : pour le réseau de l’interface
- IP_* : pour l’ip de l’interface
- GAT_* : pour la passerelle sur l’interface
#!/bin/sh
ETH_LOCAL= »eth0″
NET_LOCAL= »172.16.64.0/24″
IP_LOCAL= »172.16.64.1″
ETH_ADSL= »eth1″
NET_ADSL= »82.62.138.0/24″
IP_ADSL= »81.62.138.213″
GAT_ADSL= »82.62.138.254″
ETH_CABLE= »eth2″
NET_CABLE= »61.124.78.0/22″
IP_CABLE= »61.124.79.53″
GAT_CABLE= »61.124.81.254″
Tables de routages
Création et initialisation des tables
Iproute2 permet de créer plusieurs tables de routages, nous allons donc créer 2 tables supplémentaires, une par connexion: TADSL et TCABLE. Les déclarations de tables sont stockés dans /etc/iproute2/rt_tables .
#echo ‘201 TADSL’ >>/etc/iproute2/rt_tables
#echo ‘202 TCABLE’ >>/etc/iproute2/rt_tables
La première chose à faire, est de nettoyer les différentes tables, afin d’effacer une
hypothétique pollution DHCP, ainsi que les routes déjà connues du serveur.
ip route flush table TADSL
ip route flush table TCABLE
ip route flush table main
ip route flush cache
Les tables de routage
Nous allons maintenant peupler la table main :
ip route add 127.0.0.0/8 dev lo src 127.0.0.1
ip route add $NET_LOCAL dev $ETH_LOCAL src $IP_LOCAL
ip route add $NET_ADSL dev $ETH_ADSL src $IP_ADSL
ip route add $NET_CABLE dev $ETH_CABLE src $IP_CABLE
Il s’agit des 3 réseaux directement accessibles. A noter qu’il est important de re-spécifier l’interface lookup, vu que nous avons complètement réinitialisé la table.
Nous allons maintenant peupler la table TADSL. Il s’agit d’une table ne tenant compte que de la connexion Internet par ADSL. Néanmoins, on y retrouve donc tout les réseaux, directement connecté, y compris le réseau de la connexion « câble ».
ip route add $NET_ADSL dev $ETH_ADSL src $IP_ADSL table TADSL
ip route add $NET_LOCAL dev $ETH_LOCAL src $IP_LOCAL table TADSL
ip route add $NET_CABLE dev $ETH_CABLE src $IP_CABLE table TADSL
ip route add 127.0.0.0/8 dev lo src 127.0.0.1 table TADSL
ip route add default dev $ETH_ADSL src $IP_ADSL via $GAT_ADSL table TADSL
Idem pour la table TCABLE
ip route add $NET_CABLE dev $ETH_CABLE src $IP_CABLE table TCABLE
ip route add $NET_LOCAL dev $ETH_LOCAL src $IP_LOCAL table TCABLE
ip route add $NET_ADSL dev $ETH_ADSL src $IP_ADSL table TCABLE
ip route add 127.0.0.0/8 dev lo src 127.0.0.1 table TCABLE
ip route add default dev $ETH_CABLE src $IP_CABLE via $GAT_CABLE table TCABLE
2.3 Route par défaut
Nous allons maintenant définir la passerelle par défaut via la quelle on accèdera à internet, en l’occurrence ici, l’Adsl.
ip route add default dev $ETH_ADSL src $IP_ADSL via $GAT_ADSL
2.4 Règles de routage
Nous allons maintenant mettre en place les règles de routage.
ip rule add from $IP_CABLE pref 100 table TCABLE
ip rule add from $IP_ADSL pref 200 table TADSL
ip rule add pref 300 table main
Le principe général issu de ces règles est d’utiliser la table de routage adéquate, lorsqu’on souhaite communiquer via l’Adsl ou le Câble. Afin de communiquer via l’interface souhaitée, et avec la bonne ip source
Protection et partage de connection
Création et initialisation d’iptables
On active l’ip Forwarding et la protection contre l’IP spoofing fournie par le noyau, puis on réinitialise les règles d’Iptables, et on défini DROP (rejeter) comme règle par défaut.
echo 1 > /proc/sys/net/ipv4/ip_forward if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] then for f in /proc/sys/net/ipv4/conf/*/rp_filter do echo 1 > $f done fi iptables -F iptables -t nat -F iptables -t mangle -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Règles pour le trafic local
On accepte tout ce qui provient du réseau local.
iptables -A INPUT -j ACCEPT -i lo
iptables -A INPUT -j ACCEPT -i $ETH_LOCAL
Forwarding et NAT
On force l’adresse source quand on NAT, afin d’être sur d’avoir la bonne adresse ip source
sur la bonne interface
iptables -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o $ETH_ADSL -j SNAT –to-source $IP_ADSL
iptables -t nat -A POSTROUTING -o $ETH_CABLE -j SNAT –to-source $IP_CABLE
Règles pour le trafic venant d’ Internet
On accepte le trafic HTTP et SSH, ainsi que les connexions déja établies.
iptables -A INPUT -j ACCEPT -m state –state ESTABLISHED,RELATED
iptables -A INPUT -j ACCEPT -p TCP –dport ssh
iptables -A INPUT -j ACCEPT -p TCP –dport www
Cas pas défaut
Par défaut, tous les paquets entrants sont rejetés, par contre on accepte toutes les sorties.
iptables -A INPUT -j DROP
iptables -A OUTPUT -j ACCEPT
Poru finir
Nous avons vu qu’il est tout a fait possible de cumuler plusieurs connexions Internet à partir d’un poste linux. Bien sur il ne s’agit pas de cumuler les débits, mais plutôt d’augmenter la disponibilité d’Internet et/ou d’un serveur web sur le net, car il est simultanément accessible via les 2 connections.
En cas de défaillance d’une des 2 connections, il est aisé de changer la route par défaut et de la définir via l’autre connexion, et cela de manière transparente pour les postes clients et autre matériel réseau.