Multiple Gateway

Lorsque l’on a plusieurs possibilités de sortie sur son firewall, il existe un moyen d’orienter le trafic vers l’une au l’autre des routes, en fonction de règles iptables / Netfilter. Une machine peut alors simultanément utiliser un VPN pour certaines connexions, et une connexion ADSL ou fibre pour d’autres par exemple. Ce processus est un peu plus complexe sur Linux que sur BSD : c’est ce premier cas que nous allons traiter. Tout au long de l’article, les lignes de commande sont précédées d’un dièse afin de vous éviter des copier-coller « dangereux ».

Pour créer de multiples gateways, il faut dans un premier temps que l’advanced routing soit activé sur votre noyau ; c’est déjà le cas sur les noyaux Linux des distributions standard. La deuxième étape est de définir plusieurs tables de routage, puis d’assigner chaque trafic à la table souhaitée. Cela peut se faire en fonction de l’IP source, de l’IP de destination, du port utilisé, ou encore du type de trafic (icmp, upd, tcp).

C’est parti ! Nous allons prendre comme exemple un routage dynamique avec un VPN d’un côté, et une liaison fibre de l’autre.

  • Le gateway de la liaison fibre est en 192.168.5.2 sur l’eth0
  • L’eth0 est en 192.168.5.1
  • Le range d’IP locales est 192.168.1.1 sur l’eth1

Etape 1 : etablir plusieurs tables de routage

Commençons par établir la première table, qui concerne la liaison fibre. Nous appellerons cette table « tbl_fibre » .

#ip rule del from all fwmark 1 2>/dev/null
#ip route flush table tbl_fibre
#ip route add table tbl_fibre default dev eth0 via 192.168.5.1
#ip route add table tbl_fibre 192.168.1.0/24 dev eth1 src 192.168.1.1
#ip route add table tbl_fibre 192.168.5.0/24 dev eth0 src 192.168.5.2
#ip rule add from 192.168.5.2 table tbl_fibre
#ip rule add fwmark 0x1 table tbl_fibre

Passons ensuite à la deuxième table, qui concerne, elle, la liaison VPN (« tbl_vpn » ). Les paramètres d’une telle liaison étant variables, on les récupère d’abord grâce à un script.

#export TUNIP=`ifconfig | grep tun -A1 | grep « addr: » | cut -f2 -d « : » |cut -f1 -d  » « `
#export TUNDEV=`ifconfig | grep tun| awk ‘{ print $1 }’`
#export TUNROUTE=`route -n | grep tun| awk ‘{ print $1 }’`ip rule del from all fwmark 2 2>/dev/null
#ip route flush table tbl_vpn
#ip route add table tbl_vpn default dev $TUNDEV via $TUNIP
#ip route add table tbl_vpn $TUNROUTE dev $TUNDEV src $TUNIP
#ip route add table tbl_vpn 192.168.1.0/24 dev eth1 src 192.168.1.1
#ip route add table tbl_vpn 192.168.5.0/24 dev eth0 src 192.168.5.2
#ip rule add from $TUNIP table tbl_vpn
#ip rule add fwmark 0x2 table tbl_vpn
#for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > « $i »; done

Deuxième étape : paramétrer Iptables 

Continuons notre exemple. La configuration suivante vous permettra, dans un LAN, de mettre en place les éléments suivants :

Multiple gateways
  • Tout le trafic de l’IP 168.1.120 sera redirigé vers le VPN
  • Le trafic de l’IP 168.1.3 sera redirigé vers la liaison fibre, sauf les paquets passant par le port 49995 qui seront redirigés vers le VPN.
#iptables -t mangle -Fiptables -t mangle -X
#ip route flush cacheiptables -t mangle -A PREROUTING -s 192.168.1.120 -j MARK –set-mark 2
#iptables -t mangle -A PREROUTING -s 192.168.1.3 -p tcp –dport 49995 -j MARK –set-mark 2
#iptables -t mangle -A POSTROUTING -j CONNMARK –restore-markiptables -t mangle -A POSTROUTING -m mark ! –mark 0 -j ACCEPT
#iptables -t mangle -A POSTROUTING -o eth0 -j MARK –set-mark 1
#iptables -t mangle -A POSTROUTING -o $TUNDEV -j MARK –set-mark 2
#iptables -t mangle -A POSTROUTING -s 192.168.1.3 -m conntrack –ctstate NEW -j MARK –set-mark 2
#iptables -t mangle -A POSTROUTING -j CONNMARK –save-mark

Par Philippe Humeau & Lucie Saunois

Lucie Saunois
Lucie Saunois
Passionnée d'informatique, en particulier de sécurité, depuis qu'elle a rejoint l'OT Group en 2015, Lucie se spécialise dans la vulgarisation technique pour permettre à tous d'appréhender ces sujets parfois complexes.