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 ten kompletnie nie wyczerpuje możliwości tematu. Opisane zostały najprostsze sposoby realizacji przedstawionych celów, ale nie oznacza to że nie można zrobić tego na kilka innych sposobów. Dostępne są także inne programy i skrypty (np. mwan3) realizujące podobne zagadnienia.
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.phpJeż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.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