Agregacja kilku łączy w jedno - Michał Sternadel Agregacja kilku łączy w jedno

Światło: Zapal | Zgaś

Agregacja kilku łączy w jedno

Dodano: 10.04.2015, 16:12:12

Nie każdy w firmie czy domu ma możliwość zestawienia jednego, szybkiego i stabilnego połączenia z Internetem. Często dla bezpieczeństwa lub odciążenia części działających usług doprowadza się do abonenta kilka złączy, z różnych lub tych samych źródeł i odpowiednio steruje ruchem i przepustowością przez każde z nich. Dzisiaj przestawię jak połączyć kilka łączy w jedno, które będzie odporne na awarię jednego z nich, a w przypadku, gdy każde pojedyncze połączenie działa - przepustowość będzie sumowana. Rozwiązanie przydatne jest również w przypadku, gdy posiadamy stałe łącze oraz dostęp "mobilny" przez sieć 3G/LTE i nazywa się różnie: port-trunking, port-bonding, bonding, link-aggregation...

Starałem się, aby przedstawiona konfiguracja była elegancka, więc oparłem ją w całości o systemy typu Debian oraz wbudowane w nich mechanizmy konfiguracji. Bezproblemowo można jednak po staroświecku oskryptować sobie wszystko i uruchamiać przygotowany tak skrypt przy starcie systemu.

Co będzie potrzebne?

  • Dwa lub więcej łącz u klienta (w poniżej przedstawionej konfiguracji będą trzy).
  • Zewnętrzny serwer oparty na Linuksie w jakimś datacenter lub gdziekolwiek, z łączem szybszym lub równym sumie łącz klienckich oraz z odpowiednią pulą adresów zewnętrznych (jeden adres zewnętrzny dla jednego łącza klienta).
  • Router kliencki oparty na Linuksie.
  • Wkompilowana obsługa bondingu na serwerze oraz routerze klienckim lub moduł bond (Debian standardowo już to ma).
  • Serwer
    • Łącze 100mbps/100mbps.
    • Jedna karta sieciowa (eth0).
    • Sieć 10.20.30.0/29, bramka: 10.20.30.1, dostępne adresy IP: 10.20.30.2, 10.20.30.3, 10.20.30.4, 10.20.30.5, 10.20.30.6.
    • Firewall z otwartym portem 5000 (dla vtun) oraz ustawioną maskaradą.
    • Adres 192.168.204.1/255.255.255.252 - adres interfejsu bond0, może być dowolny, prywatny, nie używany po żadnej stronie tunelów. Będzie to bramka domyślna dla routera klienckiego.
  • Router kliencki
    • Łącze 10mbps/10mbps od Operatora1, Sieć 172.16.0.0/30, IP: 172.16.0.2, bramka: 172.16.0.1, maska: 255.255.255.252, wpięte do karty eth0
    • Łącze 4mbps/4mbps od Operatora2, Sieć 172.30.0.4/30, IP: 172.30.0.6, bramka: 172.30.0.5, maska: 255.255.255.252, wpięte do karty eth0
    • Łącze 5mbps/5mbps od Operatora3, Sieć 192.168.30.0/23, IP: 192.168.31.71, bramka: 192.168.30.1, maska: 255.255.254.0, wpięte do karty eth1
    • Trzy karty sieciowe (eth0, eth1 oraz eth2)
    • Sieć lokalna 192.168.1.0/24, skonfigurowany nat/maskarada na interfejsie eth2)
    • Adres 192.168.204.2/255.255.255.242 - adresu interfejsu bond0, dowolny, który koresponduje z podsiecią na interfejsie bond0 na serwerze.

Konfiguracja serwera w datacenter

Zacznijmy od przygotowania serwera w naszym datacenter. Najpierw zainstalujmy sobie odpowiednie oprogramowanie apt-get install ifenslave vtun, zmodyfikujmy w pliku /etc/network/interfaces odpowiednie interfejsy:

auto lo
iface lo inet loopback

# Pierwszy adres IP
auto eth0
iface eth0 inet static
  address 10.20.30.2
  netmask 255.255.255.248
  network 10.20.30.0
  broadcast 10.20.30.7
  gateway 10.20.30.1
  dns-nameservers 8.8.8.8 8.8.8.4

# Drugi adres IP
auto eth0:0
iface eth0:0 inet static
  address 10.20.30.3
  netmask 255.255.255.248
  network 10.20.30.0
  broadcast 10.20.30.7

# Trzeci adres IP 
auto eth0:1
iface eth0:1 inet static
  address 10.20.30.4
  netmask 255.255.255.248
  network 10.20.30.0
  broadcast 10.20.30.7

## Dla większej ilości adresów, można odpowiednio dopisać dodatkowe sekcje
 
# Agregacja lacza:
auto bond0
iface bond0 inet static
  address 192.168.204.1
  netmask 255.255.255.252
  bond-slaves tap11 tap12 tap13
  bond_mode balance-rr

Teraz stwórzmy konfigurację tunelu. W tym poradniku skorzystamy z vtun, ale jeśli jest Ci wygodniej, możesz użyć openvpn czy nawet ssh. W pliku /etc/vtund.conf powinny znaleźć się takie wpisy:


options {
  port 5000;
  ip /sbin/ip;
}
default {
 compress no;
 encrypt no;
 keepalive yes;
 proto tcp;
 speed 0;
}
TRUNK11 {
 passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 type ether;
 device tap11;
 up {
  ip "link set up %% multicast off mtu 1420";
  program "/sbin/ifenslave bond0 %%";
 };
}
TRUNK12 {
 passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 type ether;
 device tap12;
 up {
  ip "link set up %% multicast off mtu 1420";
  program "/sbin/ifenslave bond0 %%";
 };
}
TRUNK13 {
 passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 type ether;
 device tap13;
 up {
  ip "link set up %% multicast off mtu 1420";
  program "/sbin/ifenslave bond0 %%";
 };
}
## Dla większej ilości tuneli, należy skopiować odpowiednio TRUNKXX, zmieniając niezbędne w środku parametry
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves

Ustawmy w pliku /etc/default/vtun zmienną RUN_SERVER=yes, podnieśmy nowe interfejsy ifup bond0 (i jeżeli eth0:0 i eth0:1 zostały dodane, to również i je) oraz wystartujmy vtun: service vtun start.

Pamiętać należy, ażeby dodać natowanie/maskaradę na interfejsie bond0, dla przykładu:

iptables -A FORWARD -i bond0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.204.2/32 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.204.2/32 ! -d 192.168.204.0/30 -o eth0 -j MASQUERADE

Konfiguracja routera

Przejdźmy do ustawień routera klienckiego. Tak samo jak w przypadku serwera, najpierw instalujemy niezbędne oprogramowanie: apt-get install vtun ifenslave, konfigurujemy interfejs bond0 w /etc/network/interfaces, pamiętając o niezbędnych wpisach routingu (jeśli ich nie mielismy wcześniej):

auto lo
iface lo inet loopback

# Operator1
auto eth0
iface eth0 inet static
  address 172.16.0.2
  netmask 255.255.255.252
  post-up ip route add 172.16.0.0/30 dev eth0 src 172.16.0.2 table link1
  post-up ip route add default via 172.16.0.1 table link1
  post-up ip rule add from 172.16.0.2 to all lookup link1
  post-up ip rule add from all to 172.16.0.2 lookup link1
  post-down ip route flush table link1
  post-down ip rule del from 172.16.0.2 to all lookup link1
  post-down ip rule del from all to 172.16.0.2 lookup link1

# Operator2
auto eth0:0
iface eth0:0 inet static
  address 172.30.0.6
  netmask 255.255.255.252
  post-up ip route add 172.30.0.4/30 dev eth0 src 172.30.0.6 table link2
  post-up ip route add default via 172.30.0.5 table link2
  post-up ip rule add from 172.30.0.6 to all lookup link2
  post-up ip rule add from all to 172.30.0.6 lookup link2
  post-down ip route flush table link2
  post-down ip rule del from 172.30.0.6 to all lookup link2
  post-down ip rule del from all to 172.30.0.6 lookup link2

# Operator3
auto eth1
iface eth1 inet static
  address 192.168.31.71
  netmask 255.255.254.0
  post-up ip route add 192.168.31.0/24 dev eth0 src 192.168.31.71 table link3
  post-up ip route add default via 192.168.30.1 table link3
  post-up ip rule add from 192.168.31.71 to all lookup link3
  post-up ip rule add from all to 192.168.31.71 lookup link3
  post-down ip route flush table link3
  post-down ip rule del from 192.168.31.71 to all lookup link3
  post-down ip rule del from all to 192.168.31.71 lookup link3

## Dla większej ilosci łącz można dodać więcej odpowiednich sekcji
 
# Agregacja łącza
auto bond0
iface bond0
  address 192.168.204.2
  netmask 255.255.255.252
  gateway 192.168.204.1
  dns-nameservers 8.8.8.8 8.8.4.4
  bond-slaves tap11 tap12 tap13
  bond_mode balance-rr
 
# Sieć lokalna
auto eth2
iface eth2 inet static
  address 192.168.1.1
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255

Następnie w pliku /etc/iproute2/rt_tables, dodajemy adekwatne wpisy (jeśli ich jeszcze nie mieliśmy):

11 link1
12 link2
13 link3
## można dodać więcej analogicznych wpisów, w przypadku chęci dodania większej ilości łącz

Uruchamiamy interfejsy: ifup bond0 (itd), a następnie edytujemy plik /etc/vtund.conf:

options {
 port 5000;
 ip /sbin/ip;
}
default {
 compress no;
 encrypt no;
 stat yes;
 speed 0;
}
TRUNK11 {
 passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 device tap11;
 persist yes;
 srcaddr {
  iface eth0;
  addr 172.16.0.2;
 };
 up {
  ip "link set %% up multicast off mtu 1460";
  program "/sbin/ifenslave bond0 %%";
 };
}
TRUNK12 {
 passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 device tap12;
 persist yes;
 srcaddr {
  iface eth0;
  addr 172.30.0.6;
 };
 up {
  ip "link set %% up multicast off mtu 1460";
  program "/sbin/ifenslave bond0 %%";
 };
}
TRUNK13 {
 passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
 device tap13;
 persist yes;
 srcaddr {
  iface eth1;
  addr 192.168.31.71;
 };
 up {
  ip "link set %% up multicast off mtu 1460";
  program "/sbin/ifenslave bond0 %%";
 };
}
## Dla większej ilości tuneli, analogicznie dodać należy więcej sekcji TRUNKXX z odpowiednimi parametrami
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves

W pliku /etc/default/vtun umieszczamy wpisy:

CLIENTO_NAME=TRUNK11
CLIENT0_HOST=10.20.30.2
CLIENT1_NAME=TRUNK12
CLIENT1_HOST=10.20.30.3
CLIENT2_NAME=TRUNK13
CLIENT2_HOST=10.20.30.4
## dla większej ilości analogicznie.

Odpalamy tunel: service vtun start i jeżeli nasze trzy łącza klienckie są sprawne, maksymalna dostępna prędkość wyniesie 19mbps/19mbps. W przypadku awarii łącza od Operatora 1, prędkość spadnie do 9mbps/9mbps.

Należy pamiętać, że w przypadku awarii serwera w naszym datacenter nie będziemy mieli możliwości dostać się do Internetu.

Tekst trochę zagmatwany, a jakże! Starałem się nie pisać tekstu dla osób jedynie klikających myszką, choć pewnie mi trochę nie wyszło. Myślę jednak, że dla młodych administratorów, chcących coś zagregować tekst będzie świetnym punktem początkowym, a być może również i końcowym w poszukiwaniach ciekawych rozwiązań.


Dodaj komentarz
Komentarze (5)
Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.
#5
Data utworzenia:26.12.2016, 22:22:41
Tytuł:RE:
Autor:Marek
Treść:@Michał Sternadel: Serwer DC ma link 100Mbit/100Mbit. Po mojej stronie mam 2 x LTE (10Mbit/10Mbit oraz 40Mbit/10Mbit). Prędkość nie jest najważniejsza, równoważenie obciążenia - bezcenne ;) Tryb balance-alb 6 jest obiecujący - przetestuje. Pozdrawiam
#4
Data utworzenia:26.12.2016, 20:16:33
Tytuł:Odpowiedzi
Autor:Michał Sternadel
Treść:@Mateusz: Jak napisał poniżej Marek, to para prywatnych adresów IP, aby serwer w DC oraz router kliencki się widziały. Może to być cokolwiek, nieużywanego w sieci lokalnej po jednej i drugiej stronie. @Marek: Prawdopodobnie prędkości sumują się poprawnie, LTE jest asymetryczne, stąd dane wysyłane z serwera do routera klienckiego chodzą po prędkości "upload". Mogę się jednak mylić. Spróbuj ramki jumbo (nic nie zaszkodzi, chociaż to bardziej pod interfejsy ethernetowe): ifconfig bond0 mtu 9000 up - oczywiście po dwóch stronach. Można też spróbować trybów: balance-xor, balance-tlb, balance-alb. Pozdrawiam
#3
Data utworzenia:26.12.2016, 19:43:23
Tytuł:Wielki szacun za pomysł. Thx ;)
Autor:Marek
Treść:Mam dwa łącza LTE (jedno około 10Mbit, drugie około 40Mbit). Test z odłączeniem kabelka działa - (przełącza między jednym a drugim). Natomiast transfer mam w  granicach około 15Mbit. bond-mode balance-rr. Czy może jest jeszcze jakiś myk, który powoduje że te prędkości będą się sumowały ? P.S. (do Mateusza) Interfejs bond0 funkcjonuje na sieci 192.168.204.0/30. Nie potrzeba czwartego publicznego IP.
#2
Data utworzenia:21.12.2016, 10:01:38
Tytuł:Czwarty adres IP?
Autor:Mateusz
Treść:Czołem. Fajny opis i fajne podejście do tematu Mam pytanko: w konfiguracji serwera i klienta dla bond0 pojawia się nagle adres 192.168.204.1 który nie został nigdzie opisany. Czy to jest adres używany jakoś wewnętrznie przy komunikacji pomiędzy vtunami na serwerze i kliencie? Czy potrzebuję tam podać czwarty publiczny adres IP serwera (dla konfiguracji z trzema łączami jak tutaj)? Czy może być taki prywatny jak w przykładzie i nie potrzebuję nadmiarowego IP?
#1
Data utworzenia:17.04.2015, 11:04:27
Tytuł:Ale czad...
Autor:1912
Treść:Człowieku skąd t się urwałeś? ale odpał, jesteś fenomenalny

1

Szybki kontakt:

Pozostaw zółtą karteczkę-wlepkę pod adresem:
Kraków, ul. Pawia 3 z id: #776AFFDA# oraz wiadomością. Jak nie zginie -- odczytam.

Ostatnie fotografie


Paproć
Paproć

Grzyb
Grzyb

  Więcej...