Administrator sieci staje czasami przed problemem
ustawienia wielkości transferu z netu do klientów. Kiedy powstaje
taka potrzeba? Najczęściej gdy jakiś narwany koleś nagminnie ściąga
duże pakiety, a pozostali użytkownicy marudzą, że sieć "nie
chodzi". Można wówczas skorzystać z omawianego tutaj CBQ lub
innego narzędzia HTB.
Aby zapanować nad komunikacją w sieci należy
wykonać:
- Narzucić klientom w domowej sieci stałe nr IP i
zablokować im możliwość logowania pod innym nr IP poprzez
powiązanie IP z MAC (opis na sąsiedniej stronie).
- Ustalić IP klientów, którzy zostaną objęci kontrolą
transferu i wyizolować pozostałe hosty od usług związanych z netem
za pomocą firewalla. W przypadku Mandrake (od wersji 9) oraz Mandriva firewall na
iptables jest nadzorowany za pomocą shorewalla.
Utworzyłem stronki o tym projekcie, ale w tym miejscu potrzebne są
jedynie przykłady wpisów blokujących - zapraszam tutaj
(zwróć uwagę na czerwony tekst).
- Wykonać pomiar maksymalnej wielkości przesyłu danych
na interfejsach (eth0, eth1, ppp0 itd.) i ustalić jednostkę do przeliczeń.
Na Linuksie zainstaluj darmowy program Iperf (mam go w swoim archiwum).
Polecam na kliencie windowsowym zainstalować poniższe programiki i wykonać test transferu.
WinMTR - program diagnostyczny (Win 95/98/Me/NT/2000/XP) freeware.
AnalogX - j.w.
Można skorzystać z zewnętrznych serwerów obliczających transfer:
http://twojeip.wp.pl/
http://www.numion.com/YourSpeed/
http://www.numion.com/MaxSpeed/
http://promos.mcafee.com/speedometer/testing.asp
http://test.vline.pl/test.php
http://www.continuum.com.pl/speedtest/
http://test.sopee.net/
- Ściągnąć najnowszą wersję scryptu CBQ ze strony domowej
projektu http://sourceforge.net/projects/cbqinit lub http://freshmeat.net/projects/cbq.init
- Przypomnieć sobie teorię przeliczeń jednostek:
bitów, bajtów, kbit, mbit itd. Będzie to przydatne, gdyż w plikach konfiguracyjnych wskazane jest używać
jednej, pełnej jednostki (można użyć Kbit w RATE,
WEIGHT oraz Mbit w DEVICE, natomiast nie wolno różnych
jednostek w RATE, WEIGHT - generalnie jednak polecam używanie TYLKO
jednej jednostki).
- Zainstalować Linuksa, który ma w Kernelu
zaimplementowaną obsługę modułu sch_cbq oraz zainstalowane
iproute2. Mandrake (od wersji 9.0) oraz Mandriva mają jądro standardowo obsługujące CBQ.
Aby przetestować jądro pod kątem zgodności z CBQ trzeba (mając
zainstalowane iproute2) wpisać komendę: tc -d qdisc .
Jeśli w wyniku jej działania pojawi się jakiś komunikat typu
RTNETLINK error, wtedy odpuśćmy sobie CBQ. Jeśli jądro jest
prawidłowo skonfigurowane i gotowe do działania, to ta komenda nic
nie wyświetli (lub wyświetli przydzielone widełki). Natomiast po
skonfigurowaniu CBQ, możesz tym samym zleceniem tc -s qdisc
sprawdzić jak scrypt działa. Zobacz tutaj.
Uwaga: demon squid może sprawić problemy, dlatego na czas
testów wyłącz go (lub odinstaluj). Na moim komputerze funkcje
firewalla i masquarady załatwia iptables, a klienty mają stały
adres IP dodatkowo powiazany z MAC (przy pomocy scryptu).
Jeżeli przeczytałeś powyższy tekst i nie rozumiesz
za bardzo o co w nim chodzi, to... daj sobie na wstrzymanie. Mam
wiele zapytań z netu od adminów linuksowych, którzy już na tym
etapie czytania czują się zagubieni. Piszą do mnie na GG lub ślą
maile licząc, że... wyjaśnię co to interfejs ppp0, eth?,
poprzeliczam jednostki, posprawdzam poprawność wyników, pokażę jak
firewallem odizolować niektórych klientów od netu itd. Potem mają
nadzieję, że sam skonfiguruję im CBQ ustawiając co należy przy
pomocy połączenia ssh. NIC Z TYCH RZECZY! Prowadzę
hobbystyczną, niekomercyjną stronę www, ale nie będę pomagał
wszystkim zagubionym nowicjuszom. Mam wiele maili dotyczących TYLKO CBQ. Ile czasu
bezproduktywnie zmarnowanego staje się moim udziałem! Czemu
bezproduktywnie? Gdyż szybko stwierdzam, że rozmówcy najczęściej nie znają podstaw Linuksa i zadają nieskończoną
ilość pytań niezwiązanych z CBQ (o ZARZĄDZANIU napisałm kilka
stronek www i oczekuję, że zostaną one przeczytane w pierwszej
kolejności). Ponadto wykaż się choć odrobiną samodzielności,
przeczytaj uważnie niniejszą stronę. Nie pytaj o rzeczy już
opisane.
Przyjmujemy, że z netem łączymy się zgodnie z
poniższym schematem:
NET---ppp0-[IP od
TPSA/Linux/192.168.0.1]-eth0---[clienty 192.168.0.2,
192.168.0.3 itd]
w którym interfejs ppp0 działa na modemie
SDI-HIS o numerze zewnętrznym 217.196.171.100, a klienty
łaczą się z serwerem na interfejsie eth0, czyli za pomocą
kart sieciowych o numerach 192.168.0.2 , 192.168.0.3 , 192.168.0.4
, 192.168.0.5.
Na Linuksie zainstaluj darmowy program Iperf. (mam go w swoim archiwum).
Pod Windows 98, ME, 2000, XP (na komputerze klienckim)
proponuję zainstalować jeden z kilku programików: NetMeter oraz AnalogX.
Dają ładne i proste wykresy transferu do i z hosta.
Zwróć uwagę na jednostki.
Chwilowo przyjmijmy, że wewnętrzna sieć (eth0)
działa na jednej z dwóch teoretycznie możliwych wartości: 100
Mbit/sek lub 10 Mbit/sek. Na potrzeby tego opisu wybieram 10
Mbit/sek transferu na interfejsie eth0 (czyli po odjęciu zapasu
tolerancji ok 9500Kbit).
W naszym przykładzie zajmujemy się siecią na łączu
SDI-HIS, w której pracuje 4 klientów. Usługa SDI-HIS póki co, (na
dzień dzisiejszy) nie narzuca rygorystycznie wielkości transferu
przychodzącego i wychodzacego. Proporcje te mogą być płynne, byle by suma wynosiła 112 Kbit/sek. Dzielimy więc transfer 110Kbit/sek:
- dla wszystkich klientów w sieci (zbiorczo) - transfer
wychodzący na poziomie 30Kbit/sek
- pulę 80 Kbit/sek do podzialu na 4 klientów do transferu
przychodzącego.
Jak łatwo można wyliczyć, każdy z hostów w domowej sieci otrzyma
20 Kbit/sek maksymalnego transferu przychodzącego.
Oczywiście w skrajnych okolicznościach, gdy każdy z naszych
klientów zaprze się i jednocześnie zacznie wysyłać i ściągać pliki
(albo jednocześnie wysyłać pliki) to przy takim podziale zabraknie
komuś transferu, ale jeżeli wszyscy jednocześnie będą na maksa
tylko ściągać z netu - powinno starczyć ;) Co prawda da się
zabezpieczyć przed pierwszą możliwością i ustalić bardziej
restrykcyjne parametry, ale moim zdaniem będzie to zbędna
nadgorliwość administratora. Mając podzieloną teoretycznie sieć,
możemy umieścić scrypt CBQ w systemie i skonfigurować go.
Zauważyłeś pewnie, że transfer wychodzący z sieci do netu jest
dosyć prymitywnie dzielony. Niestety, aby ograniczyć komputer
kliencki z obu kierunków, należy pracować na sieci wpiętej do
komputera z drugim Linuksem (np. fresco), który to z kolei musi
łączyć się z netem wg schematu:
NET---ppp0-[IP od TPSA/Linux
Fresco/192.168.10.1]-eth0---[192.168.10.2/ nasz Linux/192.168.0.1]-eth1---[clienty
192.168.0.2 itd.]
Konfigurację CBQ na takim Linuksie
opisałem na osobnej stronie www.
*
Pobierz plik ze strony http://sourceforge.net/projects/cbqinit lub http://freshmeat.net/projects/cbq.init . W lipcu 2003
był to numer cbq.init-v0.7.2, a w marcu 2004 cbq.init-v0.7.3
. Zmień prawa do tego pliku poleceniem: chown root.root
cbq.init* oraz chmod 755 cbq.init* . Dla swojej wygody
możesz mu zmienić nazwę na cbq.init poleceniem mv
cbq.init-v* cbq.init . Umieść go w katalogu
/etc/rc.d
*
Przypominam schemat naszej sieci. Będzie potrzebny
do zrozumienia logiki nadawanych nazw plikom konfiguracyjnym.
INTERNET --------- ppp0 - [Linux ] - eth0 --------------[client]
W katalogu /etc/sysconfig utwórz katalog
cbq i nadaj mu prawa: root.root 755 (poleceniami
chmod 755 cbq oraz chown root.root cbq) . Utwórz w
nich pliki konfiguracyjne. W nazwie_pliku można dla swojej wygody
umieścić nazwę interfejsu i kierunek transferu (skąd_dokąd). Pliki
tworzy się poleceniem touch nazwapliku . Nadaj im prawa
750 root.root . Uwaga: w nazwach plików nie
ma spacji. Nazwa składa się z:
* słowa cbq
* myślnika
* numeru, który
jest jest dwubajtową hexagonalną
liczbą rzędu <0002-FFFF> (nie zmieniaj formatu!)
* kropki
* dowolnej terści (bez spacji)
Lista plików wg ich nazw:
Pierwszy plik zajmie się zbiorczo transferem
wychodzącym z naszej sieci do Internetu. Transfer nie będzie
niestety rozbity na poszczególne stacje.
cbq-0002.ppp0_klienty_net
Kolejne pliki zajmą się konfiguracją transferu przychodzącego z
netu do domowej sieci w rozbiciu na poszczególne stacje.
cbq-0003.eth0_serwer_klient
cbq-0004.eth0_serwer_klient
cbq-0005.eth0_serwer_klient
cbq-0006.eth0_serwer_klient
Przypominam, iż przyjęliśmy, że łączymy się z
Internetem poprzez modem SDI-HIS. Wypełnij utworzone przed chwilą
pliki następującą treścią. Uwaga: w poszczególnych
wierszach nie ma spacji.
cbq-0002.ppp0_klienty_net
treść (zwróć uwagę na przecinek (,) w polu RULE):
DEVICE=ppp0,110Kbit,11Kbit
RATE=30Kbit
WEIGHT=3Kbit
PRIO=5
RULE=217.196.171.100,
cbq-0003.eth0_serwer_klient
treść:
DEVICE=eth0,9500Kbit,950Kbit
RATE=20Kbit
WEIGHT=2Kbit
PRIO=5
RULE=192.168.0.2
cbq-0004.eth0_serwer_klient
treść:
DEVICE=eth0,9500Kbit,950Kbit
RATE=20Kbit
WEIGHT=2Kbit
PRIO=5
RULE=192.168.0.3
cbq-0005.eth0_serwer_klient
treść:
DEVICE=eth0,9500Kbit,950Kbit
RATE=20Kbit
WEIGHT=2Kbit
PRIO=5
RULE=192.168.0.4
cbq-0006.eth0_serwer_klient
treść:
DEVICE=eth0,9500Kbit,950Kbit
RATE=20Kbit
WEIGHT=2Kbit
PRIO=5
RULE=192.168.0.5
Startujesz skrypt (jako root) komendą /etc/rc.d/cbq.init
start nocache , a sprawdzasz jak działa poleceniem tc -s
qdisc (wyświetlą się wtedy Twoje parametry z plików cbq-0002
itd.).
Autostart skryptu /etc/rc.d/cbq.init możesz
umieścić w /etc/rc.d/rc.local dopisując na
końcu linię
/etc/rc.d/cbq.init start nocache
Przypominam, że plik /etc/rc.d/
cbq.init ma mieć prawa: root.root 755.
*
Czytając pytania od internautów (w mailach i na GG)
odnoszę wrażenie, że nikt nie czyta do końca i uważnie porad
umieszczonych na tej stronie. Na szybkiego robi się pliki
konfiguracyjne i... ze zdziwieniem zauważa, że nie działają.
Podstawowe błędy jakie robią pospieszni admini:
- w nazwę pliku wpisują nr kolejny wg systemu dziesiątkowego, a
ma być liczba hexagonalna
- łączą w plikach konfiguracyjnych kilka jednostek np. Mbit oraz
Kbit. Nie umieją przeliczać jednostek (1Mbit to nie jest 1000 razy Kbit)
- wprowadzają wartości ułamkowe (bo tak im pasuje po podzieleniu
przez 10), a wolno wprowadzać wyłącznie wartości całkowite (nawet
jeżeli dzielnikiem będzie np. 6, a nie 10)
- wprowadzają spację do nazwy pliku lub jego zawartości
- zapominają, że przecinek w pliku konfiguracyjnym transferu
wychodzącego jest konieczny
- mając interfejsy np. eth0 oraz eth1 konfigurują komputer
kliencki na IP zewnętrzne, a trzeba w obu plikach na IP wewnętrzne
(np. 192.168.0.5)
- mając ppp0 (modem) oraz eth0 (do domowej sieci), trzeba
zbiorczo ustawić transfer wychodzący na IP zewnętrznym (np.
217.96.171.101), a indywidualnie (dla kazdego klienta-komputera
osobno) na IP wewnętrznym (np. 192.168.0.5). Na marginesie podaję,
że otrzymałem mailem niżej umieszczony wpis skrtyptu
iptables regulującego niezbiorczo transfer, ale jest to rozwiązanie
dla zaawansowanych Linuksiarzy
- nie znają rzeczywistych możliwości transferu w sieci.
*
Otrzymałem informację od anonimowego internauty,
że w przypadku korzystania z maskarady "można ograniczyć transfer
wychodzący dla poszczególnego usera w poniższy sposób" (dotyczy
SDI):
iptables -t mangle -I PREROUTING -s 192.168.1.4 -j
MARK --set-mark 4
i do tego w pliku konfiguracyjnym:
DEVICE=ppp0,100Mbit,10Mbit
RATE=128Kbit
WEIGHT=10Kbit
ISOLATED=yes
MARK=0x4
Po wykonaniu iptables (dla wszystkich userów) trzeba
oczywiscie
zapisać zleceniem iptables-save
Przykład plików konfiguracyjnych CBQ pod Neostradę: cbq_neo.rar