strona przystosowana do rozdzielczości 1024x768

POWRÓT DO STRONY FREESCO

ARCHIWUM
Ograniczanie pasma sieciowego dla namiętnych ssaczy

Na co to komu:

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 podział łącza, z racji kernela, jest niemożliwy do wykonania ani statycznie ani dynamicznie. Jedyna nadzieja na, choć częściową realizację takiego podziału stwarza nam program, a właściwie urządzenie o nazwie tshaper. 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 tshaper 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:

Do przodu !!!:

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ć moduł shapera do jądra. Jest to też ujęte w rc_shaper, opisanym poniżej

insmod -fs -o shaper0 /mnt/router/packages/tshaper/shaper.o

Kolejno, przypisujemy shaper'a do naszego interfejsu sieci lokalnej. W ten sposób będziemy ograniczać ruch z internetu do konkretnego użytkownika, przytykając eth0 (w tym przypadku). A urządzenie nazywa się shaper0

shapecfg attach shaper0 eth0

Po tym ustalamy prędkość interfejsu w bodach, majac np. 4 userów na jedno SDI dzielimy 115200 przez 4 co daje nam pasmo ok 28800 dla każdego usera. Oczywiście jest to prędkość teoretyczna i w rzeczywistości jest to pasmo trochę większe. Wartość prędkości możemy regulować dynamicznie, podczas działania tshaper'a w każdej chwili 

shapecfg speed shaper0 28800

Teraz musimy "postawić" interfejs "wąskiego gardła" czyli dodać go do listy urządzeń sieciowych.

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 tabelę routingu pakietów w postaci:

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. Musimy dodać wpis o tym do tablicy routingu:

route add 192.168.0.7 dev shaper0

Czyli 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 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
if [ "$1" = firewall ]; then Nie podejmujemy żadnych działań przy starcie firewall'a
exit; fi
if [ "$1" = stop -o "$1" = restart ]; then Jak również nie interesuje na zatrzymanie i restart tego skryptu
exit; fi
echo -n "Instalacja modulow shaper'a " Wypisujemy na ekranie
ln -s /mnt/router/packages/tshaper/shapecfg /bin/shapecfg Tworzymy dowiązania symboliczne do plików przez nas używanych
ln -s /mnt/router/packages/tshaper/insmod /bin/insmod
 
insmod -fs -o shaper0 /mnt/router/packages/tshaper/shaper.o Ładujemy moduły shapera jako urządzenia od 1 do 4, opcją logowania do pliku .log
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
shapecfg attach shaper0 eth0 Podpinamy nasze shaper'y do interfejsu naszej sieci lokalnej czyli eth0
shapecfg attach shaper1 eth0
shapecfg attach shaper2 eth0
shapecfg attach shaper3 eth0
shapecfg speed shaper0 23040 Ustawiamy prędkości dla każdego shaper'a, aby móc manipulować ograniczaniem
shapecfg speed shaper1 28800
shapecfg speed shaper2 38400
shapecfg speed shaper3 57600
 
ifconfig shaper0 192.168.0.1 up Podnosimy nasze interfejsy "wąskich gardeł"
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 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. Teraz przydało by się napisać inteligentny skrypt sh, który zliczałby ruch poprzez ipfwadm, na tej podstawie określał użytkowników którzy blokują łącze, a następnie przydzielał im pasmo odpowiednie dla ilości użytkowników w danej chwili. Postaram się to jakoś rozwinąć, i uważam że temat jest tyle co napoczęty w tym opracowaniu. Zapraszam oczywiście do współpracy nad tym projektem WSZYSTKICH którzy mogą pomóc. Skonfigurowanie podziału dynamicznego było by OGROMNYM krokiem w dobrym kierunku

UWAGI 

Szary tekst tylko to komentarz ! 

Z uwagi na problemy z kompatybilnością (znak końca linii) nie zaleca się tworzyć plików wykonywalnych w Linuxie pod Windows'em !

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 !!!

plikologia:

shaper.o shapecfg readme.shaper rc_shaper insmod

PODZIĘKOWANIA dla grupy dyskusyjnej  trzepak.freesco

--

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