Laboratorium 3. SNMP wersja 1 Celem laboratorium jest zapoznanie studenta z protokołem SNMP w wersji pierwszej oraz z narzędziami wykorzystującymi ten protokół. 1. Protokół SNMP Wiele informacji dotyczących protokołu SNMP zostało przedstawione na poprzednich laboratoriach, dlatego nie będziemy do nich wracać. Możliwe operacje wykonywane na wartościach skalarnych: Get pobranie wartości obiektu poprzez żądanie stacji zarządzającej; Set ustawienie wartości obiektu poprzez żądanie stacji zarządzającej; Trap wysłanie wartości obiektu do stacji zarządzającej przez agenta. Dostępne obiekty, którymi można zarządzać są wartościami skalarnymi. Uwierzytelnianie w protokole jest bardzo proste i sprowadza się do podania nazwy społeczności (eng. community name), nazwa ta nie jest szyfrowana, więc nie zapewnia ona dużego bezpieczeństwa. Z tego względu wielu producentów urządzeń sieciowych oferuje jedynie usługi monitorowania (operacje Get i Trap), blokując możliwość zmieniania wartości (operacją Set). Przy dostępie do obiektów ważna jest znajomość porządku leksykograficznego obiektów. W uproszczeniu jest to porządek, który zachowujemy, jeśli poruszamy się po drzewie baz MIB w następujący sposób, zaczynając od lewej strony drzewa schodzimy, aż do osiągnięcia liścia. Następnie możemy wejść z powrotem do tego poziomu, który posiada ścieżkę, którą nie szliśmy i znowu idziemy aż do liścia. W ten sposób z czasem dojdziemy do końca drzewa. Poniżej przedstawiam rysunek drzewa z zaznaczonym porządkiem leksykograficznym obiektów. 1 2 3 1.1 1.2 2.1 3.1 3.2 1.2.1 2.1.1 2.1.1.1 Rys. 1. Drzewo bazy MIB z zaznaczoną kolejnością przeszukiwania obiektów Przykładowa kolejność obiektów: 1, 1.1, 1.2, 1.2.1, 2, 2.1, 2.1.1, 2.1.1.1, 2.1.1.2, 3, 3.1, 3.2, można rozrysować to drzewo, aby sprawdzić poprawność powyższej kolejności. Pełną specyfikację protokołu i towarzyszących mu komunikatów można znaleźć w książce Stallings'a oraz w źródłach internetowych, najdokładniejsze w RFC1157. Komunikat zawiera jednostkę danych protokołu (PDU protocol data unit).
Proces wysyłania komunikatu można podzielić na następujące części: tworzenie poprawnego PDU, etap uwierzytelniania (często pomijany), tworzenie komunikatu (numer wersji protokołu, nazwa społeczności, PDU po uwierzytelnieniu), kodowanie powstałego komunikatu przy użyciu BER i przekazanie go do usługi transportowej. Proces odbioru komunikatu: wstępne sprawdzenie poprawności składniowej, weryfikacja numeru wersji, uwierzytelnienie (nazwa społeczności, adresy źródłowe i docelowe), sprawdzenie poprawności PDU i przetworzenie jej. 2. Żądania Komunikaty mogą zawierać więcej niż jedno żądanie, zostało to umożliwione w celu zmniejszenia liczby komunikatów. Taki komunikat może tworzyć ciąg żądań różnego typu, na przykład operacja Get i Set. Żądania typu Get i Set muszą zawierać odwołanie do poprawnego obiektu w drzewie baz MIB, jeśli zawierają niepoprawny obiekt (w tym także niedostępny lub, dla operacji Set, obiekt tylko do odczytu) zwrócona zostanie odpowiedź z kodem błędu równym nosuchname. Jeśli w jednym komunikacie umieściliśmy kilka żądań, a jedno z nich było niepoprawne, to również otrzymamy odpowiedź, nie zawierającą żadnej odpowiedzi, z kodem błędu nosuchname. Operacja GetNext nie musi zawierać odwołania do poprawnego obiektu, gdyż jej zadaniem jest zwrócić następny (zgodnie z porządkiem leksykograficznym) poprawny(dostępny do odczytu) obiekt. Jeśli nie znamy odwołania na kolejny obiekt, możemy wykorzystać operację GetNext. Operacja ta bardzo często wykorzystywana jest przy odczytywaniu wartości zapisanych w tablicach. Operacja Set na tablicach może zachowywać się różnie, w zależności od intencji. Jeśli chcemy dodać nowy wiersz agent może: odrzucić operację status błędu równy nosuchname ; stworzy nowy wiersz, ale ze względu na błąd składniowy jednego z obiektów odrzuci żądanie status błędu badvalue ; utworzyć nowy wiersz i zatwierdzić operację. Jeśli chcemy zaktualizować pola niebędące indeksem, agent powinien przyjąć żądanie, natomiast w przypadku próby aktualizacji pola będącego indeksem zachowanie agenta nie jest określone. Istnieje również możliwość usunięcia wiersza z tablicy, jednak w tym celu muszą być spełnione dodatkowe warunki, takie jak, tablica już na etapie projektowym przewidywała taką możliwość i zostało to zapisane w jej strukturze. Poniższa tablica prezentuje takie tabele z bazy MIB-II: tablica obiekt wartość interfaces.iftable ifadminstatus down(2) ip.iproutetable iproutetype invalid(2) ip.ipnettomediatable ipnettomediatype invalid(2) tcp.tcpconntable tcpconnstate delete(12)
tablica obiekt wartość egp.egpneightable egpneigheventtrigger stop(2) Tabela 1.Tabele z bazy MIB-2, które umożliwiają usuwanie wierszy 3. Pułapka (eng. Trap) Pułapka jest wysyłana przez agenta do stacji zarządzającej, służy ona do informowania stacji zarządzającej o zmianie wartości jakiegoś obiektu. Struktura przesyłanego komunikatu jest trochę inna niż pozostałych komunikatów, ważnymi polami są: generic-trap określa jeden z predefiniowanych typów, specific-trap określa dokładny typ pułapki, wykorzystywany jest tylko w specyficznym przypadku, który omówiony jest troszkę niżej. Możliwe wartości pola generic-trap: coldstart(0) ponowny start po niespodziewanym zatrzymaniu, może oznaczać zmianę konfiguracji agenta; warmstart(1) normalne ponowne uruchomienie urządzenia i agenta; linkdown(2) informuje o uszkodzeniu jednego z łączy, zaznacza które łącze zostało uszkodzone (obiekt IfIndex); linkup(3) informuje o uruchomieniu łącza, również określa które łącze (obiekt IfIndex); authenticationfailure(4) otrzymano komunikat, który nie przeszedł testu uwierzytelnienia; egpneighborloss(5) informuje, że sąsiad EGP został wyłączony i nie istnieje z nią żadne powiązanie; enterprisespecific(6) określa, że wystąpiło niestandardowe zdarzenie, określone lokalnie, dokładny typ pułapki określony jest w polu specific-trap; Specyfikacja bazy mib-2 znajduje się w dodatku. 4. Przebieg laboratorium Należy uruchomić komputer z systemem operacyjnym Linux. Po uruchomieniu systemu należy uruchomić usługę snmpd. Dokonaj analizy następujących przykładów. I. Przykłady Zapoznajcie się z aplikacjami (przejrzyjcie ich składnię i pomoc man): snmpget snmpgetnext snmpset Przykłady poleceń:
snmpget -v 1 -c public 127.0.0.1 1.3.6.1.2.1.1.1.0 snmpget -v 1 -c public 127.0.0.1 sysdescr.0 snmpgetnext -v 1 -c public 127.0.0.1 1 snmpset -v 1 -c private 127.0.0.1 sysdescr.0 s Linux niestety polecenie to wygeneruje błąd; snmpset -v 1 -c private 127.0.0.1 iproutemetric1.0.0.0.0 i 2 Przejrzyjcie również informacje o aplikacji: snmpwalk i uruchomcie ją w systemie (lokalnie). II. Zadanie Wykorzystując zdobytą wiedzę, wykonaj następujące polecenia (tym razem agentem jest ruter cisco, którego adres poda prowadzący): pobierz informacje o systemie (description), pobierz tablice tras (jednym poleceniem cały wiersz), pobierz tablice aktywnych połączeń (jednym poleceniem cały wiersz), ustaw jakąś wartość dowolnie wybranego obiektu (komenda powinna zwrócić poprawną wartość) wykorzystać komendę snmpwalk i przejrzeć wynik jej działania Wyniki wszystkich zadań (oprócz ostatniego) należy przesłać prowadzącemu na skrzynkę poczty elektronicznej. 5. Literatura William Stallings, Protokoły SNMP i ROM. Vademecum profesjonalisty, dokumentacja programów snmp*. Struktura mib-2 dla wersji SNMPv1 system (mib- 2 1) sysdescr ( 1) sysobjectid (2) sysuptime (3) syscontact (4) sysname (5) syslocation (6) sysservices(7) interfaces (mib-2 2) ifnumber (1) iftable(2) - NA ifentry (1) - NA ifindex (1) <- ifdescr (2) iftype (3) ifmtu (4) ifspeed (5) ifphysaddress (6) ifadminstatus (7) - RW ifoperstatus (8) iflastchange (9) ifinoctets (10) ifinucastpkts (11)
ifinnucastpkts (12) ifindiscards (13) ifinerrors (14) ifinunknownprotos (15) ifoutoctets (16) ifoutucastpkts (17) ifoutnucastpkts (18) ifoutdiscards (19) ifouterrors (20) ifoutqlen (21) ifspecific (22) at (mib- 2 3) grupa translacji adresów attable (1) atentry (1) atifindex (1) RW <- atphysaddress (2) RW atnetaddress (3) RW <- ip (mib-2 4) ipforwardung (1) ipdefaultttl (2) ipinreceives (3) ipinhdrerrors (4) ipinaddrerrors (5) ipforwdatagrams (6) ipinunknownprotos (7) ipindiscards (8) ipindelivers (9) ipoutrequests (10) ipoutdiscards (11) ipoutnoroutes (12) ipreasmtimeout (13) ipreasmreqds (14) ipreasmoks (15) ipreasmfails (16) ipfragoks (17) ipfragfails (18) ipfragcreates (19) ipaddrtable (20) - NA ipaddrentry (1) - NA ipadentaddr (1) ipadentifindex (2) <- ipadentnetmask (3) ipadentbcastaddr (4) ipadentreasmmaxsize (5) iproutetable (21) - NA iprouteentry (1) NA iproutedest (1) RW <- iprouteifindex (2) RW iproutemetric1 (3) RW iproutemetric2 (4) RW iproutemetric3 (5) RW iproutemetric4 (6) RW iproutenexthop (7) RW iproutetype (8) RW iprouteproto (9) RW iprouteage (10) RW iproutemask (11) RW iproutemetric5 (12) RW iprouteinfo (13) ipnettomediatable (22) NA ipnettomediaentry (1) NA ipnettomediaifindex (1) RW <- ipnettomediaphysaddress(2) RW ipnettomedianetaddress (3) RW <-
ipnettomediatype (4) RW iproutingdiscards (23) ipforward (24) ipforwardnumber (1) ipforwardtable (2) NA ipforwardentry (1) NA ipforwarddest (1) <- ipforwardmask (2) ipforwardpolicy (3) <- ipforwardnexthop (4) <- ipforwardifindex (5) ipforwardtype (6) ipforwardproto (7) <- ipforwardage (8) ipforwardinfo (9) ipforwardnexthopas(10) ipforwardmetric1 (11) ipforwardmetric2 (12) ipforwardmetric3 (13) ipforwardmetric4 (14) ipforwardmetric5 (15) icmp (mib-2 5) icmpinmsgs (1) icmpinerrors (2) icmpindestunreachs (3) icmpintimeexcds (4) icmpinparmprobs (5) icmpinsrcquenchs (6) icmpinredirects (7) icmpinechos (8) icmpinechorers (9) icmpintimestamps (10) icmpintimestampreps (11) icmpinaddrmasks (12) icmpinaddrmaskreps (13) icmpoutmsgs (14) icmpouterrors (15) icmpoutdestunreachs (16) icmpouttimeexcds (17) icmpoutparmprobs (18) icmpoutsrcquenchs (19) icmpoutredirects (20) icmpoutechos (21) icmpoutechorers (22) icmpouttimestamps (23) icmpouttimestampreps (24) icmpoutaddrmasks (25) icmpoutaddrmaskreps (26) tcp (mib-2 6) tcprtoalgorithm (1) tcpttomin (2) tcprtomax (3) tcpmaxconn (4) tcp ActiveOpens (5) tcppassiveopens (6) tcpattemptfails (7) tcpestabresets (8) tcpcurrestab (9) tcpinsegs (10) tcpoutsegs (11) tcpretranssegs (12) tcpconntable (13) NA tcpconnentry (1) NA tcpconnstate (1) RW
tcpconnlocaladdress (2) <- tcpconnlocalport (3) <- tcpconnremaddress (4) <- tcpconnremport (5) <- tcpinerrors (14) rcpoutrsts (15) udp (mib-2 7) udpindatagrams (1) udpnoports (2) udpinerrors (3) udpoutdatagrams (4) udptable (5) NA udpentry (1) NA udplocaladdress (1) <- udplocalport (2) <- egp (mib-2 8) egpinmsgs (1) egpinerrors (2) egpoutmsgs (3) egpouterrors (4) egpneightable (1) NA egpneighrntry (1) NA egpneighstate (1) egpneighaddr (2) <- egpneighas (3) egpneighinmsgs (4) egpneighinerrs (5) egpneighoutmsgs (6) egpneighouterrs (7) egpneighinerrmsgs (8) egpneighouterrmsgs (9) egpneighstateups (10) egpneighstatedowns (11) egpneighintervalhello (12) egpneighintervalpoll (13) egpneighmode (14) egpneigheventtrigger (15) egpas (6)