Jądro Linux w wersji wcześniejszej niż 3.6 używało buforowania tras do rutowania IPv4 wielościeżkowego, co oznaczało, że routing między dwiema oddzielnymi liniami / dostawcami usług internetowych był dość łatwy. Od wersji 3.6 algorytm zmienił się na pakiet na pakiet, co oznacza, że niektóre triki znaczników tabeli / reguły / iptables były wymagane do uzyskania dwóch linii / dostawców usług internetowych.
Jeśli jednak masz dwie linie z tym samym usługodawcą internetowym, który może przekierować pojedynczy adres IP w dół obu linii na zasadzie na pakiet w sposób zrównoważony / awaryjny, to od wersji 3.6 można łatwo osiągnąć łączenie linii (na poziomie adresu IP) z powodu routing na pakiet w obu kierunkach.
Z 4.4 jądro ponownie zmieniło się na równoważenie obciążenia oparte na przepływie oparte na haszowaniu adresów źródłowych i docelowych.
Obecnie korzystam z jądra 4.4.36 i używam routingu wielościeżkowego przez połączenia PPPoE. Mój dalszy ruch z ISP jest kierowany przez dwie oddzielne linie na podstawie pakietu (jeden adres IP kierowany w obie linie). Daje mi to prędkość pobierania większą niż prędkość jednej linii. Prawie prędkość obu linii zsumowanych. Działa naprawdę dobrze, wideo Skype, VoIP (UDP), YouTube itp. Wszystko działa świetnie.
Ze względu na tak dobre doświadczenie pobierania danych, chcę wypróbować go wcześniej, ale mój ruch pobierania danych jest kierowany zgodnie z nowszym algorytmem opartym na przepływie na obu urządzeniach ppp (które mają ten sam adres IP). Oznacza to, że nie mogę osiągnąć prędkości wysyłania większej niż prędkość pojedynczej linii.
Czy istnieje sposób skonfigurowania bieżącego jądra do korzystania z algorytmu dla pakietu? A może jakaś inna metoda osiągnięcia routingu wielościeżkowego na pakiet? Czy musiałbym powrócić do starszego jądra (czego nie chcę robić z różnych innych powodów)?
Mój ISP nie obsługuje wielu łączy ppp.
W razie potrzeby korzystam obecnie z Arch Linux ARMv7 na Raspberry Pi 3.
źródło
Odpowiedzi:
Ok, więc po tym, jak miałem więcej czasu, aby to zbadać, znalazłem sposób na zrobienie tego przy użyciu Linux TEQL (True Link Equalizer). Oto link, który swobodnie śledziłem, ale z pewnymi poprawkami.
http://lartc.org/howto/lartc.loadshare.html
Tak to działa na Arch Linux ARMv7 (Raspberry Pi 3)
Podczas uruchamiania:
Następujące polecenie powinno zostać uruchomione podczas rozruchu, aby załadować odpowiedni moduł jądra.
Następujące polecenia również działają przy rozruchu, zakładając, że chcesz NAT z sieci lokalnej na eth0.
Ruch powrotny FORWARD odbywa się na ppp +, a POSTROUTING MASQUERADE na teql +, ponieważ ruch wychodzący jest wyłączany na teql, a ruch powrotny wraca na ppp.
Gdy pojawią się linki ppp:
Zakładając, że łączami, które mają być równoważone obciążeniem, są ppp, następujące polecenia należy uruchamiać w skrypcie w
/etc/ppp/ip-up.d/
skrypcie.Gdzie
1.1.1.1
jest twój publiczny adres IP skierowany do dostawcy usług internetowych? Dodatkowe publiczne adresy IP można przypisać do urządzenia teql0, ale nie trzeba ich przypisywać do urządzeń ppp. W moim ustawieniu dwa łącza ppp dzielą ten sam adres IP (negocjowany przez pppoe itp.) Łącze teql przypisane ręcznie, jak pokazano powyżej. Dostawca usług internetowych musi przesyłać ruch IP w równym stopniu w dół obu łączy.Odwrotna ścieżka (
rp_filter
) jest ustawiona na2
(luźną) zarówno w powyższym skrypcie, aby pakiety zwrotne nie były odrzucane, ponieważ wracają na interfejsach ppp, a nie na teql0.Ustawiłem to w ten sposób i działa idealnie. Bardzo łatwe! Gdy łącza zawodzą, następuje płynne przełączanie awaryjne. Kiedy się pojawią, znów zaczynają działać. Wygląda na to, że nie ma utraty lub opóźnienia pakietu, gdy nastąpi przełączenie awaryjne, ani żadnego, gdy nastąpi powrót.
Ponadto jeden z komentujących zasugerował poniższy link, który używa routingu zasad, z iptables do oznaczania każdego innego pakietu itp., Ale postaram się za kilka dni sprawdzić, czy działa on lepiej niż powyższy i odpowiednio przekazać tutaj opinię.
http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing
źródło
sysctl -w net.ipv4.ip_forward
ale powinienem powiedziećsysctl -w net.ipv4.ip_forward=1
, że poprawiłem powyżej. To z pewnością zapobiegłoby ruchowi z sieci LAN w dół połączonego łącza.