Plusieurs connections internet sur un routeur
Par Dju » 17 avril 2010 (11:30) - Serveur
Un petit reminder pour indiquer comment gérer plusieurs connection internet à partir d'un seul routeur, sous debian, en fonction de la source.
On va pour cela faire joujou avec ip route et ip rule
Notre routeur a 3 interfaces réseau :
- eth0 pour le réseau local, configurée en 192.168.1.1 avec un masque à 255.255.255.0 (ou 192.168.1.0/24)
- eth1: la première connexion internet, ADSL, en 1.2.3.4, avec une passerelle en 1.2.3.1
- eth2: une 2è connexion internet par fibre optique, plus rapide que l'ADSL, en 2.3.4.5 avec une passerelle en 2.3.4.1
On a défini initialement une route par défaut pour faire sortir toutes les données par eth1 :
route add default gw 1.2.3.1 dev eth1
(ou avec la commande ip route)
ip route add default via 1.2.3.1 dev eth1
dans notre script de firewall, on a une règle de nat en sortie, de type postrouting, dans ce genre :
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 1.2.3.4
Ainsi toutes les connexions sortantes passent par cette 1è connexion internet.
Mettons maintenant qu'on a 2 geeks/gamers/téléchargeurs fous (rayer la mention inutile) qui ont un gros besoin de bande passante, et que l'on veut faire sortir par fibre optique sur eth2.
Pour ce faire on va définir une table de routage, dans laquelle on va définir une route par défaut en eth2, et enfin associer quelques ip internes à cette table.
On commence par créer la table, en éditant le fichier /etc/iproute2/rt_tables.
le fichier se présente en 2 colonnes, la 1è indiquant le numéro de tables, et la 2è son nom.
255 local 254 main 253 default 0 unspec
On ne touche pas à celles déjà existantes et on en créé une nouvelle, dont le numéro peut être entre 1 et 252, que l'on va appeler "fibre"
echo 20 fibre >> /etc/iproute2/rt_tables
on ajoute maintenant dans cette table la route vers eth2
ip route add default via 2.3.4.1 dev eth2 table fibre
puis on associe nos utilisateurs à cette table :
ip rule add from 192.168.1.10 table fibre
ip rule add from 192.168.1.11 table fibre
et on n'oublie surtout pas d'ajouter une règle iptables pour la sortie sur eth2 :
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 2.3.4.5
dorénavant, depuis une des 2 ips en .10 ou .11, on sortira par eth2, et sinon par défaut par eth1
par la suite, si on souhaite automatiser cela afin de configurer ces routes lorsqu'on lance notre script de firewall peut mettre ceci dans un fichier routes.sh :
#!/bin/bash ip route flush table fibre ip route add default via 2.3.4.1 dev eth2 table fibre ip rule add from 192.168.1.10 table fibre ip rule add from 192.168.1.11 table fibre
et on appelle ce fichier routes.sh dans le script du firewall
ha.... Un dernier détail qui peut vous faire perdre du temps
Si sur votre routeur, vous n'avez qu'un seul réseau local (ici le 192.168.1.0/24) pas de problème.
Supposons maintenant que vous ayez un 2è réseau local, en 192.168.2.0/24, sur une interface eth3, et qu'il est censé communiquer avec 192.168.1.0/24
Le firewall est configuré pour, mais Il faut alors, dans notre table fibre rajouter une route prioritaire vers ce réseau. sinon toutes les connection autres qu'en 192.168.1.0/24 partiront par eth2 :p
Donc si on reprend notre exemple ci dessus avec le fichier fibre.sh on aura :
ip route flush table fibre ip route add prio 1 to 192.168.2.0/24 dev eth3 table fibre ip route add prio 2 default via 2.3.4.1 dev eth2 table fibre ip rule add from 192.168.1.10 table fibre ip rule add from 192.168.1.11 table fibre
si on souhaite router un sous réseau entier vers une connection, on peut bien sur faire
ip rule add from 192.168.2.0/24 table fibre
ce qui fera sortir tout le sous réseau 192.168.2.0/24 par la fibre sur l'interface eth2
Et ainsi de suite...
Et une dernière possibilité pour les maniaques du gros débit : faire du load balancing sur les 2 connexions sortantes simultanément.
Au lieu de se créer une table de routage associée à certaines ip internes, on définit une route par défaut ainsi :
ip route add default scope global nexthop via 1.2.3.1 dev eth1 weight 1 nexthop via 2.3.4.1 dev eth2 weight 1
Tout se joue avec le paramètre weight. Ici j'ai un poids de 1 à chacune pour équilibrer. Mais dans la mesure ou la fibre optique est plus rapide, on pourrait faire passer plus de données par la fibre, en mettant un poids de 2:
ip route add default scope global nexthop via 1.2.3.1 dev eth1 weight 1 nexthop via 2.3.4.1 dev eth2 weight 2
On aura de cette manières 2 connexions sortante par eth2 pour 1 sortant par eth1
Amusez vous bien :D
Peut on faire la même chose avec comme repère le port utilisé, plutôt que l'IP ?
ouaip, on peut en s'aidant de iptables, en marquant des paquets et en les associant à une table de routage

Si on reprend l'exemple du billet, on a toujours la route par défaut sur l'adsl (eth1), et on veut que uniquement certains ports (par exemple http et ftp) sortent sur la fibre, sur eth2.
1/ on marque les paquets sortant avec iptables (en sortie direct depuis le routeur, et en sortie depuis le lan)
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 20 ! -d 192.168.1.0/24 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 21 ! -d 192.168.1.0/24 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 ! -d 192.168.1.0/24 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 20 ! -d 192.168.1.0/24 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 21 ! -d 192.168.1.0/24 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 80 ! -d 192.168.1.0/24 -j MARK --set-mark 2
2/ on se définit une table de routage et une route par défaut
echo 100 fibre-out >> /etc/iproute2/rt_tables
ip route add default via 2.3.4.1 dev eth2 table fibre-out
3/ et on associe les paquets marqués à cette table de routage :
ip rule add fwmark 2 table fibre-out
And voila
Awesome issues here. I'm very glad to see your article. Thanks so much and I am having a look ahead to contact you. Will you kindly drop me a e-mail?
Fil des commentaires de ce billet
URL de rétrolien : https://blog.crifo.org/trackback/48