Loadbalancing/failover - zarządzanie wieloma łączami
Ostatnia zmiana: 2016-02-21 18:32

Wielu użytkowników posiada dołączonych kilka łącz internetowych do swoich routerów i chce zapewnić ich wykorzystanie lub chce zapewnić ciągły dostęp do internetu w przypadku awarii jednego z nich. W takich przypadkach z pomocą przyjdzie pakiet o nazwie mwan3.
Działanie mwan3 opiera się na monitorowaniu dostępności łącz przez pingowanie ustawionych celów. W domyślnej konfiguracji są to dnsy google i opendns; jeżeli zostanie wykryty brak pingów następuje przełączenie routingu na inne łącza według reguł zdefiniowanych w konfiguracji. Mwan3 potrafi zapewnić przełączenie ruchu na inne łącza w przypadku zaniku jednego z nich lub rozłożenie ruchu na kilka dostępnych, ale nie spowoduje sumowania przepustowości łącz dla komputera który pobiera coś w jednym wątku.

Dołączone łącza mogą być dowolnego typu: ethernetowe, modem adsl, modem komórkowy na USB czy łącza radiowe. Mwan3 wymaga utrzymania aktywności wszystkich połączeń, więc wymaga aby np. wspomniany modem był na stałe włączony i podłączony do sieci. Mwan3 jest lepszy niż omawiany wcześniej pakiet multiwan.

Poniższa konfiguracja prezentuje wykorzystanie dwóch łączy, choć oczywiście analogicznie można zestawić ich kilka jednocześnie. W przykładzie wykorzystano OpenWrt 15.05 na routerze TP-LINK TL-WR1043NDv1 z połączeniem kablowym oraz modemem Huawei E3372s-153 HiLink.

Konfiguracja łączy

Oba łącza muszą być zestawione i musi istnieć przez nie połączenie do internetu; dla ułatwienia nazwiemy je wan oraz wan2. Oba łącza muszą mieć ustawione inne metryki.

Typy połączeń nie mają większego znaczenia ale we własnym zakresie trzeba zatroszczyć się o ich prawidłową konfigurację. Mwan3 zarządza routingiem, nie sprawdza/nie podnosi/nie wznawia połączeń, to nie jest jego zadanie. Na użytkowniku spoczywa więc całość procesu utrzymania aktywności łącz. Wszystkie połączenia muszą być aktywne (podniesione); mwan3 samodzielnie nie podnosi połączeń.

Interfejs wan

W tym przykładzie został wykorzystany port WAN routera do którego zostało doprowadzone łącze kablowe. Do domyślnej konfiguracji wystarczy dodać opcję metric:


    # uci set network.wan.metric=10
    # uci commit network

Interfejs wan2

Jako drugie połączenie został wykorzystany modem dołączony do portu USB. Ponieważ był to HiLink (pracujący jako karta sieciowa), jego konfiguracja sprowadza się do instalacji odpowiednich sterowników i tak samo ustawienia opcji metric:


    # opkg update
    # opkg install usb-modeswitch kmod-usb-net-cdc-ether
    # uci -q del network.wan2
    # uci set network.wan2=interface
    # uci set network.wan2.proto=dhcp
    # uci set network.wan2.ifname=eth1
    # uci set network.wan2.metric=20
    # uci commit network

Tworzona jest tu sekcja wan2 na interfejsie eth1 (na tym modelu routera po podłączeniu modemu HiLink powstaje interfejs o takiej właśnie nazwie - na innych routerów może być inaczej), dostała ona unikalną wartość metric.
Nie wolno zapominać o odpowiednim uzupełnieniu firewalla. Ponieważ wan2 ma być to traktowany jak zwykły wan to po prostu wystarczy dodać go do sekcji wan firewalla:


    # uci add_list firewall.@zone[1].network=wan2
    # uci commit firewall

(domyślnie jest to sekcja wan - jeżeli jest inny konfig to należy dostosować polecenie)

Jeżeli mamy więcej interfejsów należy analogicznie zrobić podobną konfigurację dla nich wszystkich. Należy pamiętać że OpenWrt sam z siebie wykorzystuje nazwy wan_4, wan_6 i wan6 do własnych celów, więc należy posłużyć się innymi.

Po wykonaniu czynności konfiguracyjnych trzeba wykonać restart routera:


    # reboot

Sprawdzenie połączeń

Po ustawieniu wanów należy sprawdzić czy mamy dostęp do internetu przez tak ustawione połączenia. Posługujemy się poleceniem ping ze wskazaniem konkretnego, fizycznego interfejsu:


    # ping -c3 -I eth0.2 google.com
PING google.com (194.9.25.49): 56 data bytes
64 bytes from 194.9.25.49: seq=0 ttl=58 time=6.908 ms
64 bytes from 194.9.25.49: seq=1 ttl=58 time=6.677 ms
64 bytes from 194.9.25.49: seq=2 ttl=58 time=9.343 ms

--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 6.677/7.642/9.343 ms



    # ping -c3 -I eth1 google.com
PING google.com (194.9.25.44): 56 data bytes
64 bytes from 194.9.25.44: seq=0 ttl=57 time=123.040 ms
64 bytes from 194.9.25.44: seq=1 ttl=57 time=22.740 ms
64 bytes from 194.9.25.44: seq=2 ttl=57 time=22.493 ms

--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 22.493/56.091/123.040 ms

W tym przykładzie eth0.2 i eth1 to wspomniane interfejsy, można je znaleźć wykonując polecenia ifstatus wan; ifstatus wan2.
Jeżeli pingi działają można przejść do dalszej konfiguracji. Jeżeli nie - należy ponownie sprawdzić wany, bez tego dalsza konfiguracja jest pozbawiona sensu.

Instalacja

Po prostu trzeba zainstalować odpowiedni pakiet


    # opkg update
    # opkg install mwan3

Jeżeli mamy środowisko graficzne LuCI to dostępna jest także odpowiednia aplikacja do niego:


    # opkg install luci-app-mwan3

Choć oczywiście do dalszej konfiguracji nie jest ona niezbędna.

Konfiguracja

Konfiguracja zawarta jest w pliku /etc/config/mwan3 i zawiera już kilka niezbędnych elementów dla obu łączy:

  • definicje interfejsów (config interface): zawiera informacje o włączeniu interfejsu, listę celów ping, ilość pingów i timeouty sprawdzania łącza, domyślnie dla wan i wan2
  • definicje ważności łączy (config member): zawiera informacje o "wagach" łączy, o czym będzie za chwilę
  • definicje polityk (config policy): zawiera informacje o kombinacjach wykorzystania łączy
  • definicje reguł (config rule) które definiują zasady wykorzystania polityk przez określony ruch. Musi zawierać co najmniej jedną polityką domyślną która będzie umieszczona na końcu wszystkich reguł
Jeżeli mamy tylko dwa łącza to cała konfiguracja sprowadza się do włączenia ich w konfiguracji mwan3:


    # uci set mwan3.wan.enabled=1
    # uci set mwan3.wan2.enabled=1
    # uci commit mwan3
    # reboot

Wykonujemy restart urządzenia i sprawdzamy status połączeń:


    # mwan3 interfaces
Interface status:
    interface wan is online (tracking active)
    interface wan2 is online (tracking active)

Jeżeli oba są aktywne to jest to cała konfiguracja, choć oczywiście można dalej przystosować konfigurację do własnych potrzeb. Dla większej ilości łączy należy samodzielnie stworzyć nowe sekcje interface, member i policy.

Jak sprawdzić działanie? Wchodzimy np. na adres http://twojeip.wp.pl/, sprawdzamy jaki mamy adres IP a potem odłączamy kabel od wanu - po odświeżeniu w przeglądarce powinien być adres z drugiego łącza. Można tak samo posłużyć się pingami. Należy pamiętać że mwan3 nie utrzymuje połączenia w ramach tej samej sesji, co może oznaczać ze po prostu trzeba przerwać pingi i ponownie uruchomić polecenie żeby zobaczyć fakt przełączenia na drugie łącze.

Uzupełnienie konfiguracji

Serwery dns

Niekiedy dobrze jest wymusić adresy dns na wanach na inne, niezależne od naszego dostawcy internetu. Wystarczy ustawić np. na serwery google:


    # uci set network.wan.dns='8.8.8.8 8.8.4.4'
    # uci set network.wan2.dns='8.8.8.8 8.8.4.4'
    # uci commit network
    # reboot

Lub inne, ważne żeby były osiągalne z dowolnego łącza które mamy.

Loadbalancing i failover

Pod tymi pojęciami kryją się dwa sposoby działania mwan3: odpowiednio - rozłożenie ruchu na aktywne łącza i przełączanie ruchu na inne łącza w przypadku zaniku jednego z nich. Mwan3 realizuje oba zagadnienia jednocześnie, choć można to oczywiście zmienić po swojemu. W domyślnej konfiguracji podział łącza wygląda następująco (przy używaniu domyślnej polityki balanced):


    # mwan3 status
Interface status:
    interface wan is online (tracking active)
    interface wan2 is online (tracking active)

Policy balanced:
    wan2 (40%)
    wan (60%)
... 

Mamy podział wan/wan2 w stosunku 60:40 i taki podział wykorzystania pasma będzie mwan3 starał się utrzymać. Można to zmienić przez modyfikację opcji weight w sekcjach member konfiguracji. Zdefiniowana domyślna reguła (default_rule) korzysta z polityki balanced. Polityka ta używa dwóch definicji o nazwach wan_m1_w3 i wan2_m1_w2. Zmieniając w nich opcję weight można więc odpowiednio tym sterować, np:

  • ustawienie łączy 50:50 (oba łącza będą wykorzystywane po równo)


    # uci set mwan3.wan_m1_w3.weight='3'
    # uci set mwan3.wan2_m1_w2.weight='3'
    # uci commit mwan3
    # mwan3 restart
    # mwan3 status
Interface status:
    interface wan is online (tracking active)
    interface wan2 is online (tracking active)

Policy balanced:
    wan2 (50%)
    wan (50%)
...


  • ustawienie łączy 99:1 (łącze wan jest "lepsze" i ono będzie w dużej mierze wykorzystywane)


    # uci set mwan3.wan_m1_w3.weight='99'
    # uci set mwan3.wan2_m1_w2.weight='1'
    # uci commit mwan3
    # mwan3 restart
    # mwan3 status
Interface status:
    interface wan is online (tracking active)
    interface wan2 is online (tracking active)

Policy balanced:
    wan2 (1%)
    wan (99%)
...

Wymuszenie ruchu przez określone łącze

Domyślna konfiguracja zawiera dwa przykłady wymuszenia: dla witryny "youtube.com" z wykorzystaniem polityki balanced i dla ruchu https. Można dodać dowolną ilość własnych reguł; jako przykład: wymuszenie całego ruchu z komputera o adresie 192.168.1.100 przez łącze wan2:


    # uci set mwan3.host100=rule
    # uci set mwan3.host100.sticky='1'
    # uci set mwan3.host100.src_ip=192.168.1.100
    # uci set mwan3.host100.proto='tcp'
    # uci set mwan3.host100.use_policy='wan2_only'
    # uci commit mwan3

Dodajemy regułę aby komputer o adresie 192.168.1.100 korzystał z polityki wan2_only w której zdefiniowane jest wykorzystanie tylko łącza wan2 jako źródła internetu. Powyższa reguła musi być przed regułą domyślną, czyli w konfiguracji trzeba przenieść sekcję default_rule na sam koniec pliku żeby wyglądało to tak:


    ...

    config rule 'host100'
        option sticky '1'
        option src_ip '192.168.1.100'
        option proto 'all'
        option use_policy 'wan2_only'

    config rule 'default_rule'
        option dest_ip '0.0.0.0/0'
        option use_policy 'balanced'

Po dodaniu oczywiście oczywiście wykonujemy restart mwan3. Aktywne reguły pokazuje polecenie mwan3 status:


    ...

    Active rules:
        0     0 S youtube  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set youtube dst multiport sports 0:65535 multiport dports 80,443 
        0     0 S https  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport sports 0:65535 multiport dports 443 
        1    60 S host100  all  --  *      *       192.168.1.100        0.0.0.0/0            multiport sports 0:65535 multiport dports 0:65535 
        3   228 - balanced  all  --  *      *       0.0.0.0/0            0.0.0.0/0            

Upewniamy się że domyślna reguła jest na samym końcu.

Szeroki opis możliwości konfiguracyjnych mwan3 dostępny jest na wiki openwrt, tam też można znaleźć opis parametrów konfiguracyjnych reguł.