Wprowadzenie
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:
- agent (udostępniający zasoby maszyny snmpd)
- klient (odpytujący agenty, np.: snmpwalk, snmpget)
- trap (tzw. pułapka) wysyłająca samodzielnie dane do demona (np.: snmptrapd)
Linux
Instalacja klienta i demona
Instalacja wymaga aktualizacji pakietów oraz instalacji:
# sudo apt update # sudo apt install snmp snmpd snmp-mibs-downloader
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:
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:
sudo touch /var/log/trap_test1.log sudo chmod 666 /var/log/trap_test1.log
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:
# sudo tcpdump -i enp2s0 -n -v | grep "192.168.53.110.162"
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:
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:
# sudo journalctl -u snmptrapd --since "10 minutes ago"
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.
- uruchamiamy powłokę PowerShell jako administrator
- Wpisujemy poniższe polecenie i zatwierdzamy:
c:\> Add-WindowsCapability -Online -Name "SNMP.Client~~~~0.0.1.0"
- 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
- 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
- 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:
c:\> Get-Service | Where-Object {$_.Status -eq "Running"}
Konfiguracja
- Dwukrotnie kliknij w nazwę usługi SNMP i powinna być zaznaczona opcje ‚Typ uruchomienia: automatyczny’ oraz ‚Stan usługi: Działa’
- 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’
- 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.
- W zakładce ‚Agent’ możemy uzupełnić informacje kontaktowe na temat tej maszyny
- Zatwierdzamy klikając ‚OK’
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:
c:\> Get-NetFirewallRule -DisplayName "*snmp*" | Format-Table Name, DisplayName, Enabled, Direction, Action
lub
c:\> Get-NetFirewallPortFilter -Protocol UDP | Where-Object {$_.LocalPort -eq 161} | Get-NetFirewallRule | Format-Table DisplayName, Enabled, Direction, Action
Jeśli reguły już są zobaczymy coś jak niżej:
Jeśli reguł brak to możemy taką dodać poleceniem:
c:\> New-NetFirewallRule -DisplayName "Zezwalaj na SNMP (UDP-In)" -Direction Inbound -Protocol UDP -LocalPort 161 -Action Allow
Testowanie
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:
RouterOS
Tutaj nic nie trzeba instalować, wystarczy tylko włączyć. Na konsoli wygląda to tak (za pomocą WinBox menu IP/SNMP):
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 przeleci po ekranie masa informacji.
Cisco
…











