Chciałbym mieć wiele kart sieciowych (eth0 i wlan0) w tej samej podsieci i służyć jako kopia zapasowa aplikacji na hoście, jeśli jedna z kart sieciowych zawiedzie. Z tego powodu stworzyłem dodatkową tabelę routingu. Oto jak /etc/network/interfaces
wygląda:
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
Działa to w przypadku łączenia się z hostem: nadal mogę do niego SSH, jeśli jeden z interfejsów zawiedzie. Jednak aplikacje na hoście nie mogą zainicjować połączenia ze światem zewnętrznym, jeśli nie eth0
działa. To jest mój problem.
Przeszukałem ten temat i znalazłem następujące interesujące informacje:
Gdy program inicjuje połączenie wychodzące, normalne jest używanie wieloznacznego adresu źródłowego (0.0.0.0), co oznacza brak preferencji co do tego, który interfejs jest używany, pod warunkiem że odpowiedni adres docelowy jest osiągalny. Nie jest on zastępowany określonym adresem źródłowym, dopóki nie zostanie podjęta decyzja o routingu. Ruch związany z takimi połączeniami nie będzie zatem zgodny z żadną z powyższych reguł zasad i nie będzie kierowany do żadnej z nowo dodanych tabel routingu. Zakładając normalną konfigurację, zamiast tego przejdzie do głównej tabeli routingu. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html
Chcę, aby główna tabela tras miała więcej niż jedną bramę domyślną (jedną włączoną eth0
i jedną włączoną wlan0
) oraz przejść do domyślnej bramy eth0
domyślnie i przez wlan0
if, jeśli nie eth0
działa.
Czy to jest możliwe? Co muszę zrobić, aby osiągnąć taką funkcjonalność?
Odpowiedzi:
Sam to rozwiązałem. Wydaje się, że jest bardzo mało informacji na temat pracy w sieci z Linuksem, więc postanowiłem szczegółowo udokumentować i wyjaśnić moje rozwiązanie. Oto moja końcowa konfiguracja:
Pierwszy krok : utwórz nową tabelę tras dla każdego interfejsu w
/etc/iproute2/rt_tables
. Nazwijmy je rt1, rt2 i rt3Drugi krok : konfiguracja sieci w
/etc/network/interfaces
. To jest główna część i postaram się wyjaśnić jak najwięcej:Po wpisaniu
ip rule show
powinieneś zobaczyć następujące informacje:To mówi nam, że ruch przychodzący lub wychodzący z adresu IP „192.168.178.99” będzie korzystał z tablicy tras rt1. Jak na razie dobrze. Ale ruch generowany lokalnie (na przykład chcesz pingować lub ssh z komputera do innego miejsca) wymaga specjalnego traktowania (patrz duży cytat w pytaniu).
Pierwsze cztery linijki post-up
/etc/network/interfaces
są proste, a wyjaśnienia można znaleźć w Internecie, piąta i ostatnia linijka post-up to magia:Zwróć uwagę, że nie określono tabeli tras dla tej linii post-up. Jeśli nie określisz tabeli tras, informacje zostaną zapisane w
main
tabeli tras, w której widzieliśmyip rule show
. Ta linia post-up umieszcza domyślną trasę w „głównej” tabeli tras, która jest używana dla ruchu generowanego lokalnie, który nie jest odpowiedzią na ruch przychodzący. (Na przykład MTA na twoim serwerze próbuje wysłać wiadomość e-mail).Wszystkie trzy interfejsy umieszczają domyślną trasę w głównej tabeli tras, aczkolwiek z różnymi wskaźnikami. Rzućmy okiem na
main
tabelę tras zip route show
:Widzimy, że główna tabela tras ma trzy trasy domyślne, choć z różnymi metrykami. Najwyższy priorytet to eth0, następnie wlan1, a następnie wlan0, ponieważ niższe liczby wskaźników wskazują wyższy priorytet. Ponieważ
eth0
ma najniższą metrykę, jest to domyślna trasa, która będzie używana tak długo, jaketh0
się da . Jeślieth0
spadnie, ruch wychodzący przełączy się nawlan1
.Dzięki tej konfiguracji możemy pisać
ping 8.8.8.8
w jednym terminalu, aifdown eth0
w drugim.ping
powinien nadal działać, ponieważ ponieważifdown eth0
usunie domyślną trasę związaną zeth0
, ruch wychodzący przełączy się nawlan1
.Linie post-down upewniają się, że powiązane tabele tras są usuwane z bazy danych strategii routingu (
ip rule show
), gdy interfejs się psuje, aby wszystko było uporządkowane.Pozostaje problem, że po wyciągnięciu wtyczki z
eth0
domyślnej trasyeth0
nadal tam jest, a ruch wychodzący nie działa. Potrzebujemy czegoś do monitorowania naszych interfejsów i wykonywania,ifdown eth0
jeśli występuje problem z interfejsem (np. Awaria karty sieciowej lub ktoś wyciąga wtyczkę).Ostatni krok : wprowadź
ifplugd
. To demon, który obserwuje interfejsy i uruchamia się,ifup/ifdown
jeśli wyciągniesz wtyczkę lub wystąpi problem z połączeniem Wi-Fi/etc/default/ifplugd
:Możesz teraz wyciągnąć wtyczkę
eth0
, ruch wychodzący przełączy się na,wlan1
a jeśli ponownie włożysz wtyczkę, ruch wychodzący przełączy się z powrotem naeth0
. Twój serwer pozostanie online tak długo, jak długo działa którykolwiek z trzech interfejsów. Aby połączyć się z serwerem, możesz użyć adresu IP eth0, a jeśli to się nie powiedzie, adres IP wlan1 lub wlan0.źródło
scp
Sesja pęknie, ponieważ adres IP zmienia. Wwithsctp
takim przypadku możesz spróbować użyć, aby utrzymać połączenie przy życiu lub użyćrsync
zamiast,scp
aby kontynuować przesyłanie od miejsca, w którym się zatrzymało.withsctp
będzie działać również tylko dla jednej domyślnej trasy.Linux zapewnia lepsze rozwiązanie niż obejście skryptu: łączenie z aktywną kopią zapasową.
W ten sposób twój komputer będzie miał tylko jeden adres IP (i jeden adres mac) i automatycznie i przejrzyście przełącza interfejsy, jeśli jeden interfejs stanie się niedostępny. Brak zakłóceń jakiegokolwiek połączenia TCP (ani do wewnętrznej sieci LAN, ani do Internetu).
Sam używam tej konfiguracji do automatycznego przełączania awaryjnego z eth0 na wlan0 na moim laptopie Debian po odłączeniu laptopa od stacji dokującej.
Moje / etc / network / interfaces:
Możesz łatwo rozszerzyć tę konfigurację o wiele urządzeń WLAN. Ustawienie
primary_reselect
opcjibetter
(automatycznie wybierz najszybszy link) powinno tu pomóc.Aby uzyskać więcej informacji, zobacz https://wiki.linuxfoundation.org/networking/bonding i https://wiki.debian.org/Bonding
I (oczywiście) dokumentację jądra Linux na https://www.kernel.org/doc/Documentation/networking/bonding.txt
źródło