Linux zarządzanie pasmem transmisji danych

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

Założenia architektury sieci

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).

Pierwszy etap

Pobranie pakietów zftp://ftp.cik.pl/imqhtb - wszystkie patche

  1. Przekopiowanie do /usr/src wszystkich źródeł.
  2. Zakładamy, że mamy jądro 2.4.25 w /usr/src/linux.
  3. Zakładamy, że mamy w katalogach /usr/src/iproute2 oraz /usr/src/iptables najnowsze wersje tych pakietów w formie źródeł
  4. Przenoszenie htb3.6_tc.diff do /usr/src/iproute2.
  5. Przenoszenie iptables_imq.diff dp /usr/src/iptables.
  6. Przenoszenie pom-imq.diff do /usr/src/patchomatic.
  7. 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.

  8. chmod a+x extensions/.IMQ-test

    chmod a+x extensions/.IMQ-test6.

  9. Kompilacja iptabels

    make

    make install - instalacja.

  10. 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.

  11. 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).

  12. Reboot i uruchomienie z nową wersją jądra.
  13. Przechodzimy do katalogu /usr/src/iproute2

    cd /usr/src/iproute2.

  14. 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).

  15. 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'.

  16. Instalujemy iproute2

    make install

W ten sposób otrzymujemy system, w którym możemy zastosować opisane wcześniej mechanizmy.