Statyczne ograniczanie pasma

Moduł shaper.o

GŁÓWNA STREFA ZRZUTU SZNURECZKI ARCHIWUM

ZAŁOŻENIA

Nagły wysyp programów p2p typu kaaza, przyprawił o ból głowy niejednego administratora. Bezmyślność niektórych użytkowników którzy ściągając po kilka plików naraz, zapychają nasze łącza, jest bezdenna. W Polsce jak wiadomo łącza dla małych sieci lokalnych opierają się głównie na SDI, które pomimo wielu niewątpliwych zalet, ma zasadniczą wadę, prędkość 115200 kbps. Kaazaa czy programy jej podobne potrafią całkowicie zamulić łącze SDI, oczywiście dotyczy to także wydajniejszych łącz, lecz dla SDI to jest zabójstwo. Więc jak ograniczyć zapychacza łącza ?. Najlepiej było by ograniczyć mu pasmo do szerokości wynikającej z podziału łącza na użytkowników. Jak wiadomo dla Freesco tworzenie zaawansowanego kolejkowania, z racji kernela, jest niemożliwe do wykonania. Jedyna nadzieja na, choć częściową realizację ograniczenia stwarza nam program, a właściwie urządzenie o nazwie shaper. Dlaczego mowa tu o urządzeniu, ano jako że ograniczenie prędkości (pasma) połączenia jest realizowane poprzez przekierowanie ruchu na specjalnie stworzony interfejs który jest niejako "przypinany" do interfejsu fizycznego. Konfigurując przepustowość tego urządzonka regulujemy prędkość jaką użytkownik uzyska podczas ściągania danych z internetu. Niestety shaper potrafi ograniczać tylko ruch wychodzący, także jedyna możliwość to podpięcie go pod interfejs sieci lokalnej, tak aby dane były ograniczane na drodze z serwera do usera. Spowoduje to oczywiście też zmniejszenie ruchu na interfejsie realizującym nasze połączenie z inetem. W takim przypadku ograniczona niestety zostanie także komunikacja z serwerem plików (samba), programem pocztowym na serwerze oraz z lokalnym serwerem proxy. Ale coś za coś, uciążliwość ssaczy zwycięża ograniczenia stosowania tshaper'a.

POTRZEBNE MATERIAŁY:

RUSZAMY Z PIERWSZEGO BIEGU:

Na początek w katalogu /mnt/router/packages tworzymy podkatalog tshaper, do którego kopiujemy pliki shaper.o, insmod, shapecfg i readme. Teraz aby nie wpisywać kilometrowych ścieżek dla uruchomienia konfiguracji shapera, tworzymy linki (dowiązania) symboliczne do naszych plików shaper'a do plików w kat /bin. W tym momencie jeszcze robimy to ręcznie, ale poniżej opisany jest plik rc_shaper który zrobi to za nas automatycznie przy starcie systemu.
ln -s /mnt/router/packages/tshaper/shapecfg /bin/shapecfg
ln -s /mnt/router/packages/tshaper/insmod /bin/insmod

Następnie musimy załadować shaper'a jako moduł jądra. Jest to też ujęte w rc_shaper, opisanym poniżej.
insmod -fs -o shaper0 /mnt/router/packages/tshaper/shaper.o
Gdzie shaper0 to nazwa i numer naszego interfejsu ograniczania. Z tego co na obecną chwilę jest mi wiadomo to takich interfejsów można wskrzesić do 100 (czyli maksymalny to shaper99). Jednak nie testowałem tego aż tak intensywnie.
Kolejną rzeczą do zrobienia będzie przypisanie shaper'a do naszego interfejsu na którym będziemy blokować częściowo ruch wychodzący. Na przykładzie będzie to interfejs sieci lokalnej eth0. W ten sposób będziemy ograniczać ruch z internetu do konkretnego użytkownika, przycinając pasmo na interfejsie lokalnym
shapecfg attach shaper0 eth0
Pozostaje jeszcze ustalenie prędkość interfejsu w kbps (na przykładzie 28800), co czynimy komendą
shapecfg speed shaper0 28800
Prędkością shapera możemy manipulować podczas jego pracy, co daje nam spore możliwości (patrz justice)
Teraz tylko trzeba by postawić nasze wąskie gardło na nogi :)
ifconfig shaper0 192.168.0.1 up
Adres IP dla shaper0 musi być identyczny z tym, przypisanym dla interfejsu naszej sieci lokalnej (adres serwera) czyli eth0. W moim przypadku to 192.168.0.1. Maski nie trzeba podawać, linux przydzieli maskę na podstawie klasy adresów sieci (klasa C).
Teraz zanim będę kontynuował temat, zaserwuję wam jeszcze garść teorii na temat routingu. Routing to kierowanie pakietami na podstawie ich adresu IP i tym samym przynależności do określonych sieci. Główną nastawnią dla pakietów jest tzw tablica routingu. W niej są zapisane sieci i związane z nimi interfejsy. Jeżeli zatem wpiszemy
route -n
Otrzymamy rezultat, czyli tabelę routingu

Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
255.255.255.255 * 255.255.255.255 UH 1500 0 13 eth0
217.97.221.98 * 255.255.255.255 UH 552 0 0 ppp0
217.97.221.98 * 255.255.255.255 UH 552 0 0 sl0
217.96.211.173 * 255.255.255.255 UH 552 0 0 ppp0
192.168.0.0 * 255.255.255.0 U 1500 0 31 eth0
127.0.0.0> * 255.0.0.0 U 3584 0 6 lo
default * * U 552 0 559 ppp0
default * * U 552 0 3 sl0

Zatem jeżeli chcemy komuś ograniczyć pasmo musimy spowodować aby pakiety kierowane do hosta który chcemy przyblokować wędrowały przez nasz interfejs wąskiego gardła. W tym celu musimy dodać wpis o tym do tablicy routingu.
route add 192.168.0.7 dev shaper0
Teraz trasa do hosta 192.168.0.7 będzie biegła przez interfejs shaper0. W ten sposób user z pod tego adresu będzie mógł pobierać dane z maksymalną prędkością jaką wcześniej ustaliliśmy. Usunięcie tej trasy czynimy poprzez wydanie komendy
route del 192.168.0.7
Można zadać pytanie, jak teraz będzie mógł host 192.168.0.7 korzystać z inetu skoro usunęliśmy do niego trasę dla pakietów ? Otóż jego adres zawiera się w adresie całej sieci 192.168.0.0 która jest domyślnie określona w tablicy routingu dla urządzenia eth0. Wydając komendę route add z jego konkretnym adresem, spowodowaliśmy dodanie adresu konkretnego hosta do tablicy. A jeżeli w tablicy routingu znajdują się dwie trasy do jednego IP, jedna zawarta w adresie całej sieci a druga określająca tylko jednego host'a, to brana będzie pod uwagę ta bardziej precyzyjna (flaga H) czyli do host'a. Należy pamiętać o tym że przez nasz shaper0 przechodzi ruch wychodzący TYLKO o prędkości ustalonej  przez shapecfg. Czyli jeżeli przepuścimy przez niego pakiety do dwóch użytkowników to prędkość ustalona na 28800 będzie sumaryczną prędkością maksymalną obu hostów. Dlatego też w przypadku większej ilości miłośników kaazy potrzebujemy tyle shaperów ile ich mamy  do przytykania. Robimy to tak jak robiliśmy jeden interfejs, tylko dodajemy wyższe numerki np. shaper1, shaper2 itd.

Poniżej jest przykład realizacji takiego rozwiązania na przykładzie konfiguracji za pomocą pliku rc_shaper który należy skopiować do katalogu /mnt/router/rc/rcuser i nadać mu atrybuty wykonywalności.

#!/bin/sh

. /etc/system.cfg
. /etc/live.cfg
. /etc/chat.pwd

#Nie podejmujemy żadnych działań przy starcie firewall'a
if [ "$1" = firewall ]; then
exit; fi

#Jak również nie interesuje na zatrzymanie i restart tego skryptu, gdyż shapera nie da się #położyć spać :)
if [ "$1" = stop -o "$1" = restart ]; then
exit; fi

echo -n "Instalacja modulow shaper'a "

#Tworzymy dowiązania symboliczne
ln -s /mnt/router/packages/tshaper/shapecfg /bin/shapecfg
ln -s /mnt/router/packages/tshaper/insmod /bin/insmod


#Dokładamy tyle urządzeń shaperx ile mamy userów do ograniczenia gdzie x to numer #urządzenia jedno urządzenie na jednego usera. W naszym przypadku to 4 shapery. Z opcją #logowania startu do logów systemowych (-o)
insmod -fs -o shaper0 /mnt/router/packages/tshaper/shaper.o
insmod -fs -o shaper1 /mnt/router/packages/tshaper/shaper.o
insmod -fs -o shaper2 /mnt/router/packages/tshaper/shaper.o
insmod -fs -o shaper3 /mnt/router/packages/tshaper/shaper.o

#Dowiązujemy wszystkie shapery do naszej karty sieciowej dla sieci wewnętrznej
shapecfg attach shaper0 eth0
shapecfg attach shaper1 eth0
shapecfg attach shaper2 eth0
shapecfg attach shaper3 eth0

#Ustawiamy prędkość interfejsów, prędkości są przykładowe, można nimi manipulować podczas #pracy shaper'a.
shapecfg speed shaper0 23040
shapecfg speed shaper1 28800
shapecfg speed shaper2 38400
shapecfg speed shaper3 57600

#Włączamy teraz owe interfejsy ograniczeń z adresem naszego eth0
ifconfig shaper0 192.168.0.1 up
ifconfig shaper1 192.168.0.1 up
ifconfig shaper2 192.168.0.1 up
ifconfig shaper3 192.168.0.1 up

$DONE

I jeżeli taki skrypt uruchomi się przy starcie, możemy sobie potem skierować każdego niepokornego przez wybrany interfejs ograniczający.
Na koniec dodam swoje spostrzeżenie że shaper ograniczając pasmo powoduje "skoki" transferu, które w sumie mogą oscylować przy wartości prędkości ustalonej, jednak nie są sztywno ograniczane. Wygląda to jakby ktoś przykręcał co jakiś czas kurek z danymi :-)
Osobiście nie uważam tego rozwiązania za sprawiedliwe ani skuteczne. Testując je zdałem sobie sprawę z tego że SDI powinniśmy dzielić dynamicznie. Statyczne ograniczenia są bardzo drastyczne, inet prawie stoi. Proponuję więc rozwiązanie pod nazwą "justice" które jest szeroko opisane na tej samej witrynie

PRZESTROGA

WSZYSTKICH ZMIAN W STOSUNKU DO ORYGINALNEJ KONFIGURACJI DOKONUJECIE NA WŁASNĄ ODPOWIEDZIALNOŚĆ !!! W RAZIE NIEPOWODZENIE UMYWAM RĘCE !!!

Z uwagi na problemy z kompatybilnością (znak końca linii), edycja plików DOS z poziomu linux'a i plików linux'a z poziomu DOS/Windows, niesie za sobą zagrożenie utraty funkcjonalności plików wykonywalnych !!!

Sam shaper w pewnej sytuacji (błędna konfiguracja) może spowodować wieszanie się różnych procesów, a nawet samego systemu. Moduł może przy pewnym zbiegu czynników powoduje błędy pamięci. Podczas testowania u siebie, taką sytuację zaobserwowałem !!! Zatem konfigurujcie, włączajcie i używajcie go prawidłowo !

PLIKOLOGIA

rc_shaper shaper.o insmod shapecfg readme.shaper readme.credits źródła modułu shaper

PODZIĘKOWANIA: dla grup dyskusyjnych i forum  

 

© 2002 - 2003 Robert R - Kopiowanie w całości lub części bez pozwolenia autora zabronione