web-dev-qa-db-fra.com

Est-il possible d'avoir plusieurs passerelles par défaut pour les connexions sortantes?

Je voudrais avoir plusieurs NIC (eth0 et wlan0) dans le même sous-réseau et servir de sauvegarde pour les applications sur l'hôte si l'un des NIC échoue. Pour cette raison, j'ai créé une table de routage supplémentaire. C'est ainsi /etc/network/interfaces regards:

iface eth0 inet static
address 192.168.178.2
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.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
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.3 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.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Cela fonctionne pour la connexion à l'hôte: je peux toujours y accéder en cas de défaillance de l'une des interfaces. Cependant, les applications sur l'hôte ne peuvent pas initialiser une connexion au monde extérieur si eth0 est éteint. Voilà mon problème.

J'ai fait des recherches sur ce sujet et trouvé les informations intéressantes suivantes:

Lorsqu'un programme initie une connexion sortante, il est normal qu'il utilise l'adresse source générique (0.0.0.0), n'indiquant aucune préférence quant à l'interface utilisée à condition que l'adresse de destination appropriée soit accessible. Elle n'est remplacée par une adresse source spécifique qu'après la décision de routage. Le trafic associé à de telles connexions ne correspondra donc à aucune des règles de politique ci-dessus et ne sera dirigé vers aucune des tables de routage nouvellement ajoutées. En supposant une configuration par ailleurs normale, il passera à la place à la table de routage principale. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Ce que je veux, c'est que la table de routage principale ait plus d'une passerelle par défaut (une sur eth0 et un sur wlan0) et pour accéder à la passerelle par défaut via eth0 par défaut et via wlan0 si eth0 est éteint.

Est-ce possible? Que dois-je faire pour obtenir une telle fonctionnalité?

18
rosix

Je l'ai résolu moi-même. Il semble y avoir très peu d'informations sur les fonctionnalités de mise en 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 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 dans /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 table de routage main que nous avons vue dans 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 œil à la table de routage main 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 des métriques différentes. 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. Depuis eth0 a la métrique la plus basse, c'est la route par défaut qui va être utilisée aussi longtemps que eth0 est en place. Si eth0 diminue, le trafic sortant passe à wlan1.

Avec cette configuration, nous pouvons taper ping 8.8.8.8 dans un terminal et ifdown eth0 en autre. ping devrait encore fonctionner parce que ifdown eth0 supprimera la route par défaut liée à eth0, le trafic sortant passera à 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 fiche 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 exécuter ifdown eth0 s'il y a un problème avec l'interface (c'est-à-dire NIC échec ou quelqu'un qui débranche la prise).

Dernière étape: entrez ifplugd. C'est un démon qui surveille les interfaces et 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 débrancher la prise eth0, le trafic sortant passera à wlan1 et si vous remettez le plug-in, le trafic sortant reviendra à eth0. Votre serveur restera en ligne aussi longtemps que l'une des trois interfaces fonctionnera. Pour vous connecter à votre serveur, vous pouvez utiliser l'adresse IP de eth0 et si cela échoue, l'adresse IP de wlan1 ou wlan0.

20
rosix

Linux offre une meilleure solution que votre solution de script: la liaison de sauvegarde active.

De cette façon, votre machine n'aura qu'une une adresse IP (et une adresse mac) et commutera automatiquement et de manière transparente les interfaces si une interface devient indisponible. Aucune interruption de toute connexion TCP (ni à votre réseau local ni à Internet).

J'utilise moi-même cette configuration pour basculer automatiquement de eth0 à wlan0 sur mon ordinateur portable Debian lorsque je déconnecte mon ordinateur portable de la station d'accueil.

Mes/etc/network/interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Vous pouvez facilement étendre cette configuration pour inclure plusieurs périphériques WLAN. Réglage du primary_reselect l'option pour better (sélectionner automatiquement le lien le plus rapide) devrait aider ici.

Pour plus d'informations, voir https://wiki.linuxfoundation.org/networking/bonding et https://wiki.debian.org/Bonding

Et (bien sûr) la documentation du noyau linux sur https://www.kernel.org/doc/Documentation/networking/bonding.txt

12
Thilo