Linux zarządzanie pasmem transmisji danych
- Aleksander Wala,
- 01.09.2004
Skuteczne zarządzanie pasmem transmisji przynosi zadowolenie klientów, współpracowników i innych osób korzystających z łącza przez nas administrowanego. Często jest zaniedbywane przez lokalnych operatorów, więc jakość ich łączy jest znacznie niższa niż można by tego oczekiwać. Najczęściej operator wciąż dokupuje pasmo, nie zdając sobie sprawy, że mógłby - dysponując połową aktualnego łącza - oferować większą jakość usług. Oszczędzałby przy tym pieniądze, a niejednokrotnie nerwy.
Skuteczne zarządzanie pasmem transmisji przynosi zadowolenie klientów, współpracowników i innych osób korzystających z łącza przez nas administrowanego. Często jest zaniedbywane przez lokalnych operatorów, więc jakość ich łączy jest znacznie niższa niż można by tego oczekiwać. Najczęściej operator wciąż dokupuje pasmo, nie zdając sobie sprawy, że mógłby - dysponując połową aktualnego łącza - oferować większą jakość usług. Oszczędzałby przy tym pieniądze, a niejednokrotnie nerwy.
Zarządzanie transmisją danych polega na racjonalnym przydziale części pasma poszczególnym użytkownikom sieci oraz kontrolowaniu wszelkich zjawisk, mogących zachwiać stabilnością pracy sieci. Idąc dalej, należy uznać, że każde działanie, zmierzające do zapewnienia płynnej i zgodnej z oczekiwaniami użytkowników pracy sieci, jest właśnie zarządzaniem transmisją.
W tym artykule ograniczymy się do metod podziału pasma, monitoringu, blokowania transmisji oraz zajmiemy się problemem kształtowania ruchu wyjściowego w sieciach wykorzystujących translację adresów. Powinien on zainteresować osoby zajmujące się utrzymaniem pracy sieci w firmach, także tych niewielkich, prowadzących działalność gospodarczą w zakresie utrzymania i dostarczania Internetu klientom indywidualnym (ISP). Opisane w artykule rozwiązania są z powodzeniem stosowane w wielu sieciach kablowych oraz bezprzewodowych. Nie ma w tym wypadku znaczenia warstwa fizyczna transmisji. Wykorzystuje się bardziej lub mniej standardowe mechanizmy systemu Linux. Zakładamy, że czytelnik zna ten system w podstawowym zakresie i jest w stanie sam rozwiązać proste problemy.
Założenia architektury sieci
Aby przedstawić sposoby zarządzania pasmem, przyjmijmy prostą architekturę pokazaną na rysunku w punkcie 1. Jest to serwer LINUX z 2 kartami sieciowymi - z jednej strony jest łącze szerokopasmowe (np. DSL, Neostrada, POLPAK-T itp.), z drugiej - komputery klientów, z którymi podpisano umowę o dostępie do Internetu z przepustowością np. 64 kb/s. Wykorzystywany jest mechanizm NAT. Wstępne proste działanie 512/64 = 8 pokazuje, że podłączenie 8 klientów do łącza 512 kb/s całkowicie sparaliżuje sieć. Nic bardziej mylnego.Trzeba odróżnić przepustowość gwarantowaną (tzw. CIR) oraz przepustowość maksymalną. Dla użytkownika sieci jest to praktycznie to samo, pod warunkiem, że nie dochodzi do przeciążenia pasma (czyli wykorzystania w tym układzie 512 kb/s). Stosowanie CIR jest jednak niezalecane, ponieważ użytkownik, nawet gdy nie używa sieci, ma wydzielone pasmo, z którego nikt inny nie może skorzystać. Z doświadczeń autora wynika, że przy przepustowości 512 kb/s i pasmach klientów ok. 64 kb/s z powodzeniem może pracować nawet 35 osób - oczywiście nie takich, dla których dostęp do Internetu jest równoznaczny z pobieraniem filmów, ale tych, korzystających z www i poczty elektronicznej. Gdy jednak 8 osób zacznie pobierać filmy, wykorzystując swoje 64 kb/s, wtedy trzeba pomyśleć o dokupieniu pasma od operatora.
Załóżmy, że nasza sieć ma następujące numery IP:
10.10.1.1 - bramka serwera - komputer naszego operatora nadrzędnego
10.10.1.2 - adres naszego serwera od strony sieci operatora
192.168.0.1 - adres naszego serwera od strony sieci lokalnej
192.168.0.10 do 192.168.0.20 - komputery naszych klientów.
Ustawienie maskarady z wykorzystaniem iptables wykonujemy następująco:
iptables -t nat -A POSTROUTING -s 192.168.0.10 -j SNAT -to 10.10.1.2
iptables -t nat -A POSTROUTING -s 192.168.0.11 -j SNAT -to 10.10.1.2
itd.
Należy pamiętać także o włączeniu przekazywania pakietów pomiędzy interfejsami przez jądro Linuksa przez wpisanie "1" do pliku /proc/sys/net/ip_forward poleceniem:
echo "1" >/proc/sys/net/ipv4/ip_forward
Taki stan systemu powinniśmy uzyskać niezależnie od konfiguracji czy dystrybucji (oczywiście przy zainstalowanym pakiecie iptables).
Pobranie pakietów zftp://ftp.cik.pl/imqhtb - wszystkie patche
- Przekopiowanie do /usr/src wszystkich źródeł.
- Zakładamy, że mamy jądro 2.4.25 w /usr/src/linux.
- Zakładamy, że mamy w katalogach /usr/src/iproute2 oraz /usr/src/iptables najnowsze wersje tych pakietów w formie źródeł
- Przenoszenie htb3.6_tc.diff do /usr/src/iproute2.
- Przenoszenie iptables_imq.diff dp /usr/src/iptables.
- Przenoszenie pom-imq.diff do /usr/src/patchomatic.
- cd usr/src/iptables
patch -p1 <iptables-1.2.7a-imq.diff
otrzymujemy:
patching file extensions/.IMQ-test
patching file extensions/.IMQ-test6
patching file extensions/libip6t_IMQ.c
patching file extensions/libipt_IMQ.c.
- chmod a+x extensions/.IMQ-test
chmod a+x extensions/.IMQ-test6.
- Kompilacja iptabels
make
make install - instalacja.
- Przygotowanie jądra
wchodzimy na stronęhttp://www.ibnet.pl/cgi/index.en.html?page=/resources/software/kernel-patches/body.en.html i pobieramy patch dla naszej wersji jądra (przećwiczone dla wersji ib3 2.4.25) w katalogu /usr/src/linux mamy najnowszą, "czystą" wersję jądra.
Kopiujemy patch pobrany ze strony do /usr/src/linux
cd /usr/src/linux
gzip -cd linux-2.4.XX+ibN.patch.gz | patch -p1
rm -f linux-2.4.XX+ibN.patch.gz.
- Kompilacja jądra
może wymagać w Debianie dodania pakietu db3-berkley-database oraz ncurses-dev (w dselect).
Zakładamy w tym miejscu znajomość tej procedury u czytelnika. Dla niewtajemniczonych polecamy Kernel-HOWTO.
make menuconfig
make dep
make bzImage
make modules
make modules_install
instalacja jądra (lilo, grub).
- Reboot i uruchomienie z nową wersją jądra.
- Przechodzimy do katalogu /usr/src/iproute2
cd /usr/src/iproute2.
- Patchujemy iproute2 do HTB
patch -p1 <htb3.6_tc.diff
Powinniśmy dostać:
patching file tc/q_htb.c
patching file tc/Makefile
Hunk #1 succeeded at 25 (offset 4 lines).
- Kompilacja iproute2
make
otrzymujemy:
gcc -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g
-I../include-glibc -I/usr/include/db3 -include
../include-glibc/glibc-bugs.h -I/usr/src/linux/include
-I../include -DRESOLVE_HOSTNAMES -o rtstat rtstat.o
make[1]: Leaving directory `/usr/src/iproute2/misc'.
- Instalujemy iproute2
make install
W ten sposób otrzymujemy system, w którym możemy zastosować opisane wcześniej mechanizmy.