Je l'ai résolu moi-même. Il semble y avoir très peu d'informations sur les choses de réseau que vous pouvez faire avec Linux, j'ai donc décidé de documenter et d'expliquer ma solution en détail. Voici ma configuration finale:
- 3 cartes réseau: eth0 (fil), wlan0 (wifi intégré, faible), wlan1 (adaptateur wifi usb, signal plus fort que wlan0)
- Tous sur un seul sous-réseau, chacun avec sa propre adresse IP.
- eth0 doit être utilisé par défaut pour le trafic entrant et sortant.
- Si eth0 échoue, alors wlan1 doit être utilisé.
- Si wlan1 échoue, alors wlan0 doit être utilisé.
Première étape : créez une nouvelle table de routage pour chaque interface dans /etc/iproute2/rt_tables
. Appelons-les rt1, rt2 et rt3
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
Deuxième étape : configuration du réseau dans /etc/network/interfaces
. Ceci est la partie principale et je vais essayer d'expliquer autant que possible:
auto eth0 wlan0
allow-hotplug wlan1
iface lo inet loopback
iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
post-up ip route add default via 192.168.178.1 dev eth0 table rt1
post-up ip rule add from 192.168.178.99/32 table rt1
post-up ip rule add to 192.168.178.99/32 table rt1
post-up ip route add default via 192.168.178.1 metric 100 dev eth0
post-down ip rule del from 0/0 to 0/0 table rt1
post-down ip rule del from 0/0 to 0/0 table rt1
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.97/32 table rt2
post-up ip rule add to 192.168.178.97/32 table rt2
post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
post-down ip rule del from 0/0 to 0/0 table rt2
post-down ip rule del from 0/0 to 0/0 table rt2
iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
post-up ip rule add from 192.168.178.98/32 table rt3
post-up ip rule add to 192.168.178.98/32 table rt3
post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
post-down ip rule del from 0/0 to 0/0 table rt3
post-down ip rule del from 0/0 to 0/0 table rt3
Si vous tapez, ip rule show
vous devriez voir ce qui suit:
0: from all lookup local
32756: from all to 192.168.178.98 lookup rt3
32757: from 192.168.178.98 lookup rt3
32758: from all to 192.168.178.99 lookup rt1
32759: from 192.168.178.99 lookup rt1
32762: from all to 192.168.178.97 lookup rt2
32763: from 192.168.178.97 lookup rt2
32766: from all lookup main
32767: from all lookup default
Cela nous indique que le trafic entrant ou sortant de l'adresse IP "192.168.178.99" utilisera la table de routage rt1. Jusqu'ici tout va bien. Mais le trafic généré localement (par exemple, vous voulez envoyer une requête ping ou ssh de la machine à un autre endroit) nécessite un traitement spécial (voir la grande citation dans la question).
Les quatre premières lignes de post-up /etc/network/interfaces
sont simples et des explications peuvent être trouvées sur Internet, la cinquième et dernière ligne de post-up est celle qui fait que la magie opère:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Notez comment nous n'avons pas spécifié de table de routage pour cette ligne de post-up. Si vous ne spécifiez pas de table de routage, les informations seront enregistrées dans la main
table de routage que nous avons vue ip rule show
. Cette ligne de post-up place une route par défaut dans la table de route "principale" qui est utilisée pour le trafic généré localement qui n'est pas une réponse au trafic entrant. (Par exemple, un MTA sur votre serveur essayant d'envoyer un e-mail.)
Les trois interfaces placent toutes une route par défaut dans la table de route principale, bien qu'avec des métriques différentes. Jetons un coup d'œil à la main
table de routage avec ip route show
:
default via 192.168.178.1 dev eth0 metric 100
default via 192.168.178.1 dev wlan1 metric 101
default via 192.168.178.1 dev wlan0 metric 102
192.168.178.0/24 dev wlan0 proto kernel scope link src 192.168.178.97
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.99
192.168.178.0/24 dev wlan1 proto kernel scope link src 192.168.178.98
Nous pouvons voir que la table de routage principale a trois routes par défaut, bien qu'avec différentes métriques. La priorité la plus élevée est eth0, puis wlan1 puis wlan0 car des nombres métriques inférieurs indiquent une priorité plus élevée. Étant donné que eth0
la métrique la plus basse est la route par défaut qui va être utilisée aussi longtemps qu'elle eth0
est en place. S'il eth0
diminue, le trafic sortant passe à wlan1
.
Avec cette configuration, nous pouvons saisir ping 8.8.8.8
un terminal et ifdown eth0
un autre. ping
devrait toujours fonctionner car, car ifdown eth0
supprimera l'itinéraire par défaut lié à eth0
, le trafic sortant basculera vers wlan1
.
Les lignes de post-down s'assurent que les tables de routage associées sont supprimées de la base de données de politique de routage ( ip rule show
) lorsque l'interface tombe en panne, afin de garder tout en ordre.
Le problème qui reste est que lorsque vous retirez la prise de eth0
la route par défaut pour eth0
est toujours là et le trafic sortant échoue. Nous avons besoin de quelque chose pour surveiller nos interfaces et pour exécuter ifdown eth0
s'il y a un problème avec l'interface (c'est-à-dire une panne de NIC ou quelqu'un tirant la prise).
Dernière étape : entrez ifplugd
. C'est un démon qui surveille les interfaces et s'exécute ifup/ifdown
si vous débranchez la prise ou s'il y a un problème avec la connexion wifi /etc/default/ifplugd
:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Vous pouvez maintenant retirer la fiche eth0
, le trafic sortant basculera vers wlan1
et si vous remettez la fiche en place, le trafic sortant redeviendra eth0
. Votre serveur restera en ligne tant que l'une des trois interfaces fonctionnera. Pour vous connecter à votre serveur, vous pouvez utiliser l'adresse IP de eth0 et en cas d'échec, l'adresse IP de wlan1 ou wlan0.