Wojtek Tylkowski - Dwa łącza SDI
Dwa łącza SDI
TP S.A. świadczy w Polsce dostęp SDI. Pojedyńczy terminal
obsługuje tylko przepustowość 115kbps, co nie jest zbyt dużą
prędkością. Relatywnie tanio jest
nabyć drugie urządzenie, jako że łącza o większej przepustowości nie
wszędzie są dostępne lub też zbyt drogie. Pojawia się wówczas problem -
w jaki sposób zmusić oba urządzenia do pracy jednocześnie, gdy
podłączone są do jednego serwera. Oczywiście
używamy serwera Linux...
Gdy mamy taki problem można próbować rozwiązać go na dwa sposoby:
Sposób 1
Korzystamy z opcji "multilink ppp". Możliwe jest to, gdy oba SDI
znajdują się na jednej
półce. Mają one wtedy bardzo podobne adresy IP (różniące się tylko
ostatnim człnen, np. SDI1
ma adres x.y.z.17 a SDI2 x.y.z.18). TP S.A. nie blokuje zwykle mppp,
ale nie ma tego nigdzie w umowie, więc nie da się wygzekwować
włączenia, gdyby nie działało. Logujemy się wówczas
na obu SDI na tą samą nazwę użytkownika i hasło, a w opcjach ppp
ustawiamy ustawiamy opcję mppp.
Sposób 2
Ten sposób jest dużo bardzjej uniwersalny. Po odpowiedniej modyfikacji
umożliwia on
agregację dwóch DOWOLNYCH łącz do dwóch dowolnych prowiderów Internetu.
Polega on
na zastoswaniu dynamicznego routingu. Jego zaletą jest to, że nie
wymaga "paczowania"
czy to ppp, czy to kernela Załóźmy, że nasza sieć wygląda następująco:
________
+------------+ /
| | |
+-------------+ SDI 1 +-------
__ | | | /
___/ \_ +------+-------+ +------------+ |
_/ \__ | IP_SDI1 | /
/ \ | | |
| Sieć lokalna -----+Router Linux | | TPSA (internet)
\_ _/ | | |
\__ __/ | IP_SDI2 | \
\___/ +------+-------+ +------------+ |
| | | \
+-------------+ SDI 2 +-------
| | |
+------------+ \________
Zakładamy że SDI1 startuje jako ppp0 a SD12 jest widoczne jako ppp1
SDI1 ma numer ip IP_SDI1, a SDI2 ma numer ip IP_SDI2
Po pierwsze, aby zapewnić sprawne działanie sieci, musimy zapewnić, aby
pakiety
które przyszły do SDI1 z internetu wróciły też przez SDI1, podobnie
pakiety z SDI2
powinny do Internetu wrócic przez SDI2. Jeśli tego nie zrobimy, żadne
serwery usług
(poczta, ftp itd.) nie będą poprawnie działać.
Zakładamy wiec dwie tabele routingu. Tabela dla SDI1 będzie mieć numer
100, a tabela dla SDI2 - numer 101. Piszemy sobie skrypt:
#!/bin/bash
ip route add default via $SDI_IP1 dev ppp0 table 100
ip route add default via $SDI_IP2 dev ppp1 table 101
Teraz należy zapewnić aby routing przychodzący z IP_SDI1 szedł tabelą
100, podobnie
ruch z IP_SDI2 musi isc tablelą 101:
ip rule add pref 10 from $SDI_IP1 table 100
ip rule add pref 11 from $SDI_IP2 table 101
W tym momencie powinnismy móc pingować z zewnątrz (z internetu) oba SDI.
Następna reguła którą dopiszemy spowoduje, że cały ruch WYCHODZĄCY z
naszego serwera
będzie szedł raz przez jedno, raz przez drugie SDI:
ip route add default scope global equalize \
nexthop via $IP_SDI1 dev ppp0 weight 1 \
nexthop via $IP_SDI2 dev ppp1 weight 1
Opcja equalize powoduje dzielenie ruchu na poziomie pakietów. Jeśli
wyłączymy tą opcję
uzyskamy podział na poziomie połączeń tcp. Dzielenie będzie mniej
równomierne, ale
za to bezpieczniejsze w przypadku awarii któregoś z urządzeń.
Jeśli mamy maskaradę (a pewnie mamy, jako że z SDI dostajemy tylko
jeden numer IP) należy
jeszcze dopisać do skryptu uruchamiającego iptables:
iptables -t nat -A POSTROUTING -s $LOC_NET -o ppp0 -j SNAT --to-source $SDI1_IP
iptables -t nat -A POSTROUTING -s $LOC_NET -o ppp1 -j SNAT --to-source $SDI2_IP
W zaleznosci od tego na które sdi pakiet wyszedl, jest on teraz
odpiwednio maskowany.
W praktyce widziałem kilka razy (zwłaszcza na kernelu 2.4.18, jeśli to
ma znaczenie),
że po wpisaniu powyższych reguł i wpisani ip route list jedna z tras w
nexthop-ie była oznaczana jako dead. Na internecie znalazlem
wyjasnienie (autorstwa autora iptables),
że "kernele 2.4 tak mają". Rozwiązaniem problem jest wtedy powtarzanie
wielkorotne wpisów z "wagą". Jeśli experymentalnie sprawdzilsmy, że
jako "dead" jest oznaczana druga trasa, można zrobić cos takiego:
ip route add default scope global equalize \
nexthop via $IP_SDI1 dev ppp0 weight 10 \
nexthop via $IP_SDI2 dev ppp1 weight 1 \
nexthop via $IP_SDI2 dev ppp1 weight 10
Mało eleganckie, ale działa - trzeci wpis nie jest już oznaczany jako
dead.
Na serwerze pozostaje postawić squida i cieszyć się dużą szybkością
połączenia.
Szbkość można sprawdzić np. tutaj
. Opisaną powyżej metodę można rozszerzyć nie tylko na SDI,
ale na dowolne inne łącze (np. ethernet) oraz
na dowolną liczbę dostawców Internetu.
Warto odwiedzić: Tour4you - strona o zwiedzaniu gratis
Darmowy hosting zapewnia PRV.PL