Wojtek Tylkowski - Dwa łącza SDI
wojtek

Wojtek Tylkowski - strona domowa


Dzisiejsza data: , godzina:
Przyszedłeś tu ze strony ...

Facebook

O mnie    Teksty    Praca    Hobby    Zdjęcia   



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. 
O mnie    Teksty    Praca    Hobby    Zdjęcia   

Warto odwiedzić: Tour4you - strona o zwiedzaniu gratis