Wykorzystanie routingu
Ostatnia zmiana: 2019-05-05 07:23

Wielu użytkowników posiada kilka różnych sposobów na dostęp do internetu. Czasami są to dwa niezależne łącza internetowe, często jest to dodatkowy modem komórkowy. Najczęściej nie są to łącza jednakowe, jedno ma większą przepustowość lub charakteryzuje się szczególnymi parametrami.
Drugie łącze wykorzystywane może być wykorzystywane jako zapasowe, które przejmuje ruch w przypadku awarii pierwszego, najczęściej także oba łącza są aktywne. Na forum pada wtedy pytanie: jak skierować określony ruch tylko przez określone łącze?

Podstawowym dokumentem opisującym kształtowanie ruchu i routing jest Linux Advanced Routing & Traffic Control, przetłumaczony na język polski jako Kształtowanie Ruchu i Zaawansowany Routing. Jest to niezbędna lektura dla osób które chcą się zapoznać z tematem; w tym poradniku zaś zostanie przedstawiony tylko mały wycinek tej wiedzy.

W poradniku przedstawiono sposób na przekierowanie ruchu spełniającego określone założenia przez jedno z dostępnych łączy internetowych.

Poradnik sprawdzono na wydaniu OpenWrt 18.06.

Założenia

  • dostępne są dwa połączenia do internetu (w tym przykładzie o nazwach wan i wan2)
Nie ma znaczenia czym są te łącza, może to był połączenie kablowe, połączenie komórkowe z modemem LTE czy inny sposób. W tym poradniku wykorzystano połączenie wan które było zwykłym połączeniem kablowym (dhcp) oraz połączenie wan2 będącym połączeniem komórkowym.

  • oba połączenia umożliwią dostęp do internetu
Na użytkowniku ciąży odpowiedzialność za poprawną konfigurację obu połączeń tak, aby był możliwy dostęp do internetu przez jedno lub drugie łącze.

  • oba połączenia są aktywne
W przeciwieństwie do np. projektu simplefailover nie wiemy kiedy użytkownik zechce skorzystać z drugiego łącza, więc oba muszą być aktywne w tym samym czasie.

  • jedno z łączy jest połączeniem głównym i przez niego domyślnie idzie cały ruch
Oznacza to tylko tyle, że drugie łącze nie powinno nadpisać domyślnej trasy (lub może nadpisać, ale wtedy cały domyślny ruch będzie iść właśnie tym łączem, a nie o to chodzi). Dla połączeń komórkowych (4G/LTE) oznacza to, że trzeba dodać opcję defaultroute 0, dla tuneli openvpn - route_noexec itd.

Konfiguracja

Należy dodać nowy numer tablicy w pliku /etc/iproute2/rt_tables:


    # echo "200 modem" >> /etc/iproute2/rt_tables

Numer (200) powinien być dowolnym numerem z puli dostępnych w tym pliku, ale nie mogą się one powtarzać - muszą być unikalne. Jest to ważne w przypadku gdy zainstalowane jest inne oprogramowanie mogące manipulować tablicami routingu (np. wspomniany mwan3). Nazwa modem jest symboliczną nazwą stosowaną później przy odwołaniu się do tablic, może być dowolną nazwą, byle by była unikalna w ramach pliku.

Przekierowanie ruchu z jednego hosta na drugie łącze

Pierwszy scenariusz - chcemy cały ruch z jednego z komputerów (o IP 192.168.1.230) przekierować na łącze wan2. W pliku /etc/rc.local jako pierwsze linie dodajemy:


    ip rule add from 192.168.1.230 table modem
    ip route add default via 10.64.64.64 dev 3g-wan2 table modem
    ip route flush cache

gdzie:

  • 192.168.1.230: adres ip hosta z którego cały ruch ma iść przez drugie łącze
  • 10.64.64.64: adres ip gatewaya (można to uzyskać z polecenia ifstatus wan2, blok route/nexthoop).
  • 3g-wan2: fizyczna nazwa interfejsu wan2 (można to uzyskać z polecenia ifstatus wan2, opcja l3_device lub po prostu ifconfig jeżeli wiemy który to będzie interfejs
  • modem: nazwa naszej tablicy
Resetujmy router (lub wykonujemy sam plik /etc/rc.local). Cały ruch z adresu IP 192.168.1.230 powinien iść przez łącze wan2 co można łatwo sprawdzić odwołując się z niego np. do adresu http://eko.one.pl/host.php

Jeżeli chcemy dodać jeszcze inne komputery to wystarczy dodać na początku kolejne linie, np.


    ip rule add from 192.168.1.230 table modem
    ip rule add from 192.168.1.231 table modem
    ip rule add from 192.168.1.232 table modem
    ...

Jeżeli łączem dodatkowym jest coś co uruchamia się z opóźnieniem, np. inna sieć wifi lub tunel VPN to w/w polecenia należy uruchomić PO uruchomieniu łącza. Wpisanie ich do /etc/rc.local może być zbyt wczesne. Należy dodać albo opóźnienie na początku pliku (np. sleep 10) albo skrypt umieścić na hotplugu danego interfejsu (w katalogu /etc/hotplug.d/iface/).

Przekierowanie określonego zakresu portów

Scenariusz drugi - chcemy przekierować tylko określone porty (lub zakres portów) przez drugie łącze. W pliku /etc/rc.local jako pierwsze linie dodajemy:


    ip rule add fwmark 0x30 table modem
    ip route add default via 10.64.64.64 dev 3g-wan2 table modem
    ip route flush cache

(znaczenie parametrów jak wyżej) a następnie jeszcze regułę która oznacza dany ruch, np:


    iptables -t mangle -I PREROUTING -p tcp --dport 80 -j MARK --set-mark 0x30

I tu już należą się szczegółowe wyjaśnienia. Do tabeli modem kierowane są pakiety które są zaznaczone (mark) identyfikatorem 0x30. I to tyle, bo od nas zależy teraz co oznaczymy tym identyfikatorem. W tym przykładzie oznaczony został cały ruch kierowany do portu 80 (czyli www). Taki sposób daje nam duże możliwości oznaczania ruchu, bo można np.

  • oznaczyć ruch tylko z komputera o ip 192.168.1.230 (to samo co w pierwszym scenariuszu)


    iptables -t mangle -I PREROUTING -p tcp -s 192.168.1.230 -j MARK --set-mark 0x30


  • oznaczyć ruch tylko z komputera o ip 192.168.1.230 na https


    iptables -t mangle -I PREROUTING -p tcp -s 192.168.1.230 --dport 443 -j MARK --set-mark 0x30


  • oznaczyć ruch udp bramek SIP


    iptables -t mangle -I PREROUTING -p udp --dport 5060 -j MARK --set-mark 0x30


  • oznaczyć ruch ze wszystkich komputerów do adresu eko.one.pl (zamieniamy eko.one.pl na adres IP)


    iptables -t mangle -I PREROUTING -p tcp -d 185.23.21.13 -j MARK --set-mark 0x30


itd. Możliwości jest wiele, wystarczy tylko utworzyć odpowiednie reguły iptables.

Po dalsze szczegóły odsyłam do wymienionych na początku poradników. W tym przypadku należy też zwrócić uwagę na identyfikatory - należy używać identyfikatorów, którymi nie posługują się inne programy (qos-script, mwan3).

Diagnostyka

Dane dla scenariusza pierwszego.

Tablice routingu



    # ip route show
    default via 10.1.1.1 dev eth0 proto static
    10.1.1.0/24 dev eth0 proto kernel scope link src 10.1.1.145
    10.64.64.64 dev 3g-wan2 proto kernel scope link src 164.127.253.3
    192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1


  • 10.1.1.145: adres wan
  • 10.1.1.1: adres ip gatewaya na wan
  • 164.127.253.3: adres ip połączenia wan2
  • 10.64.64.64: adres ip gatewaya na wan2
  • 192.168.1.1: adres ip lan routera

Routing tablicy modem



    # ip route show table modem
    default via 10.64.64.64 dev 3g-wan2

Lista reguł



    # ip rule show
    0: from all lookup local
    32765: from 192.168.1.230 lookup modem
    32766: from all lookup main
    32767: from all lookup default

Uzupełnienie

Konfiguracja wan2 jako połączenia komórkowego

/etc/config/network



    config interface 'wan2'
        option apn internet
        option service umts
        option device /dev/ttyUSB0
        option proto 3g
        option defaultroute 0

/etc/config/firewall



    config zone
        option name wan
        list network 'wan'
        list network 'wan6'
        list network 'wan2'
        option input REJECT
        option output ACCEPT
        option forward REJECT
        option masq 1
        option mtu_fix 1