Monitorowanie ruchu w sieci za pomocą protokołu SNMP.

Wprowadzenie

Dobry administrator powinien mieć komplet informacji nie tylko o swoim serwerze, ale też o otaczającej go sieci. Monitorowanie ruchu wchodzącego i wychodzącego z naszego serwera pozwala określać i zapobiegać kłopotom związanym z nadmiernym obciążeniem łącz, optymalizować wielkość łącza w stosunku do potrzeb oraz określać nasze potrzeby na przyszłość. Możemy też weryfikować informacje naszego dostawcy internetu o generowanym przez nas obciążeniu.

Właśnie do tego celu może być użyty protokół SNMP (Simple Network Management Protocol). Doskonale sprawdza się on nie tylko w przypadku zarządzania wielkimi sieciami, ale i do zbierania informacji statystycznych w małych sieciach (lub nawet na pojedynczych interfejsach sieciowych). Istnieje wiele darmowych narzędzi umożliwiających nam korzystanie z dobrodziejstw SNMP.

Dlatego też niniejszy referat ma na celu opisanie sposobu monitorowania obciążenia sieci za pomocą oprogramowania Open Source bazującego na protokole SNMP. Przedstawia on nie tylko sam protokół, ale też aplikacje na nim bazujące, ich instalację i konfigurację. Wszelkie aplikacje opisywane poniżej testowane były dla Linuxa Slackware 7.1 z jądrem 2.2.18 oraz RedHat 7.0.

SNMP - trochę teorii

SNMP (Simple Network Management Protocol) jest obecnie najczęściej stosowanym protokołem komunikacyjnym używanym do zarządzania sieciami komputerowymi. Powstał on w 1989 r. z inicjatywy organizacji Internet Activities Board, a jego protoplastą był prosty protokół SGMP.

Dzięki wielu zaletom (takim jak: łatwość implementacji, dostępność wielu aplikacji opartych na tym protokole i niewielkie wymagania odnośnie sprzętu i przepustowości łączy sprzęgających zarządzane węzły sieci) protpkół zyskał szerokie poparcie, zdecydowanie wygrywając rywalizację z protokołem CMIP (Common Management Information Protocol). Nie ma on obecnie na rynku poważnego rywala.

SNMP używa do przesyłania pakietów w sieci Internet dwóch protokołów komunikacyjnych wchodzących w skład TCP/IP: protokołu IP (Internet Protocol; warstwa sieci w modelu OSI) oraz UDP (User Datagram Protocol); warstwa transportu w modelu OSI). Szczegółowy opis protokołu SNMP zawarty jest w RFC 1157.

Integralną częścią systemu zarządzania opartego na protokole SNMP jest zawsze menedżer zarządzania (aplikacja zarządzająca siecią, rezydująca w pamięci komputera pełniącego rolę zarządcy) oraz bazy danych MIB i agenci instalowani w poszczególnych węzłach sieci.

Rys. 1. Architektura SNMP.

Zarówno stacja zarządzająca jak i zarządzane węzły sieci są wyposażone w interfejsy SNMP. Mówiąc najprościej, interfejs jest zbiorem poleceń wysyłanych do zarządzanej stacji (celem uzyskania przez stację zarządzającą interesujących ją informacji). Stacja zarządzana z kolei wysyła w pewien uporządkowany sposób te informacje do stacji zarządzającej. Czyli jest to swego rodzaju prosty język, za pomocą którego zainstalowane w sieci węzły i urządzenia porozumiewają się z pakietem SNMP.

Rys. 2. Przesyłanie poleceń SNMP.

W praktyce cały interfejs SNMP ogranicza się do prostego zestawu poleceń, które monitorują pracę urządzeń w sieci. Urządzenia wysyłają do konsoli zarządzania dane (zwane też obiektami bazy danych MIB), pozwalające administratorowi systemu sprawować kontrolę nad stacją. W bazie danych MIB (Management Information Base) rezydującej u boku agenta każdej stacji znajdują się informacje o pracy tego urządzenia. Są to dane statystyczne, identyfikatory urządzeń, tablice marszrut i szereg innych zmiennych, które są okresowo aktualizowane przez agenta i wysyłane do stacji zarządzającej. Informacje te pozwalają stacji zarządzającej sprawdzać stan węzła, śledzić poziom obciążenia sieci pakietami czy wykrywać awarie poszczególnych odcinków sieci. Budowa standardowej bazy danych MIB jest opisana w RFC 1213.

Zalety SNMP:

  • stosunkowo małe obciążenie sieci pakietami (wykorzystanie UDP),
  • instalowane w węzłach programy zajmują mało miejsca w pamięci,
  • protokół pozwala kontrolować liczbę generowanych przez stację zarządzania powtórzeń żądań obsługi oraz czas oczekiwania na odpowiedzi urządzeń,
  • możliwość wychwytywania konkretnych zdarzeń (informacje typu trap),
  • powszechna dostępność aplikacji opartych na protokole SNMP.
  • SNMPD - Demon SNMP

    Takie serwisy jak freshmeat.net oferują nam do wyboru wiele różnych aplikacji. Ja zdecydowałem się na użycie CMU-SNMP. Jest to przyjazny w instalacji i konfiguracji demon SNMP, posiadający wersję przeznaczoną dla systemu operacyjnego Linux. Produkt nie jest udostępniany na licencji GPL, ale jego licencja kwalifikuje go do grupy programów Open Source (free for use, copy, modify and distribute).
    Strona domowa projektu: http://www.gaertner.de/snmp/
    kod źródłowy do pobrania: ftp://ftp.ibr.cs.tu-bs.de/pub/local/linux-cmu-snmp/

    instalacja

    1. rozpakowanie archiwum:
      tar xvzf ./cmu-snmp-linux-3.7-src.tar.gz
      cd cmu-snmp-linux-3.7
    2. kompilacja
      ./configure; make
    3. jako root:
      make install
    4. tworzenie pliku konfiguracyjnego
      cd ./etc
      ./installconf -mini <password>
    5. uruchamianie demona w tle:
      /usr/sbin/snmpd -f ; echo 'started snmpd'

    Ostatnią linię polecam umieścić w skryptach startowych serwera. Jeszcze tylko ewentualna edycja pliku /etc/snmpd.conf i już mamy działającego demona SNMP.

    MRTG - wizualizacja danych

    MRTG (Multi Router Traffic Grapher) jest to całkowicie napisany w perlu zestaw narzędzi do monitorowania sieci. Program generuje raport w postaci stron HTML zawierających grafiki GIF/PNG.

    Strona domowa projektu: http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/
    kod źródłowy do pobrania: http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/pub/mrtg-2.9.10.tar.gz
    licencja: GNU General Public License (GPL)

    potrzebne biblioteki

    Aby poprawnie skompilować MRTG potrzebujemy następujących bibliotek:

  • gd http://www.boutell.com/gd/
  • libpng http://www.libpng.org/pub/png/
  • zlib http://www.info-zip.org/pub/infozip/zlib/
  • instalacja libpng

    Libpng potrzebuje działającej biblioteki zlib, ale w większości dystrybucji jest ona standardowo instalowana (lub doinstalowywana przy instalacji pakietu openssh).

    1. rozpakowanie archiwum:
      tar xvzf ./libpng-1.0.10.tar.gz
      cd libpng-1.0.10
    2. wybranie odpowiedniego pliku makefile
      cp scripts/makefile.linux makefile
    3. kompilacja
      ./configure; make
    4. jako root:
      make install

    instalacja gd

    1. rozpakowanie archiwum:
      tar xvzf ./gd-1.8.4.tar.gz
      cd gd-1.8.4
    2. kompilacja
      make
    3. jako root:
      make install

    instalacja MRTG

    1. rozpakowanie archiwum:
      tar xvzf ./mrtg-2.9.10.tar.gz
      cd mrtg-2.9.10
    2. kompilacja
      ./configure --prefix=/usr/local/mrtg-2 \
      --with-gd=/usr/local/src/gd \
      --with-z=/usr/local/src/zlib \
      --with-png=/usr/local/src/libpng
      make
    3. jako root:
      make install

    tworzenie plików konfiguracyjnych

    Przechodzimy do miejsca, gdzie jest zainstalowane MRTG cd /usr/local/mrtg-2. W katalogu bin mamy plik mrtg uruchamiający analizę oraz plik cfgmaker do tworzenia plików konfiguracyjnych.
    Uruchamiamy cfgmaker:
    cfgmaker --global 'WorkDir: /sciezka/do/katalogu/wynikowego' \
    --global 'Options[_]: bits,growright' \
    --output /home/mrtg/cfg/mrtg_nasz_host.cfg \
    --ifref=ip xxx.xxx.xxx.xxx


    gdzie xxx.xxx.xxx.xxx to ip naszego hosta (z działającym snmpd), a WorkDir to ścieżka do katalogu wynikowego (najlepiej gdzieś w drzewie katalogów demona httpd, abyśmy mogli od razu oglądać wynik za pomocą przeglądarki).

    Kolejny krok to edycja pliku wynikowego (tu: mrtg_nasz_host.cfg). Zmienną language proponuję ustawić na polish (tak - MRTG jest w polskiej wersji !). Należy też uwzględnić, że MRTG podaje wynik w kilobajtach, a nie w kilobitach. Dlatego też maksymalną przepustowość sieci musimy podać w kilobajtach (np. jeśli mamy sieć 2 Mbps to dzielimy przepustowość przez 8, jako MaxBytes podajemy więc wartość 250000.

    Jeśli chcemy monitorowac więcej niż jeden interfejs to dla każdego tworzymy oddzielny plik konfiguracyjny. Analizę uruchamiamy poleceniem
    /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/gdziechcemy/plik_konfiguracyjny.cfg.
    Proponuję umieszczenie tego polecenia w crontabie. Jeśli monitorujemy wiele interfejsów to polecam utworzenie skryptu shelowego uruchamiającego mrtg dla poszczególnych plików konfiguracyjnych i dopiero jego wpisać do crontab. Warto też utworzyć plik index.html zawierający linki do poszczególnych podstron.

    Przykładowy wynik działania MRTG znajduje się w załączniku 1

    Podsumowanie

    Mam nadzieję że udało mi się zachęcić Państwa do skorzystania z dobrodziejstw protokołu SNMP. Oczywiście nie musimy ograniczać się do monitorowania naszego serwera pocztowego. Jeśli jesteśmy połączeni do sieci poprzez ruter, np. CISCO to wystarczy dodać do jego konfiguracji linię:
    snmp-server host [IP] [klucz] snmp
    i już możemy włączyć go do obsługiwanych przez MRTG urządzeń.
    A wszystkie osoby programujące w Perl'u zainteresuje na pewno moduł SNMP.pm, pozwalający w prosty sposób tworzyć skomplikowane programy bazujące na protokole SNMP.
    Możliwości wykorzystania SNMP jest wiele - dlatego zachęcam gorąco do eksperymentowania na własną rękę.

    Bibliografia

  • Vademecum teleinformatyka; praca zbiorowa; wydanie zebrane, uzupełnione i poprawione, Warszawa 1999; Wydawca: IDG Poland SA; Opracowanie redakcyjne: NetWorld
  • RFC 1157
  • RFC 1213