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