W sieciach komputerowych spotkamy się z kilkoma miarami prędkości przesyłania danych:
– bandwidth
– throughput
– goodput
1. bandwidth
Jest to określenie na fizyczną, teoretyczną i maksymalną przepustowość danego medium czy kanału. Można też użyć pojęcia pojemność. Jeśli mowa o kanale to trzeba pamiętać, że składa się z wielu elementów takich jak urządzenia, złącza, media transmisyjne, zakłócenia, oprogramowanie itp. Jest to zatem teoretyczna i „fabryczna” pojemność w idealnych warunkach bez zakłóceń. Coś jak rura rura wodociągu, którą o danej średnicy. Jeśli 1m długości rury mieści 1m3 wody to to jest jej pojemność. Ile tak naprawdę wody można „przepchnąć” przez tą rurę zależy od wielu czynników np. od wydajności źródła (pompy), zaworów leżących na drodze itp. Jedno jest pewne: rura (jak i łącze IT) ma określoną maksymalną pojemność (przepustowość). Jeśli rurą (z pewnych fizycznych powodów) można przepychać wodę z prędkością 1mb/s to większej prędkości nie osiągniemy. W świeci sieci LAN Ethernet mamy wiele standardów połączeń. Jednym z nich jest Ethernet 1Gbps, ful duplex. Podobnie jak w rurze z wodą, mamy tu wiele czynników wpływających na maksymalną przepustowość:
– zakłócenia
– szumy
– szybkość elektroniki
– szybkość rozchodzenia się sygnału elektrycznego w danym nośniku (np. 250 000 km/s)
– narzut samej technologii połączenia
Ten ostatni punkt zawiera w sobie narzut różnych protokołów sygnalizacyjnych działających na poziomie elektroniki w danym łączu. Przykładem może być autonegocjacja, ramki PASUE, odstępy międzyramkowe i inna sygnalizacja. Jest o minimalny ruch ale zawsze coś.
Jeśli dana technologia oferuje nam 1Gbps to nie uzyskamy szybszego transferu. Co gorsza, ta prędkość jest prędkością netto ponieważ danych nie transmitujemy w sieci LAN/WLAN i innych ot tak sobie tylko za pomocą protokołów. Protokołu posiadają pewne dane administracyjne (np. nagłówki) co, przy stałej pojemności łącza, daje na mniej miejsca na nasze dane!
Pojęcie bandwidth czasem jest także określane w Hz a nie w bitach/sek. Przykładem jest Ethernet bandwidth o wielkości 125 MHz. Tu pojawia się kwestia kodowania sygnału więc 125 MHz != 125 Mbps. Ale o tym raczej mówimy na telekomunikacji.
To jeszcze nie wszystko. Może się okazać, że natywna przepustowość jest mniejsza niż podaje „producent” ponieważ jej część zawsze jest konsumowana na sprawy organizacyjne samej technologii. Generalnie kiedy mamy informację, że to łącze daje nam przepustowość 1Gbps, to do dyspozycji będziemy mieć nieco mniej. Producenci często podają parametry okablowania. Tutaj inny opis.
2. throughput
Jest to realna prędkość jaką uzyskamy w danym łączu czy kanale. Jest ona zazwyczaj mierzona eksperymentalnie i mocno zależy od wielu czynników takich jak obciążenie procesora/układu generującego ruch. Jest zawsze mniejsza od przepustowości kanału.
Poniżej widok ramki Ethernet – ona jako pierwsza wprowadza narzut w postaci miejsca na preambułę, pola adresów, typu, CRC i inne.
3. goodput
To określenie na maksymalną prędkość transferu naszych danych roboczych. Wpływa na nią narzut administracyjny protokołów komunikacyjnych oraz proces enkapsulacji. Każdy protokół do porcji przenoszonych danych dodaje nagłówek, co ogranicza możliwą do przesłania ilość danych roboczych.
Cały proces można czytelnie pokazać na bazie enkapasulacji. Ramka daje nam 1500 bajtów ale odpada pole Typ/Długość dwa bajty czyli zostaje 1498. Z tego (przy protokole IPv4) odpada 20 bajtów nagłówka IP i kolejno, jeśli używamy UDP, 8 bajtów jego nagłówka. Zatem mamy do dyspozycja w każdej ramce: 1500-2-20-8 = 1470 bajtów. Teraz jeszcze nagłówek ramki Ethernet.
Przykład testu prędkości transferu danych PC – RouterBoard RB49G na łączu 1 Gbps
Z niewiadomych przyczyn mamy około 36% oferowanej przez połączenie prędkości.
4. latency
Jest to opóźnienie na trasie całego kanału wynikające z wielu czynników np. zwłoki w przetwarzaniu danych (sygnału) w układach elektronicznych. Zwłoka może jest i minimalna ale jest. Kiedy na drodze naszych danych leży wiele urządzeń, każde dodaje małą zwłokę. Zwłoka może tez wynikać z obciążenia procesorów, które realizują także inne zadania (choć to zależy od urządzenia, jego przeznaczenia, oprogramowani itp)
Pomiary prędkości
Przepustowość łącza możemy badać na wiele różnych sposobów:
– programem
– sprzętem
– protokołem TCP lub UDP
– w jedną stronę lub w obie jednocześnie
– generując określoną ilość pakietów na sekundę o podanej wielkości
Podstawowe opcje testowania:
a. Protokół
Jeśli użyjemy protokołu UDP otrzymamy znacznie mniejszy narzut administracyjny niż przy protokole TCP co przełoży się na większą ilość danych użytkowych jakie możemy przesłać w jednostce czasu.
b. Kierunek
Testować przepustowości możemy generując ruch w jedną stronę lub w obie jednocześnie. Wprawdzie nasze łącza są zazwyczaj typu full-duplex ale test w obei strony jednocześnie zawsze mocniej obciąża urządzenia jak i media.
c. Generowanie pojedynczych pakietów
Posiadając generator pakietów możemy wygenerować strumień pewnej ilość pakietów na sekundę (pps) a każdy o wybranej wielkości, co pozwala także wygenerować pewien ruch wynikający z iloczynu pps*rozmiar pakietu
Przykładowe programy
1. Tester przepustowości iperf
a. ipef
Program konsolowy dostępny jest dla różnych platform w postaci instalatora lub źródeł. Dla systemu Windows pobieramy spakowane archiwum i wypakujemy z niego katalog z gotowym programem. W systemie Linux można go pobrać z repozytoriów i zainstalować:
# apt install iperf
Uwaga: podczas testu należy po obu stronach połączenia zastosować tą samą wersję. Jeśli użyjemy innych połączenie nie zostanie nawiązane.
Program może pracować w trybie klienta generując ruch lub w trybie serwera przyjmując połączenie od klienta, w każdym razie otrzymamy bogate statystyki testu. Poniżej przykład testu Windows 11 — Linux (VM na tym samym komputerze). Maszyna Windows posiada adres 192.168.7.177 natomiast nasz „serwer” czyli Linux 192.168.7.151.
Na maszynie z Linux uruchamiamy iperf w trybie serwera, protokół UDP
# iperf -s -u
Na maszynie Windows przechodzimy do katalogu z iperf i uruchamiamy go z wiersza poleceń jako klienta (-c) a jako protokoł komunikacyjny do testów wybieramy UDP (domyślnie jest TCP):
> iperf -c -u 192.168.7.151
Test domyślnie trwa 10 sekund, w naszym wypadku testujemy po protokole UDP, który ma mniejszy narzut administracyjny. Po chwili pojawia się statystyka testu.
Jeśli chcemy testować TCP to uruchamiamy serwer:
# iperf -s
Oraz klienta
> iperf -c 192.168.7.151
b. jperf
Graficzna nakładka na iperf, wymaga Javy (JRE). Ważne aby nakładka była w wersji odpowiedniej dla posiadanego narzędzia iperf. Przykładowo dla iperf 2.0 mamy jperf 2.0. Ponieważ nakładka wymaga środowiska Java musimy je zainstalować.
# apt-get install default-jre
Kolejno pobieramy pakiet jperf, rozpakujemy a w nim mamy plik jperf.sh. Trzeba tylko teraz zmienić jego uprawnienia aby można było uruchamiać.
# chmod 755 jperf.sh
Teraz można już nakładkę uruchomić klikając w przycisk po prawej. Na drugiej maszynie inicjujemy test zgodny z ustawieniami serwera (tutaj TCP)
Nakładka jperf może także działać w trybie serwera pozwalając w czytelny sposób na ustawiania opcji protokołu TCP takich jak bufor, okno, segment co mocno rzutuje na osiągane przepustowości przy ruchu w protokole TCP.
2. MikroTik Bandwidth Test Program jest wbudowany w system RouterOS, posiada serwer oraz klienta. Znajdziemy go w menu WinBox w pozycji /Tool
– Moduł serwera /Tool/BTestServer
– Moduł klienta /Tool/Bandwidth Test
a. Serwer
Aby udostępnić nasz system jako serwer testu klikamy na Enabled i tyle. Możemy także włączyć autentykacje, w tym celu wymagane będzie utworzenie dodatkowego użytkownika. Dwie opcje jaki widzimy pozwalają określić od którego portu UDP w górę będą one alokowane dla kolejnych sesji, których ilość ustalimy poniżej. Aby test był miarodajny w czasie jego trwania nie należ naszego RouterOS obciążać innymi zadaniami. Przycisk sessions pokaże nam aktywne sesje.
b. Klient
Znacznie więcej opcji mamy w sekcji klienta. Ustalimy tu adres docelowy (serwera), protokół komunikacyjny, ilość jednoczesnych strumieni, ograniczenia prędkości i rozmiaru pakietów. Opcja random data pozwala generować dane losowe, co dodatkowo obciąża generator.
3. MikroTik PacketGenerator Przykład testu Aplikacja także jest wbudowana w system RouterOS i osiągalna z menu WinBox /Tools/Traffic Generator
Za jego pomocą można ustalić budowę i zawartość pakietu oraz sposób wysyłania czyli ilość pakietów na sekundę lub oczekiwana prędkość. Aby wygenerować ruch musimy przygotować drogę pakietu (port), jego szablon czyli budowę (protokoły, adresy itp) oraz strumień określający port, rozmiar, ilość pakietów na sekundę.
4. Inne generatory pakietów
Mogą służyć do generowania pojedynczych pakietów celem testowania np. zapory ogniowej, a także do generowania większego ruchu i tym samym testowania przepustowości przy danej budowie pakietu.
– packEth – Packet Sender – Nping
4b. Pojawi się katalog Grafana-Mikrotik, do którego przechodzimy
4c. W tym katalogu edytujemy plik prometheus.yml znajdujący się w katalogu prometheus, dodając do konfiguracji hosty MikroTik, które chcemy monitorować:
5. Uruchamiamy kontenery (będąc w katalogu Grafana-Mikrotik)
#sudo docker compose up -d
Pierwsze uruchomienie wymaga chwili ponieważ obrazy kontenerów muszą zostać pobrane i zainstalkowane. Po uruchomieniu można sprawdzić stan zestawu kontenerów:
#sudo docker compose stats
6. Panel Grafana
W przeglądarce odtwieramy stronę Grafany pracującej na maszynie z kontenerami. Grafana nasłuchuje domyślnie na porcie 3000, połączenie nie jest szyfrowane
Za pomcą opcji Instance możemy wybierać różne hosty, zdefiniowane wcześniej w pliku prometheus.yml.
7. Statystyki przechowywane są w w/w katalogu, który zawiera pliki konfiguracyjne całości.
8. Zestaw kontenerów możemy zatrzymać za pomocą polecenia:
1. Na hoście, który będziemy monitorować
– tworzymy grupę np: prometheus
#/user group add name=prometheus policy=api,read,winbox,test
– tworzymy użytkownika, za pomocą którego skorzystamy a API
#/user add name=prometheus group=prometheus password=nasze-haslo
– włączamy API:
#/ip service enable api
#/ip service enable api-ssl
Jeśli chcemy skorzystać z API szyfrowanego trzeba utworzyć certyfikat, opisany w innej sekcji. Odblokować także trzeba porty TCP: 8728 i 8729 na firewall.
Pojawi się katalog mikrotik_monitoring a w nim mamy podkatalog mktxp. W tym katalogu edytujemy plik mktxp.conf dodając hosty, które chcemy monitorować. Poniżej przykład:
Musimy jeszcze w tym pliku (sekcja default) ustawić dane logowania do naszych Mikrotików po API czyli port, nazwa użytkownika jak i jego hasło (ustalone wcześniej) na etapie włączania API:
Jeśli monitorujemy po API bez szyfrowania to opcje w sekcji default możemy zostawić bez zmian. Warto je przejrzec celem właczenia dodatkowych elementów, które aplikacja będzie monitorować.
3. Uruchamiamy zestaw kontenerów
#sudo docker compose up -d
Aby kontenery zatrzymać
#sudo docker compose stop
Aby je całkowicie usunąć:
#sudo docker compose down
(pozostaną ich obazy oraz dane w katalogu gdzie rozpakowaliśmy cały zastaw)
Kontenery możemy monitorować:
#sudo docker compose stats
4. Logowanie do Garafany
W tym przypadku Garafana pracuje na porcie 80 naszego hosta
Protokół SNMP (ang. Simple Network Management Protocol) jest rozwiązaniem o wieloletniej tradycji (od roku 1988) i obecności w świecie IT. Aktualnie to jest raczej framework a nie sam, pojedynczy protokół. Wywodzi się z protokołów SGMP (Simple Gateway Management Protocol) protokołu monitorującego routery oraz protokołu CMIP (ang. Common Management Information Protocol). Dokumentami bazowymi są RFC 1065, 66, 76 (dotyczą one wersji 1). Aktualnie mamy w użyciu wersję 1 (chyba już nie jest używana) nie wspierającą szyfrowania czy autentykacji, wersję 2c (też nie obsługuje szyfrowania ale pozwala na efektgywne pobieranie danych, wiele za jednym poleceniem) oraz wersję 3 z autentykacją i szyfrowaniem transmisji.
Protokół SNMP jest typu klient/serwer, tutaj zwany manager/agent. Mamy zatem dwa rodzaje użądzeń.
Urządzenia monitorowane: serwerem jest agent działający na monitorowanym urządzeniu. Zazwyczaj jest to oprogramowanie wbudowane przez producenta. Takie urządzenie zwane tez jest MNE (ang. Managed Network Entity). Agent monitoruje różne parametry urządzenia i może być odczytywany przez klienta (stację monitorującą) w trybie tzw. polling (ankietowanie) lub samodzielnie wysyłać informacje na bazie tzw. pułapek (ang. traps).
Urządzenia monitorujące: klientem jest oprogramowaniem działające na stacji monitorującej (np. libreNMS, openNMS, Zabbix, Observium, MikrotTik The Dude i wiele innych). Nazwany NMS (ang. Network Management Station) i jest to centralny punkt monitorowania. To on decyduje co i jak oraz kiedy monitorować, w jakich interwałach czasu itd.
Stacja NMS może być w mare prostą aplikacją (np. iReasoning MIB Browser) bardzo złożonym oprogramowaniem z dużą bazą przechowującą historię zdarzeń z wielu monitorowanych urządzeń oraz prezentującą wyniki w postaci graficznej (np. libreNSM, Grafna+Prometheus, Zabbix i wiele innych).
SNMP Manager zajmuje się wysyłaniem zapytań, odbieraniem odpowiedzi oraz pułapek z urządzeń nadzorowanych. Przykładem jest Prometheus.
SNMP frontend to aplikacja pozwalająca zarządzać managerem, budować zapytania, prezentować odpowiedzi i wyniki. Przykładem jest snmpwalk (wiersz poleceń Linux) oraz Grafana, potężny system graficznej prezentacji statystyk SNMP.
Urządzenie zarządzane takie jak serwer, router, przełącznik, accesspoint i wiele innych zawiera:
Agent SNMP jest to oprogramowanie najczęściej wbudowane w urządzenie zbierające dane z różnych jego komponentów. Aby to wykonać posiada wbudowaną bazę MIB zawierającą ustandaryzowane identyfikatory obiektów, które mogą być monitorowane. Każdy obiekt ma przyporządkowany numer OID (ang. Object Identifier) i jest zapisany w bazie MIB (o czym jest napisane dalej). Obiektem może być temperatura CPU, stan interfejsu itp.
2. Komunikacja
Protokół SNMP używa portów 161 i 162 UDP. Jest to protokół typu żądanie/odpowiedź. Protokół UDP jest bezpołączeniowy, nie gwarantuje dostarczenia danych. Nie jest to problemem ponieważ w tym wypadku NMS może ponowić żądanie. Protokół wykorzystuje kilka komunikatów:
GetRequest: menadżer (NMS) żąda informacji (Get, GetNext, GetBulk w SNMPv2)
GetResponse: agent odpowiada menadżerowi
SetRequest: menadżer może wysłać do agenta (czyli monitorowanego urządzenia) polecenie zmiany jakiegoś parameteru
Trap/Inform: agent wysyła menadżerowi informacje o pewnym zdarzeniu
Komunikacja może odbywać sie w trzech trybach:
a. Ankietowanie (polling): stacja monitorująca (manager) odpytuje agentów o stan różnych parametrów danego urządzenia. Zaletą jest minimalne obciążenie urządzenia monitorowanego, wadą jest brak informacji dla NMS w czasie rzeczywistym. Jeśli odpytywanie jest ustawione na np. co 5 minut, NMS nie zna stanu urządzenia między kolejnymi zapytaniami. Tego typu zapytania wysyłane są na port UDP 161 agenta.
b. Pułapki (trap): w tym wypadku urządzenie monitorowane samodzielnie wysyła informacje o różnych zdarzeniach (np. przekroczenie temperatury CPU, awaria interfejsu) do NMS. Tego typu informacje wysyłane są na port UDP 162 menadżera.
c. Stacja monitorująca wysyła do urządzenia monitorowanego zlecenia zmiany pewnego parametru, np. nazwy.
3. Typy komunikatów SNMP
Protokół SNMP korzysta z kilku typów poleceń i zawartych w nich wiadomości. Poniżej kilka przykładów.
Wszelkie obiekty, które można monitorować (takie jak CPU, pamięć itp.) zostały opisane za pomocą SMI (ang. Structure of Management Information). Jest znormalizowany sposób prezentacji danych (RFC1155, 1065). Bazuje on unikalnych identyfikatorach obiektów OID. Te identyfikatory najczęściej są przedstawiane w postaci drzewa natomiast przechowywane są tekstowych bazach MIB (ang. Management Information Base). Dobry opis tematu baz MIB znajdziesz na stronie Oracle. Przydatną przeglądarką online jest Free MIB Browser.
Każdy obiekt do monitorowania ma swój unikalny numer i pozycje w drzewie OID. Pokazano to niżej.
Struktura drzewiasta zapewnia elastyczne i unikalne nazewnictwo obiektów. Większość urządzeń różnych producentów znajduje się w gałęzi drzewa .1.3.6.1.4.1. Powyższy przykład pokazuje, że firma Tp-Link ma ID 11863 w gałęzi .1.3.6.1.4.1. Podobnie jak w systemie DNS cała struktura zaczyna się od korzenia symbolizowanego kropką (ang. root). Dobrym miejscem na szukanie OID jest serwis OID-INFO.
Wpisy i numery jak i nazwy OID dzielą sie na dwie grupy: standardowe oraz prywatne (producentów sprzętu). Przykładem standardowego OID jest nazwa systemu (którą posiada chyba każdy sprzęt sieciowy), ma ona numer:
.1.3.6.1.2.1.1.5 (na początku jest kropka, to ważne!).
Według drzewa OID nazwę można także zapisać jako:
.iso.org.dod.internet.mgmt.mib-2.system.sysName
Poniżej przykład na bazie polecenia snmpwalk:
Na przykładzie systemu RouterOS możemy wyświetlić OID dla interfejsów radiowych. Pierwsza część .1.3.6.1.4.1 prowadzi nas do części drzewa przeznaczonej dla producentów. Kolejno mamy numer 14988 przydzielony MikroTik. Dalej mamy to, co ustaliła ta firma jeśli chodzi o numery ODI. W tym wypadku jest to częstotliwość wybranej karty radiowej (5560 MHz).
#/interface wireless print oid
Łącząc obie ilustracje:
Dla opisu zasobów systemu RouterOS wygląda to nieco inaczej (korzystamy ze standardowej bazy i ścieżki):
Te wpisy prowadzą nas do bazy MIB.
5. Baza MIB
Baza ta przechowuje odwzorowania OID – nazwa i pozwala na efektywny zapis obiektów celem ich monitorowania. Zapis danych w bazie jest zgodny z Abstract Syntax Notification v1.
Istnieją trzy rodzaje baz MIB
Bazy MIB są standardowym zapisem obiektów. Znajduje się w nich szereg obiektów systemów Unix
Bazy MIB2 (MIBII) są rozszerzeniem baz MIB o możliwości monitorowania TCP/IP
Bazy prywatne tworzone są przez producentów sprzętu i rozszerzają możliwości MIB2 o obiekty specyficzne dla danego urządzenia.
Aby odczytać bazę prywatną system NMS musi znać jej format i przeznaczenie OID. Na szczęście producenci dobrze dokumentują te kwestie oraz istnieje wiele systemów typy NMS z różnymi wtyczkami dla konkretnego producenta. Proces łącznia baz MIB nazywa się kompilacją i polega na połączeniu bazy producenta z bazami standardowymi.
Standardowe bazy MIB (po ich uprzednim pobraniu za pomocą mibs-download) znajdziemy w systemie Linux w katalogu:
/home/jnowak/.snmp/mibs:/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf (tutaj pojawią się po instalacji oprogramowania SNMP)
lub
/var/lib/mibs/iana oraz ietf (tutaj pojawią się po instalacji oprogramowania SNMP i ręcznym ich pobraniu).
Baza taka zawiera obiekty do monitorowania wraz z ich parametrami, poniżej przykład bazy dla urządzenia UPS
Mamy tu informacje na temat jednego z parametrów do monitorowania: „upsIdentManufacturer” czyli ID producenta UPSa. Jest to wartość typu łańcuch znaków o maksymalnej długości 32 znaki i tylko do odczytu.
Producenci tworzą własne bazy, przykładem jest MikroTik i jego baza specyficzna dla systemu RouterOS oraz urządzeń RouterBoard. Dzięki takiej bazie można korzystać z nazw obiektów nie tylko z ich numerów.
Przykładową bazę dla MikroTik można pobrać ze strony: https://mikrotik.com/download:
Bazę taką możemy pobrać i umieścić w standardowym katalogu np. /var/lib/mibs/ietf
Kompilacja nowej bazy
Pod pojęciem kompilacji rozumiemy dodanie nowej bazy MIB do managera celem rozszerzenia jego możliwości o monitorowanie dodatkowych urządzeń. Kompilacja polega na pobraniu bazy MIB producenta i wykonaniu czynności w zależności od posiadanego oprogramowania. Po kompilacji mamy możliwość odczytu specyficznych OID z danego urządzenia. Operacje taką przeprowadziny w przykładowym systemie NMS w dalszej części materiałów.
Observium działa w Docker na systemie Linux 192.168.53.110 i jest dostępne na porcie 8888.
Pi-hole działa w kontenerze na RouterOS (192.168.55.4). Ponieważ nie mamy bezpośredniego dostępu do SNMP wewnątrz kontenera, wykorzystujemy maszynę Linux (192.168.53.110) jako agregator SNMP:
Skrypt na Linux pobiera statystyki z API Pi-hole v6 (/api/stats/summary)
Linux udostępnia te dane poprzez SNMP Extend (net-snmp)
Observium CE i LibreNMS zbierają statystyki SNMP z Linuxa (192.168.53.110)
Dlaczego tak? RouterOS nie pozwala na łatwe uruchomienie skryptów po stronie kontenera. Linux pełni rolę proxy – jest to standardowe podejście w środowiskach, gdzie monitorowane urządzenie nie wspiera natywnie SNMP.
Poniżej podano rożne dane: IP, hasła, token do PiHole, numer urządzenia w oObservium i inne – to oczywiście przykłady, musisz wstawić swoje dane.
2. Konfiguracja Pi-hole — API
2.1. Logowanie do panelu Pi-hole
Otwórz przeglądarkę i przejdź pod adres:
http://192.168.55.4/admin/login
Zaloguj się hasłem: ZAQ!2wsx
2.2. Generowanie klucza API (App Password)
Pi-hole v6 wymaga uwierzytelnienia dla endpointów API. Wygeneruj hasło aplikacji:
Przejdź do: Settings → API / Web Interface
Kliknij „Generate App Password”
Skopiuj wygenerowany token (zapisze się w schowku)
Ważne: Token pokazywany jest tylko raz. Zapisz go bezpiecznie, np. w menedżerze haseł. Będzie potrzebny w skrypcie SNMP.
2.3. Test API (opcjonalnie z poziomu Linux 192.168.53.110)
Skrypt distro pozwala Observium CE i LibreNMS automatycznie rozpoznać system operacyjny (dystrybucję, jądro, architekturę) zamiast wyświetlać „generic device”.
# Nasłuch na wszystkich interfejsach
agentAddress udp:161,udp6:[::1]:161
# Widok pełny
view all included .1
# Dostęp read-only dla całej sieci LAN
rocommunity public 192.168.0.0/16 -V all
# Lokalizacja i kontakt
syslocation "Serwer monitoringu, Home Lab"
syscontact "Admin <admin@example.com>"
# Dystrybucja (dla Observium/LibreNMS)
extend .1.3.6.1.4.1.2021.7890.1 distro /usr/local/bin/distro
Gotowe: Po zapisaniu konfiguracji uruchom ponownie snmpd: sudo systemctl restart snmpd
4. Agent SNMP dla Pi-hole
4.1. Skrypt pobierający statystyki
Utwórz plik /usr/local/bin/pihole-stats.sh:
sudo nano /usr/local/bin/pihole-stats.sh
Bezpieczniejsza alternatywa — App Password z osobnego pliku konfiguracyjnego:
Zamiast wpisywać hasło w skrypcie, w panelu Pi-hole wygeneruj App Password (Settings → API/Web Interface → Generate App Password), zapisz go w /etc/snmp/pi-hole.conf i skrypt wczyta z pliku.
Wariant 1 — skrypt z App Password w zewnętrznym pliku configa (zalecane):
Wariant bez hasła: Jeśli Pi-hole nie wymaga hasła, usuń blok uwierzytelnienia i ustaw STATS=$(curl -s http://${PIHOLE_HOST}/api/stats/summary).
Nadaj uprawnienia wykonania:
sudo chmod +x /usr/local/bin/pihole-stats.sh
Ważne: Po każdej zmianie skryptu pihole-stats.sh lub pliku pi-hole.conf musisz zrestartować snmpd: sudo systemctl restart snmpd
Inaczej snmpd będzie zwracał stare (cachowane) wyniki.
4.2. Test skryptu
/usr/local/bin/pihole-stats.sh
Oczekiwany wynik — 11 liczb (po jednej w wierszu):
# Sprawdź całe drzewo nsExtendMIB
snmpwalk -v2c -c public 127.0.0.1 .1.3.6.1.4.1.2021.7890
# Sprawdź tylko dane per-line (Output2Table)
snmpwalk -v2c -c public 127.0.0.1 .1.3.6.1.4.1.2021.7890.5.4
W Output2Table zobaczysz 11 linii z wartościami liczbowymi (to są dane dla sensorów Observium).
5. Testowanie poprawnej konfiguracji SNMP
5.1. Podstawowe zapytanie
snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.2.1.1
5.2. Odczyt danych Pi-hole przez SNMP
snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
5.3. Zdalnie z innej maszyny
Z poziomu serwera Observium/LibreNMS (bez Dockera):
snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
Z poziomu kontenera Docker (Observium/LibreNMS w Dockerze):
# Przez docker exec — snmpwalk musi być zainstalowany w kontenerze
docker exec observium snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
# Jeśli kontener nie ma snmpwalk — użyj innego kontenera z narzędziami sieciowymi
docker run --rm alpine/snmp snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
# Lub bezpośrednio na hoście Docker (jeśli masz zainstalowane snmp)
snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
Uwaga dla Dockera: Jeśli docker exec observium snmpwalk nie działa, kontener może nie mieć pakietu snmp. Możesz go doinstalować przez: docker exec -it observium apt-get update && docker exec -it observium apt-get install -y snmp
Lub użyj tymczasowego kontenera alpine/snmp jak w przykładzie wyżej.
Jeśli zapytanie zwraca dane, konfiguracja SNMP jest gotowa. Możesz przejść do dodawania urządzenia w Observium CE lub LibreNMS.
6. Dodawanie do Observium CE
Uwaga o edycji CE: W odróżnieniu od płatnej wersji, Observium CE nie posiada Applications UI ani Custom OID w panelu web — to funkcje Subscription Edition. W CE działają natomiast: statyczne sensory zdefiniowane w config.php oraz UNIX Agent.
6.1. Dodanie urządzenia Linux
Zaloguj się do panelu Observium CE
Przejdź do: Devices → Add Device
Wypełnij:
Hostname:192.168.53.110
Community:public
SNMP Version:2c
Port:161
Kliknij „Add Device”
Observium automatycznie wykryje system operacyjny i rozpocznie zbieranie danych.
6.2. Statyczne sensory w config.php (jedyna metoda w CE)
Observium CE pozwala definiować statyczne sensory i liczniki w pliku config.php po stronie serwera Observium. Są one pollowane przez standardowy mechanizm SNMP.
Uwaga: jeśli Observium działa w Dockerze — musisz edytować plik wewnątrz kontenera. Samo edytowanie pliku na hoście nic nie da. Poniżej trzy sposoby.
Opcja 1 — edytuj przez docker exec (najszybsza):
# Wejdź do kontenera i edytuj config.php
docker exec -it observium nano /opt/observium/config.php
# Jeśli nie ma nano, użyj vi lub sed
Opcja 2 — skopiuj na zewnątrz, edytuj, wgraj z powrotem:
# Wyciągnij plik z kontenera
docker cp observium:/opt/observium/config.php ./config.php
# Edytuj lokalnie
nano ./config.php
# Wgraj z powrotem do kontenera
docker cp ./config.php observium:/opt/observium/config.php
Opcja 3 — zamontuj config jako wolumen (trwała, przy docker-compose):
# w docker-compose.yml observium dodaj:
services:
observium:
...
volumes:
- ./observium-config.php:/opt/observium/config.php
# Potem edytuj observium-config.php na hoście i restartuj:
docker-compose restart
Niezależnie od opcji — dodaj poniższy kod na końcu pliku config.php:
To numer, pod którym Linux 192.168.53.110 jest zapisany w bazie Observium/LibreNMS.
1. Zaloguj się do panelu Observium/LibreNMS
2. Wejdź w Devices (lista urządzeń)
3. Kliknij na urządzenie 192.168.53.110
4. Spójrz w pasek adresu przeglądarki — zobaczysz np.: http://observium/dashboard/device/5/ http://librenms/device/7/
5. Ta liczba (5 lub 7) to właśnie DEVICE_ID
Albo przez MySQL:mysql -u observium -p observium -e "SELECT device_id,hostname FROM devices"
Po zapisaniu wymuś odkrycie sensorów (użyj swojego ID urządzenia, np. 6):
OSTRZEŻENIE o OID: W internecie często pojawia się porada z OID .101.1, .102.1 itd. dla kolejnych linii wyjścia skryptu. To jest błędne — numery .100, .101, .102 oznaczają osobne tabele SNMP, a nie indeksy linii.
Prawidłowe OID zależą od nazwy Twojego extend. Dla extend o nazwie pihole, dane per-line są w tabeli nsExtendOutput2Table pod OID: .1.3.6.1.4.1.2021.7890.5.4.1.2.6.112.105.104.111.108.101.Y
gdzie 6.112.105.104.111.108.101 to „pihole” zakodowane w OID, a Y to numer linii (1-11).
Zweryfikuj rzeczywiste OID przez:docker exec -i observium snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890
6.3. UNIX Agent (tylko dla Observium Subscription — płatna wersja)
Uwaga: UNIX Agent dla własnych skryptów (jak Pi-hole) działa tylko w płatnym Observium Subscription. W Observium CE nie pojawią się wykresy — użyj statycznych sensorów z pkt 6.2.
Observium Subscription wspiera UNIX Agent — skrypt na Linux (192.168.53.110) wysyła dane przez TCP (port 655) do serwera Observium.
Część wspólna — konfiguracja na Linux 192.168.53.110:
sudo mkdir -p /usr/lib/observium_agent/scripts
sudo curl -o /usr/lib/observium_agent/scripts/pihole \
https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/pi-hole
sudo chmod +x /usr/lib/observium_agent/scripts/pihole
# Konfiguracja API Pi-hole
echo 'API_URL="http://192.168.55.4"' | sudo tee /etc/snmp/pi-hole.conf
echo 'API_AUTH_KEY="wygenerowany_app_password"' | sudo tee -a /etc/snmp/pi-hole.conf
# Skrypt agent-local.sh
sudo mkdir -p /opt/observium/scripts
sudo tee /opt/observium/scripts/agent-local.sh << 'EOF'
#!/usr/bin/env bash
for script in /usr/lib/observium_agent/scripts/*; do
[ -x "$script" ] || continue
echo "<<<$(basename "$script")>>>"
"$script" 2>/dev/null || true
done
EOF
sudo chmod +x /opt/observium/scripts/agent-local.sh
# Uruchom nasłuch na porcie 655
sudo apt install -y socat
sudo socat TCP-LISTEN:655,reuseaddr,fork EXEC:/opt/observium/scripts/agent-local.sh &
Konfiguracja w Observium:
Po włączeniu UNIX Agenta w config.php poller automatycznie łączy się na port 655 do urządzenia.
Uwaga: Jeśli Pi-hole v6 używa hasła (a nie tokena API), skrypt LibreNMS może wymagać modyfikacji. W takim przypadku lepiej użyć skryptu /usr/local/bin/pihole-stats.sh z sekcji 4.1.
Krok 3: Rejestracja w snmpd.conf
sudo nano /etc/snmp/snmpd.conf
extend pihole /usr/lib/librenms_agent/pihole
sudo systemctl restart snmpd
Krok 4: Test na serwerze LibreNMS
snmpwalk -v2c -c public 192.168.53.110 NET-SNMP-EXTEND-MIB::nsExtendOutput2Line
7.2. Dodanie urządzenia w LibreNMS
Zaloguj się do panelu LibreNMS
Przejdź: Devices → Add Device
Wypełnij:
Hostname:192.168.53.110
SNMP Version:v2c
Community:public
Port:161
Kliknij „Add Device”
7.3. Ręczne włączenie aplikacji Pi-hole
Wejdź w szczegóły urządzenia (192.168.53.110)
Device → Edit → Applications
Z listy wybierz „Pi-hole” i zapisz
Wymuś ponowne odkrycie:
./discovery.php -h 192.168.53.110
7.4. Weryfikacja w LibreNMS
Przejdź do urządzenia → zakładka „Apps”
Powinieneś zobaczyć „Pi-hole” z wykresami:
Domains being blocked
DNS Queries Total
DNS Queries Blocked
DNS Queries Percent Blocked
Unique Domains
Queries Forwarded / Cached
Query Types (A, AAAA, PTR, SRV)
Sukces: LibreNMS od wersji 21.x+ wspiera Pi-hole jako natywną aplikację. Wykresy są w pełni automatyczne po poprawnym skonfigurowaniu agenta.
8. Troubleshooting
SNMP: Connection refused
sudo ss -tlnp | grep 161
sudo systemctl status snmpd
# Sprawdź czy agentAddress w snmpd.conf jest poprawny
SNMP: No response
# Sprawdź firewall na Linux
sudo ufw status
sudo iptables -L -n | grep 161
# Sprawdź czy community string jest poprawny
snmpwalk -v2c -c public 127.0.0.1 .1.3.6.1.2.1.1
Pi-hole API: Unauthorized
# Hasło Pi-hole może być zmienione
# Wygeneruj nowy App Password w panelu Pi-hole
# Settings > API/Web Interface > Generate App Password
Skrypt pihole-stats.sh: puste wyniki
# Debug skryptu — uruchom ręcznie
bash -x /usr/local/bin/pihole-stats.sh
# Sprawdź czy curl i jq są zainstalowane
which curl
which jq
# Sprawdź czy Pi-hole jest dostępny
curl -s -o /dev/null -w "%{http_code}" http://192.168.55.4/api/stats/summary
LibreNMS: nie widzi aplikacji Pi-hole
# Wymuś ponowne odkrycie
cd /opt/librenms
php discovery.php -h 192.168.53.110
# Debug pollingu
snmpbulkwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890.5
Observium: brak wykresów
# Sprawdź logi pollingu (bezpośrednio na systemie)
tail -f /opt/observium/logs/poller.log
# Wymuś poll (bezpośrednio na systemie)
./poller.php -h 192.168.53.110 -d
Observium w Dockerze: SNMP connection refused
# Sprawdź czy kontener widzi Linux (192.168.53.110)
docker exec observium ping 192.168.53.110
# Sprawdź SNMP z wnętrza kontenera
docker exec observium snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.2.1.1
# Jeśli nie działa — kontener może być w innej sieci Docker.
# Użyj adresu IP bramy Docker (zwykle 172.17.0.1):
docker exec observium snmpwalk -v2c -c public 172.17.0.1 .1.3.6.1.2.1.1
Observium w Dockerze: config.php zmiany nie są widoczne
# Po edycji config.php przez docker exec ZAWSZE uruchom:
docker exec -it observium php /opt/observium/discovery.php -h 6 -m sensors
docker exec -it observium php /opt/observium/poller.php -h 6 -m sensors
# Sprawdź czy zmiany w config.php są widoczne wewnątrz kontenera:
docker exec observium grep -c pihole /opt/observium/config.php
# Debug pollera dla Pi-hole (użyj -i, nie -it, gdy pipe'ujesz):
docker exec -i observium php /opt/observium/poller.php -h 6 -m sensors -d 2>&1 | grep -i -E "(pihole|static|error|warning)"
Observium w Dockerze: sensory static nie pojawiają się
# Sprawdź rzeczywiste OID z wnętrza kontenera:
docker exec observium snmpwalk -v2c -c public 192.168.53.110 .1.3.6.1.4.1.2021.7890
# OID w nsExtendOutput2Table mają format:
# .1.3.6.1.4.1.2021.7890.5.4.1.2.{długość_nazwy}.{znaki_nazwy_ASCII}.{numer_linii}
# Przykład (dla extend "pihole"):
# .1.3.6.1.4.1.2021.7890.5.4.1.2.6.112.105.104.111.108.101.1 = "2012986" ← linia 1
# .1.3.6.1.4.1.2021.7890.5.4.1.2.6.112.105.104.111.108.101.2 = "22842" ← linia 2
# Wymuś pełne odkrycie dla urządzenia:
docker exec -it observium php /opt/observium/discovery.php -h 6
Jeśli chcesz monitorować zdalnie zasoby hostów sieciowych takie jak obciążenie pamięci czy procesora (i wiele, wiele innych parametrów) możesz użyć protokołu SNMP. Poniżej pokazano podstawową instalację oraz konfiguracje na systemach Linux, Windows oraz RouterOS i Cisco. Nie jest w tym artykule opisywana w szczegółach cała teoria związana z SNMP a tylko wybrane elementy praktycznego zastosowania. Ten system składa się z kilku elementów:
Pakiet snmp zawiera oprogramowanie do ręcznego odpytywania agentów, pakiet snmpd odpowiada na takie pytania.
Konfiguracja
Pojawi sie katalog /etc/snmp a w nim dwa pliki: dla klienta 'snmp.conf’ oraz dla serwera 'snmpd.conf’. My skonfigurujemy tu ten drugi aby można było odpytywać nasz komputer:
# sudo nano /etc/snmp/snmpd.conf
Domyślnie po instalacji usługa działa tylko na interfejsie pętli zwrotnej: szukamy linii z: 'agentaddress 127.0.0.1,[::1]’ – to uruchamia usługe SNMP tylko na adresie pętli zwrotnej a my chcemy dostać się do parametrów SNMP z sieci LAN zatem komentujemy ta linie i wstawiamy:
# Dla IPv4
agentaddress udp:161
# rocommunity public 0.0.0.0/0
# Dla IPv6
agentaddress udp6:161
#rocommunity6 public ::/0
Linie zakomentowane to tak na wypadek gdyby w dalszej części pliku ich nie było (ale powinny być) i mówią o nazwie wspólnowy.
Testowanie
Przeładujemy usługę SNMP:
# sudo systemctl reload snmpd
I możemy sprawdzić czy działa i na jakim porcie nasłuchuje:
# netstat -aon | less
Powinno być cos takiego:
Usługi SNMP
Widać, że SNMP pracuje na protokole IPv4 i IPv6 na porcie 161. Od teraz możemy nasz host monitorować w Observium i nie tylko. za pomocą snmpwalk sprawdzimy co tam piszczy w naszej maszynie. Składania:
# snmpwalk -v 2c -c public 127.0.0.1
lub gdy pracujemy na innej maszynie (IP dostosuj do swojego):
# snmpwalk -v 2c -c public 192.168.55.1
Maszyna za NATem
Jeśli maszyna, którą chcemy monitorować znajduje się za NAT to trzeba wykonać przekierowanie portów (można inaczej ale o tym tu nie mówimy). Należy przekierować port z zewnątrz (nazwijmy go 'publiczny’) na port 161 hosta za NATem, protokół UDP. Jak już to wykonamy to w systemie zbierającym dane trzeba to uwzględnić. Jeśli to program snmpwalk to za adresem IP podajemy numer portu:
# snmpwalk -c public -v 2c 192.168.53.89:10000
Konfiguracja demona pułapek
Protokół SNMP i jego oprogramowanie nie działa w czasie rzeczywistym. Jak skonfigurujemy odpytywanie tak je mamy ale zawsze zapytania o stan np.: obciążenia procesora są wysyłane przez klienta SNMP w pewnych odstępach czasu np. co 5 minut. Co się dzieje w 'międzyczasie’ tego nie wiemy. W tym może pomóc nam mechanizm tzw. pułapek. działa on na takiej zasadzie, że agent samodzielnie wysyła komunikat (UDP, port 162) do serwera pułapek (snmptrapd) na temat zdarzenia.
Najpierw instalujemy agenta pułapek. Jeśli już mamy pozostałe elementy SNMP to wystarczy:
# sudo apt install snmptrapd
Po instalacji możemy sprawdzić czy jest ok:
# snmptrapd --version
Konfiguracja jest przechowywana w /etc/snmp/snmptrap.conf zatem edytujemy go np.:
# sudo nano /etc/snmp/snmptrapd.conf
Na tym etapie wystarczy odkomentować linię
authCommunity log,execute,net public
oraz dodać linie:
doNotLogTraps no
aby demon przyjmował informacje od agentów.
Reakcja na pułapki
Aby sygnały z pułapek jakoś obsłużyć można dla wybranej pułapki napisać skrypt i zaprogramować jego wykonanie. Napiszemy prosty skrypt w BASH, który zapisze do pliku dane dotyczące pułapki. Format jest danych generowanych przez snmptrapd jest taki:
pierwsza linia: nazwa nadawcy (hostname)
druga linia IP nadawcy
trzecia linia i następne to dane (pary OID – wartość)
Poniżej przykład skryptu (przykładowo zapisanego w pliku /etc/snmp/trap_handler1.sh):
#!/bin/bash
# Ścieżka do pliku logu (zgodnie z dobrą praktyką w /var/log)
LOG_FILE="/var/log/trap_test1.log"
# Pobranie aktualnej daty i czasu
DATE_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# snmptrapd przekazuje pierwsze dwie linie jako informacje o nadawcy:
read -r HOSTNAME
read -r TRANSPORT_INFO
# Wyciągamy czysty adres IP z linii transportowej (często ma format "UDP: [192.168.1.50]:58392")
IP_ADDRESS=$(echo "$TRANSPORT_INFO" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n 1)
# Jeśli nie udało się wyciągnąć IP z drugiej linii, używamy pierwszej
if [ -z "$IP_ADDRESS" ]; then
IP_ADDRESS="$HOSTNAME"
fi
# Zapis nagłówka do logu
echo "==========================================" >> "$LOG_FILE"
echo "Data i czas : $DATE_TIME" >> "$LOG_FILE"
echo "Nazwa hosta : $HOSTNAME" >> "$LOG_FILE"
echo "Adres IP : $IP_ADDRESS" >> "$LOG_FILE"
echo "Zawartość pułapki:" >> "$LOG_FILE"
# Wczytujemy całą resztę danych (zmienne/OID przesłane w pułapce)
while read -r OID VALUE; do
echo " $OID -> $VALUE" >> "$LOG_FILE"
done
echo "==========================================" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
# === KONIEC =============================================================================
Ponieważ odbędą się zapisy do pliku logu trzeba go utworzyć oraz ustawić uprawnienia:
Ponownie otwieramy plik /etc/snmpd/snmptrapd.conf i na końcu wpisujemy zlecenie uruchomienia skryptu:
#
# =========================================================================================================
# EXAMPLE-trap.conf:
# An example configuration file for configuring the Net-SNMP snmptrapd agent.
#
###############################################################################
#
# This file is intended to only be an example.
# When the snmptrapd agent starts up, this is where it will look for it.
#
# All lines beginning with a '#' are comments and are intended for you
# to read. All other lines are configuration commands for the agent.
#
# PLEASE: read the snmptrapd.conf(5) manual page as well!
#
#authCommunity log,execute,net private
authCommunity log,execute,net public
doNotLogTraps no
#
## send mail when get any events
#traphandle default /usr/bin/traptoemail -s smtp.example.org foobar@example.org
#
## send mail when get linkDown
#traphandle .1.3.6.1.6.3.1.1.5.3 /usr/bin/traptoemail -s smtp.example.org foobar@example.org
# Jesli chcemy lapac wiecej pulapek o konkretnych OID to trzeba je wpsiac w osobnych liniach
# w formacie: traphandle NUMER_OID /katalog/ze/skryptem.sh
# gdzie NUMER_OID to numer np: .1.3.6.1.4.1.999.1
# przyklad z RouterOS: traphandle .1.3.6.1.4.1.14988.2 /bin/bash /etc/snmp/trap_RouterOS.sh
# ale PRZED linia lapiaca wszystko czyli ponizsza:
traphandle default /etc/snmp/trap_handler1.sh
# =========================================================================================================
Kolejno po zapisaniu zmian trzeba przeładować demona:
# sudo systemctl reload snmptrapd.service
Od tego momentu nasz system przyjmuje pułapki i reaguje zgodnie z zadanym scenariuszem. Czy komunikacja SNMP dociera to sprawdzimy tak:
Na hoście z 'snmptrapd’ włączamy przechwytywanie ruchu za pomocą tcpdump:
Adres 192.168.53.110 jest przykładowy i to jest adres IP interfejsu na jakim host nasłuchuje pułapek – ustaw właściwy adres swojego hosta! Ostatnia wartość w adresie IP to port (.162) na których host nasłuchuje pułapek.
Z innego hosta wysyłamy pułapkę:
# sudo snmptrap -v 2c -c public 192.168.53.110 '' 1.3.6.1.4.1.999.1 1.3.6.1.4.1.999.1.1 s "Test pulapki SNMP"
Po wysłaniu pułapki przenosimy się na hosta nasłuchującego i powinniśmy zobaczyć tam coś jak niżej:
SNMP – test pułapki
To na razie oznacza tylko tyle, że pułapka jest wysłana. Jeśli została odebrana przez snmptrapd i przetworzona to w katalogu '/var/log’ pojawi się plik 'trap_test1.log’. Stan działania sprawdzimy też za pomocą polecenia:
Pokaże to wszelkie logi z ostatnich 10 minut. Zawartość pliku trap_test1.log:
==========================================
Data i czas : 2026-07-20 18:17:10
Nazwa hosta : <UNKNOWN>
Adres IP : 192.168.53.97
Zawartość pułapki:
DISMAN-EVENT-MIB::sysUpTimeInstance -> 2:12:50:35.33
SNMPv2-MIB::snmpTrapOID.0 -> SNMPv2-SMI::enterprises.14988.2
SNMPv2-SMI::enterprises.14988.2.1.1 -> "Router rebooted due to power failure"
==========================================
==========================================
Data i czas : 2026-07-20 18:19:49
Nazwa hosta : <UNKNOWN>
Adres IP : 192.168.53.97
Zawartość pułapki:
DISMAN-EVENT-MIB::sysUpTimeInstance -> 2:12:53:31.30
SNMPv2-MIB::snmpTrapOID.0 -> IF-MIB::linkDown
IF-MIB::ifIndex.1 -> 1
==========================================
Zaletą jest to, że powyższe umożliwia nam logowanie do plików pułapek przesyłanych z różnych urządzeń ale wadą, że loguje wszystko do jednego pliku. W innym wpisie zostanie pokazane jak różne typu urządzeń logować do różnych plików.
Windows
Instalacja
W tym systemie można zainstalować agenta SNMP (z którego będzie mogło korzystać Observium) na kilka sposobów. Tutaj pokazano instalację za pomocą PowerShell.
Lub otwórz Menu Start i w polu wyszukiwania wpisz „funkcje” i wybierz „Włącz lub wyłącz funkcje systemu Windows”
Kiedy pojawi się okno z funkcjami zaznacz „”Protokół SNMP…” i checkbox zawarty w nim
Dodanie funkcji agenta SNMP w Windows
Zatwierdź i czekany na instalację, co chwilę może potrwać
Jak instalacja się zakończy to sprawdzamy czy działa uruchamiając okno usług systemowych: (z okna konsoli z uprawnieniami administratora wpisujemy 'services.msc’ lub w menu Start w polu wyszukiwania wpisujemy 'Usługi’ i potem klikamy prawym klawiszem myszki i wybieramy 'Uruchom jako administrator’)
c:\> services.msc
SNMP – na liście usług systemowych
Jeśli widać, że działa idziemy dalej, jak nie skontroluj czy poprzednie kroki wykonano poprawnie
Można to także wykonać z konsoli administratora PowerShell poleceniem:
Dwukrotnie kliknij w nazwę usługi SNMP i powinna być zaznaczona opcje 'Typ uruchomienia: automatyczny’ oraz 'Stan usługi: Działa’
SNMP – konfiguracja usługi w Windows
Przechodzimy na zakładkę 'Zabezpieczenia’ i tam dodajemy nazwę wspólnoty klikając przycisk 'Dodaj’
Ustalamy Prawa wspólnoty na tylko do odczytu oraz nazwę wspólnoty na 'public’
SNMP – ustalenie nazwy wspólnoty
W tym samym oknie, poniżej zaznaczamy ” Zaakceptuj pakiety SNMP od dowolnego hosta’ chyba, że wiemy pod jakim adresem jest nasze Observium i ten adres się nie zmieni. Jak się zmieni a zaznaczona będzie druga opcja to Observium czy inny NMS nie będzie mógł odpytywać po SNMP naszego Windowsa. Zaznaczamy i zatwierdzamy.
SNMP – w Windows, nazwa wspólnoty
W zakładce 'Agent’ możemy uzupełnić informacje kontaktowe na temat tej maszyny
Zatwierdzamy klikając 'OK’
SNMP – w Windows, informacje kontaktowe
Konfiguracja zapory ogniowej
Pozostaje jeszcze dodanie wpisu do zapory sieciowej pozwalającego na dostęp Observium do agenta. Protokół SNMP pracuje na porcie 161/UDP i taki tez trzeba otworzyć na zaporze tego systemu Windows w kierunku połączeń przychodzących. Uwaga: jeśli masz zaporę inną niż wbudowana w system (np. od programu AV to sprawdź jak to zrobić w tym programie). Najpierw możemy sprawdzić czy już są wpisy w zaporze zawiązane z SNMP. Najprościej z okna administratora PowerShell jednym z polecen:
Czy podsystem SNMP na naszym Windows działa sprawdzimy z systemu Linux z zainstalowanym pakietem snmp-tools za pomocą polecenia snmpwalk. Trzeba tylko sprawdzić jaki adres IP ma nasz Windows (poleceniem ipconfig)
# snmpwalk -c public -v 2c 192.168.53.121
Powinniśmy zobaczyć coś jak niżej:
SNMP – test Windowsa z Linuxa
RouterOS
Tutaj nic nie trzeba instalować, wystarczy tylko włączyć. Na konsoli wygląda to tak (za pomocą WinBox menu IP/SNMP):
Konfiguracja SNMP w RouterOS
Klikamy w Enabled, ustalamy dane kontaktowe i lokalizacje (opcjonalnie) oraz ustalamy wersje (2 nie obsługuje szyfrowania, 3 już tak). Klikając w Communities jeszcze ustalamy nazwę wspólnoty (domyślnie jest: public). Tyle podstawowej (nieszyfrowanej) komunikacji. Ta opcja pozwala tylko czytać z urządzenia, co nam wystarczy. Czy działa. Sprawdzimy na Linux poleceniem:
# snmpwalk -v 2c -c public 192.168.55.1
Adres podaj z Twojej sieci. Jak działa, to przeleci po ekranie masa informacji ze wskazanego hosta.
Jeśli chcemy skonfigurować także wysyłanie pułapek to ustawiamy adres hosta, który je przechwytuje (Trap Target), nazwę wspólnoty, wersję oraz jakie zdarzenia generują pułapki (można ustawić trzy dostępne). Oczywiście na podanym hoście musi pracować oprogramowanie odbierające pułapki. Przykładowa konfiguracje na Linux pokazano wyżej, w sekcji Linux.
SNMP – Konfiguracja generowania pułapek na RouterOS
Cisco
Aby włączyć agenta SNMP (tylko odczyt danych z routera/switcha) wystarczy kilka poleceń:
Jeśli chcesz mieć szybki wgląd w stan swojej sieci LAN oraz pracujących w niej urządzeń to ciekawym rozwiązaniem jest system Observium. Jest to aplikacja pozwalająca monitorować za pomocą protokołu SNMP różne urządzenia pracujące w sieci LAN jak i WAN. Protokół ten jest stosowany od wielu lat, a zatem działa na prawie każdym urządzeniu sieciowym oraz IoT.
Oprogramowanie Observium można zainstalować na Linux, Windows, w maszynie wirtualnej oraz w kontenerze Docker. W tym wpisie pokazane zostanie rozwiązanie bazujące na kontenerach Docker (na systemie Linux Ubuntu) oraz na kontenerach RouterOS. Instalacja Docker dla Linux jest opsiana tutaj.
Całość tego systemu składa się z wielu współpracujących programów ale najważniejsze to:
programy SNMP do odpytywania urządzeń o ich stan
baza danych (mySQL/mariaDB)
interfejs WWW
Observium w Docker na Ubuntu
To rozwiązanie bazuje na dwóch kontenerach Docker.
bazie danych mySQL
pakiecie Observium
W sieci znajdziemy wiele gotowców uruchomienia stosu kontenerów (stosu mikrousług) ale dość ciekawym rozwiązanie jest pokazane tutaj. Mamy tutaj dwie opcje uruchomienie systemu:
W tym rozwiązaniu przygotujemy dwa pliki konfiguracyjne dla kontenera z bazą danych oraz kontenera Observium. Najpierw tworzymy katalog na dane (np w naszym katalogu domowym):
# mkdir -p observium-docker/{data, logs, rrd}
To polecenia utworzy katalog 'observium-docker’ a w nim trzy katalogi: data, logs, rrd. Ważne aby znać pełną ścieżkę do tych katalogów ponieważ będziemy jej używać poniżej. W tym przykładzie zakładamy, że ta ścieżka to: '/home/yyy/docker/observium-docker’. W przypadku Twojej instalacji zdecyduj gdzie umieścisz katalog z całym projektem, zwłaszcza zwróć uwagę na nazwę katalogu domowego (Twój login).
Teraz przygotujemy plik na konfigurację kontenera z bazą danych: tworzymy plik np. za pomocą polecenia:
Polecenie ’-v /home/yyy/observium-docker/data:/var/lib/mysql’ zamontuje pierwszy z podanych katalogów z fizycznego komputera do wnętrza kontenera do katalogu '/var/lib/mysql’. Ustal też swoje hasła do bazy dla roota i zwykłego użytkownika. Strefa czasowa zostanie pobrana z systemowego pliku /etc/timezone i dla nas to 'Europe/Warsaw’. Nazwa bazy danych to 'obserwium’ tak samo nazywa się zwykły użytkownik w bazie. Opcje je możesz dostosować do swoich potrzeba ale wymagane będzie skorzystanie z tych nazw w dalszym toku konfiguracji. Ostatni linia to nazwa kontenera jaki zostanie pobrany z skonfigurowanego w Twoim systemie huba Dockera.
Uwaga: domyślny port bazy danych pracuje na TCP 3306 zatem upewnij się, że na twoim systemie jest on wolny. Jeśli nie, to zmień go w kontenerze przez opcję: ’-p 10000:3306′ czyli teraz kontener na Twoim komputerze otworzy port 10000 i przekieruje z niech ruch na port wewnętrzny do Dockera, do bazy danych na 3306. Ponieważ w podanym przykładzie na maszynie z naszym Dockerem już pracuje mySQL na porcie 3306 trzeba dodać jedną opcję do powyższego pliku (przed linię z 'mariadb’):
-p 10000:3306 \
Podaj taki port (pierwszy w tym wpisie) jaki masz wolny, plik zapisz. Jakie porty masz aktualnie otwarte na komputerze sprawdzisz poleceniem np.: 'netstat | less’ pod Linix albo 'netstat | more’ pod Windows.
Plik zapisujemy i tworzymy kolejny z systemem Observium:
Zauważ, że powtarzają się tu nazwy z poprzedniego pliku: katalog na dane, nazwa kontenera z bazą, nazwa bazy, nazwa uzytkownika bazy i hasło itp. Jak coś zmieniasz w pliku pierwszej konfiguracji (bazy) to musisz to ująć tez i tu. Podany adres IP to adres maszyny na której pracuje Twój Docker – dostosuj do do swojej konfiguracji. Podany port (8888) to port na jakim Docker nasłuchuje żądań klientów WWW. Linia ’-p 888:80′ dokonuje przekierowania port 8888 z komputera fizycznego na port 80 pracujący wewnątrz Dockera. Na tym porcie zalogujemy sie do panelu WWW aplikacji Observium. Sprawdź czy masz ten port wolny np za pomocą:
Jak nie otrzymasz żadnego wyniku to możesz ten port użyć, jak coś się pokaże to daj inny. Teraz czas na uruchomienie kontenerów. Ważną kwestia jest kolejność: najpierw baza a potem Observium ponieważ Observium aktywnie korzysta z bazy i musi ona być zainicjalizowana jako pierwsza.
Uwaga do innego portu naszej bazy: ponieważ kontenery łączą się wewnętrzną magistralą Dockera (opcja –link) to w konfiguracji Observium nic nie trzeba zmieniać.
Jak już mamy pliki konfiguracyjne to czas na uruchomienie kontenerów. najlepiej w osobnych terminalach, a do tego przyda sie program screen lub tmux. Musimy jeszcze nadać uprawnienia do uruchamiania plików:
Otwieramy w nim dwa okna i w pierwszym uruchamiamy kontener z bazą a w drugim z Observium. Do uruchomienia będzie wymagane sudo, a pierwsze uruchomienie powoduje, że Docker pobiera kolejne warstwy kontenera co może chwilkę zająć. Wygląda to jak niżej:
Pobieranie warstw kontenera
Kiedy warstwy zostaną pobrane kontener powinien się uruchomić, chyba że mamy błędny plik. Efekt na konsoli powinien być jak niżej:
Uruchomiony kontener mySQL ze zmienionym portem
Czy to działa? Sprawdzisz za pomocą polecenia mysql (o ile masz je zainstalowane) ale jak mamy taki ekran to działa. Do bazy zalogujesz się za pomocą (tylko jak masz zainstalowany w systemie mySQL/mariaDB):
# mysql -u root -p -P 10000
Powinno dać taki efekt (to właściwy serwer bo widać w nim bazę dla Observium):
Logowanie do bazy Observium
Teraz uruchamiamy drugi kontener (drugie okno tmux):
# sudo ./observium.sh
I czekamy na pobranie (to chwile potrwa bo około 400MB jest do pobrania). Jak się uruchomi poprawnie to mamy:
Uruchomiony w kontenerze Observium
Uwaga: żadnego z tych okien nie zamykaj bo pracują w nim kontenery, można je uruchomić z opcją ’-d’ i wtedy przejdą do tła a konsola zostanie zwolniona. Jeśli wszystko poszło dobrze to nasz Observium pracuje na adresie i porcie podanym w drugim pliku, zalogujemy się zatem:
Opis jak wykonać taką konfigurację znajduje się w innym artykule.
Konfiguracja Observium
..w opracowaniu..
Sprzęt do Observium
Tutaj nic szczególnego nie potrzebujemy ponieważ całość nie zajmuje wiele zasobów. Przykładowa konfiguracja w tym wpisie pracuje na bardzo starym komputerku: płyta Mini-ITX Gigabyte GS-J1900N-D3V, wbudowany procesor (bez wentylatora zatem super cichy), 8 GB RAM DDR4, dysk SSD, dwa interfejsy LAN (wystarczy jeden). Taka prosta maszynka i można na niej, dla małej sieci, prowadzić monitoring parametrów i wiele więcej. Poniżej widok komputerka z kontenerami:
MiniPC (Gigabyte) płyta główna
MiniPC (Gigabyte) obudowa
Zasilanie z zasilacz 12V 5A (buforowy) i jedziemy z różnymi tematami na Linux 🙂