Vyřešil jsem to sám. Zdá se, že existuje velmi málo informací o síťových věcech, které můžete s Linuxem dělat, a tak jsem se rozhodl své řešení podrobně zdokumentovat a vysvětlit. Toto je moje konečné nastavení:
- 3 síťové karty:eth0 (drát), wlan0 (vestavěná wifi, slabá), wlan1 (usb wifi adaptér, silnější signál než wlan0)
- Všechny v jedné podsíti, každá s vlastní IP adresou.
- eth0 by se mělo ve výchozím nastavení používat pro příchozí i odchozí provoz.
- Pokud eth0 selže, měl by být použit wlan1.
- Pokud selže wlan1, měl by být použit wlan0.
První krok :Vytvořte novou směrovací tabulku pro každé rozhraní v /etc/iproute2/rt_tables
. Říkejme jim rt1, rt2 a rt3
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
Druhý krok :Konfigurace sítě v /etc/network/interfaces
. Toto je hlavní část a já se pokusím vysvětlit co nejvíce:
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
Pokud zadáte ip rule show
měli byste vidět následující:
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
To nám říká, že provoz příchozí nebo odchozí z adresy IP „192.168.178.99“ bude používat směrovací tabulku rt1. Zatím je vše dobré. Ale provoz, který je generován lokálně (například chcete ping nebo ssh ze stroje někam jinam), vyžaduje zvláštní zacházení (viz velká citace v otázce).
První čtyři post-up řádky v /etc/network/interfaces
jsou jednoduché a vysvětlení lze nalézt na internetu, pátý a poslední řádek je ten, který dělá kouzlo:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Všimněte si, že jsme neurčili směrovací tabulku pro tento post-up řádek. Pokud neurčíte směrovací tabulku, informace se uloží do main
směrovací tabulku, kterou jsme viděli v ip rule show
. Tento dodatečný řádek vloží výchozí trasu do "hlavní" tabulky směrování, která se používá pro místně generovaný provoz, který není odpovědí na příchozí provoz. (Například MTA na vašem serveru se pokouší odeslat e-mail.)
Všechna tři rozhraní vkládají do hlavní směrovací tabulky výchozí trasu, i když s různými metrikami. Podívejme se na main
směrovací tabulka s 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
Vidíme, že hlavní tabulka tras má tři výchozí trasy, i když s různými metrikami. Nejvyšší priorita je eth0, potom wlan1 a potom wlan0, protože nižší metrická čísla znamenají vyšší prioritu. Od eth0
má nejnižší metriku, toto je výchozí trasa, která se bude používat po dobu eth0
je nahoře. Pokud eth0
klesne, odchozí provoz se přepne na wlan1
.
S tímto nastavením můžeme napsat ping 8.8.8.8
v jednom terminálu a ifdown eth0
v jiném. ping
by měl stále fungovat, protože ifdown eth0
odstraní výchozí trasu související s eth0
, odchozí provoz se přepne na wlan1
.
Přídavné řádky zajišťují, že související tabulky směrování budou odstraněny z databáze zásad směrování (ip rule show
), když se rozhraní vypne, aby bylo vše uklizené.
Problém, který zbývá, je, že když vytáhnete zástrčku z eth0
výchozí trasa pro eth0
je stále tam a odchozí provoz selže. Potřebujeme něco, co by monitorovalo naše rozhraní a spouštělo ifdown eth0
pokud je problém s rozhraním (např. selhání síťové karty nebo někdo vytahuje zástrčku).
Poslední krok :zadejte ifplugd
. To je démon, který sleduje rozhraní a spouští ifup/ifdown
pokud vytáhnete zástrčku nebo pokud je problém s připojením wifi /etc/default/ifplugd
:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Nyní můžete vytáhnout zástrčku na eth0
, odchozí provoz se přepne na wlan1
a pokud zásuvku vložíte zpět, odchozí provoz se přepne zpět na eth0
. Váš server zůstane online, dokud bude fungovat kterékoli ze tří rozhraní. Pro připojení k vašemu serveru můžete použít ip adresu eth0 a pokud se to nepodaří, ip adresu wlan1 nebo wlan0.
Linux poskytuje lepší řešení než vaše skriptované řešení:propojení aktivních záloh.
Tímto způsobem bude mít váš počítač pouze jeden IP adresu (a jednu mac adresu) a automaticky a transparentně přepínat rozhraní, pokud se jedno rozhraní stane nedostupným. Žádné přerušení jakéhokoli připojení TCP (ani k vaší interní síti LAN ani k internetu).
Sám toto nastavení používám k automatickému převzetí služeb při selhání z eth0 na wlan0 na mém notebooku s debianem, když odpojím svůj notebook od dokovací stanice.
Moje /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
Toto nastavení můžete snadno rozšířit tak, aby zahrnovalo více zařízení WLAN. Nastavení
primary_reselect
možnost na better
(automaticky vybere nejrychlejší odkaz) by zde mělo pomoci.
Další informace najdete na https://wiki.linuxfoundation.org/networking/bonding a https://wiki.debian.org/Bonding
A (samozřejmě) dokumentaci linuxového jádra na https://www.kernel.org/doc/Documentation/networking/bonding.txt