Wykorzystanie routingu
Ostatnia zmiana: 2025-05-28 21:58
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 czy pbr) realizujące podobne zagadnienia.
Poradnik sprawdzono na wydaniu OpenWrt od wersji 18.06 do 24.10
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 nawet tunel VPN. 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).
Można to wykonać na dwa sposoby:
- bardziej zalecane: ustawić odpowiednie metryki, np. option metric 10 dla połączenia
wan oraz option metric 20 dla połączenia
wan2- mniej zalecane: dla połączeń komórkowych (4G/LTE) trzeba dodać opcję
defaultroute 0, dla tuneli openvpn -
route_noexec itd.
Konfiguracja
Należy dodać nowy numer
tablicy w pliku
/etc/iproute2/rt_tables:
# grep -q 200 /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 adresie IP 192.168.1.230) przekierować na łącze
wan2.
Przykład z wykorzystaniem UCIDo pliku /etc/config/network dopisujmy:
config route
option interface 'wan2'
option target '0.0.0.0/0'
option table '200'
config rule
option src '192.168.1.230/32'
option lookup '200'
Jeżeli chcemy dodać jeszcze inne komputery to wystarczy dodać kolejne sekcje
rule, np.
config rule
option src '192.168.1.231/32'
option lookup '200'
config rule
option src '192.168.1.232/32'
option lookup '200'
config rule
option src '192.168.1.233/32'
option lookup '200'
Jeżeli nie będzie aktywne łącze
wan2 to ruch nadal będzie wychodził przez
wan. Działanie reguł może nastąpić z pewnym opóźnieniem w stosunku do włączenia interfejsu
wan2.
Jeżeli chcemy zablokować ruch do wanu to należy dodać odpowiednią regułę w firewallu:
config rule
option src 'lan'
option src_ip '192.168.1.230'
option dest 'wan'
option proto 'all'
option target 'REJECT'
option family 'ipv4'
Nie jeżeli nie chcemy używać uci to można alternatywnie wykonać to odpowiednimi
poleceniami systemowymi (robimy tylko jednym sposobem - wyżej przez uci lub poniżej poleceniami):
# 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
https://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.231 table modem
# ip rule add from 192.168.1.232 table modem
# ip rule add from 192.168.1.233 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
Tylko dla systemów wyposażonych w iptablesScenariusz 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 'wan'
option metric 10
...
config interface 'wan2'
option apn internet
option device /dev/ttyUSB0
option proto 3g
option metric 20
Lub
config interface 'wan2'
option apn internet
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