Wykorzystanie routingu
Ostatnia zmiana: 2016-09-27 19:34

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 (np. vpn - pozwala na względną anonimowość lub z powodu innego adresu ip pozwala na dostęp do treści niedostępnych na terenie danego kraju).
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.

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 3G, tunel vpn z openvpn 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 (3g) oznacza to, że trzeba dodać opcję defaultroute 0, dla tuneli openvpn - route_noexec itd.

Konfiguracja

Niezbędny jest pakiet ip (Routing control utility):


    # opkg update
    # opkg install ip

Następnie 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 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
    ...

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 flush cache
    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

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 też należy zwrócić uwagę, żeby używać wolnych 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