V-Smart - Twój partner w biznesie internetowym

Routing na kilka łączy WAN

Okej. A co jeśli jesteśmy biednym małym ISP i musimy sobie radzić z siecią, która stoi na kilku DSLach (czyli asymetrycznych łączach) ? Wtedy stajemy przed rozwiązaniem problemu jak prawidłowo skonfigurować bramę dostępu do Internetu aby mądrze zarządzać ruchem miedzy kilkoma łączami. Nie istotne jest jakie to łącza.

Co będzie potrzebne:

  • Dowolna dystrybucja systemu GNU Linux.
  • Zalecane jądro z serii 2.6.x. Jądro musi mieć wkompilowane następujące opcje w sekcji NETWORKING: IP: Advanced Router, IP: Policy Routing. W sekcji NETFILTER: Connmark. Domyślnie w nowszych dystrybucjach opcje te są już wkompilowane. Jednak w przypadku problemów jest to pierwszy aspekt, który należy sprawdzić.
  • Zbiór aplikacji iproute2, odpowiedni dla danej wersji jądra.
  • Filtr pakietów iptables.

Słowem - wszystko prócz dystrybucji znajdziecie w projekcie v-smart dla [i386] lub [amd64] :)

Konfiguracja routingu.

Konfiguracja routingu w przypadku podziału ruchu na dwa lub więcej łączy składa się z kilku części. W pierwszej kolejności należy dodać odpowiednie tablice routingu do pliku:

/etc/iproute2/rt_tables

Zasada jest taka, że domyślny routing zapisany jest w tablicy o nazwie main z numerem 254. Kolejne wpisy należy dodawać z numerami niżymi np. 200, 201, 202 itd. Przykładowy wpis w powyższym pliku ma format:

nr_tablicy nazwa_tablicy

Następnie w każdej nowo dodanej tablicy routingu należy umieścić identyczne wpisy dotyczące podsieci lokalnych jak w tablicy main, której zawartość odczytać można za pomocą polecenia:

ip route list

Dodawanie wpisów do tabeli wykonać można za pomocą polecenia:

ip route add table [tablica] [podsiec] dev [interfejs]

Trasa domyślna (ang. default) dla każdej nowo dodanej tabeli przebiega przez inne łącze zatem do każdej należy dodać bramę domyślną następującym poleceniem:

ip route add table [tablica] default via [adres_bramy]

Zgodnie z zasadami, które rządzą protokołem TCP/IP, na każdy odebrany przez router pakiet musi zostać wygenerowana odpowiedź. Odpowiedź ta musi wrócić do nadawcy tą samą trasą którą nadeszła. Na obecnym etapie konfiguracji routingu – odpowiedź ta zostanie wysłana poprzez bramę domyślną dla systemu umieszczoną w tablicy main. W konsekwencji – jeśli dowolny pakiet nadejdzie z łącza, dla którego routing określają dodatkowe tablice różne od main – nie zostanie wygenerowana na niego odpowiedź co uniemożliwi dalszą transmisję. Rozwiązaniem tego problemu jest „podpowiedź” dla routera, którędy powinien wysyłać pakiety otrzymane trasą różną od main:

ip rule add from [podsiec_bramy] table [tablica]

Ostatnim krokiem w konfiguracji omawianego routingu jest stworzenie zasad, które pokierują pakiety (połączenia) o określonych właściwościach daną trasą (przez dane łącze). Najprostszym rozwiązaniem jest tzw. „markowanie” pakietów lub połączeń odpowiednimi znacznikami (ang. mark). Znaczniki te są liczbami całkowitymi dodatnimi, różnymi od zera. Dla każdego nowego łącza (nowej tabeli) należy utworzyć osobny, unikatowy znacznik, który zostanie wykorzystany w momencie sterowania ruchem (punkt następny). Do tego celu można wykorzystać polecenie:

ip rule add fwmark [znacznik] table [tablica]

Sterowanie ruchem.

Sterowanie ruchem pakietów (połączeń) między kilkoma łączami rozwiązuje się za pomocą filtru iptables. Filtr ten dostarcza między innymi opcje znakowania (markowania) pojedynczych pakietów lub całych połączeń określonymi znacznikami. Składnia polecenia dla pojedynczych pakietów jest następująca:

iptables –t mangle –A PREROUTING [kryteria] –j MARK –-set-mark [znacznik]

natomiast dla połączeń:

iptables –t mangle –A PREROUTING [kryteria] –j CONNMARK –-set-mark [znacznik]

iptables –t mangle –A PREROUTING –m connmark –-mark [znacznik] –j CONNMARK –-restore-mark

Znakowanie całego połączenia polega na oznaczeniu pakietu, od którego rozpoczyna się połączenie a następnie automatycznym oznaczeniu każdych następnych pakietów należących do danego połączenia logicznego. Znakowanie połączeń przydatne jest w momencie, gdy pakiet rozpoczynający transmisję ma inny charakter niż pozostałe uczestniczące w dalszej części połączenia. Sytuacja taka ma miejsce w przypadku połączeń p2p, VoIP, FTP i innych.

Parametr [kryteria] określa właściwości pakietów, które zostaną zamarkowane określonym znacznikiem a następnie pokierowane przez routing skonfigurowany w punkcie 3 na odpowiednie łącze (odpowiednią trasą). Poszczególne elementy składające się na ten parametr można łączyć ze sobą w ich iloczyn logiczny. Poniżej przedstawiono kilka przykładowych parametrów:

[-p tcp --dport 80] – caly ruch WWW

[-s [adres_ip]] – ruch z danego adresu IP

[-s [podsiec_lokalna]] – ruch z danej podsieci

Jeśli w sieci lokalnej nie ma możliwości dysponowania publicznymi adresami IP, należy zastosować mechanizm zwany NAT-em źródłowym w celu udostępnienia połączenia dla podsieci z puli prywatnych. Ponieważ przepływ pakietów realizowany będzie przez kilka łączy, najwygodniej wykorzystać mechanizm zwany MASKARADĄ, który automatycznie dostosuje NAT źródłowy do pakietów po routingu:

iptables –t nat –A POSTROUTING –s [podsiec_lokalna] –j MASQUERADE

Konfiguracja głównego routingu oraz udostępniania połączenia internetowego dla podsieci 192.168.1.0/24 oraz 192.168.2.0/24

ip address add 80.70.60.130/30 brd 80.70.60.131 dev eth0

ip link set eth0 up

ip address add 80.70.50.66/30 brd 80.70.50.67 dev eth1

ip link set eth1 up

ip address add 80.70.40.34/30 brd 80.70.60.35 dev eth2

ip link set eth2 up

ip address add 192.168.1.1/24 brd 192.168.1.255 dev eth3

ip address add 192.168.2.1/24 brd 192.168.1.255 dev eth3

ip link set eth3 up

ip route add default via 80.70.60.129 dev eth0

iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j MASQUERADE

iptables –t nat –A POSTROUTING –s 192.168.2.0/24 –j MASQUERADE

Tabele routingu w pliku /etc/iproute2/rt_tables

200 wan2

201 wan3

Trasy do podsieci lokalnych dla nowo dodanych tabel

ip route add table wan2 192.168.1.0/24 dev eth3

ip route add table wan2 192.168.2.0/24 dev eth3

ip route add table wan3 192.168.1.0/24 dev eth3

ip route add table wan3 192.168.2.0/24 dev eth3

Trasy domyślne dla nowych tabel

ip route add table wan2 default via 80.70.50.65

ip route add table wan3 default via 80.70.40.33

Reguły zwrotne dla nowych tabel

ip rule add from 80.70.50.64/30 table wan2

ip rule add from 80.70.40.32/30 table wan3

Reguły routingu

ip rule add fwmark 10 table wan2

ip rule add fwmark 11 table wan3

Sterowanie ruchem – przykładowe założenia

a) ruch HTTP z podsieci 192.168.1.0/24 przez łącze WAN2

b) ruch HTTP z podsieci 192.168.2.0/24 przez łącze WAN3

c) ruch HTTPS dla adresów różnych od 192.168.2.128-192 przez łącze WAN2

d) ruch POP3 (odbieranie poczty) poprzez łącze WAN3

e) ruch FTP dla stacji roboczej o adresie 192.168.2.113 poprzez łącze WAN2

Realizacja założeń sterowania ruchem zgodnie z powyższą kolejnością

a)

iptables –t mangle –A PREROUTING –p tcp --dport 80 –s 192.168.1.0/24 –j MARK --set-mark 10

b)

iptables –t mangle –A PREROUTING –p tcp --dport 80 –s 192.168.2.0/24 –j MARK --set-mark 11

c)

iptables –t mangle –A PREROUTING –p tcp --dport 443 –s ! 192.168.1.128/26 –j MARK --set-mark 10

d)

iptables –t mangle –A PREROUTING –p tcp --dport 110 –j MARK --set-mark 11

e)

iptables –t mangle –A PREROUTING –p tcp --dport 20 –s 192.168.2.113 –j CONNMARK --set-mark 10

iptables –t mangle –A PREROUTING –p tcp --dport 21 –s 192.168.2.113 –j CONNMARK --set-mark 10

iptables –t mangle –A PREROUTING –m connmark –-mark 10 –j CONNMARK –-restore-mark

Na koniec

Należy zauważyć, że cały pozostały ruch, który nie został sklasyfikowany przez reguły skierowany zostanie przez domyślny routing poprzez łącze WAN1. Dobrą taktyką jest, aby łącze dla głównego routingu było symetryczne i aby wszelkiego rodzaju ruch p2p przechodził właśnie przez nie ponieważ nie ma skutecznych w 100% metod, aby go sklasyfikować i przerzucić na inne łącze. Za to w przypadku ruchu HTTP, HTTPs, POP3, SMTP, FTP i podobnych (działających na określonych portach) sterowanie pakietami lub połączeniami jest zawsze skuteczne.

Pewnym ograniczeniem przy tego typu sterowaniu ruchem jest brak możliwości stosowania mechanizmów kontrolujących przepustowość, które korzystają z markowania pakietów od/do określonego nadawcy/odbiorcy. Są to mechanizmy dość często stosowane w sieciach lokalnych jednak ich wydajność jest niewielka a stopień skomplikowania dość duży. Dobrą alternatywą przy kontrolowaniu przepływności łączy jest stosowania wirtualnych interfejsów IMQ w połączeniu z mechanizmami sprawiedliwego podziału łącza ESFQ od strony WAN routera. Było o tym tutaj.

Be Sociable, Share!
Zakres tematyczny: Routery linuxowe   autor: yarzombo Dodaj komentarz