3 Pułapki SNMP

Przegląd

Odbieranie pułapek SNMP jest przeciwieństwem odpytywania urządzeń z włączonym SNMP.

W tym przypadku informacje są wysyłane z urządzenia z włączonym SNMP do snmptrapd i są zbierane lub „przechwytywane” przez serwer Zabbix lub proxy Zabbix z pliku.

Zwykle pułapki są wysyłane po wystąpieniu zmiany jakiegoś warunku, a agent łączy się z serwerem na porcie 162 (w przeciwieństwie do portu 161 po stronie agenta, który jest używany do zapytań). Korzystanie z pułapek może umożliwić wykrycie krótkotrwałych problemów występujących pomiędzy kolejnymi odpytywaniami, które mogłyby zostać pominięte przez dane z zapytań.

Odbieranie pułapek SNMP w Zabbix zostało zaprojektowane do współpracy z snmptrapd oraz z jednym z mechanizmów przekazywania pułapek do Zabbix — skryptem Bash lub Perl albo SNMPTT.

Najprostszym sposobem skonfigurowania monitorowania pułapek po skonfigurowaniu Zabbix jest użycie rozwiązania opartego na skrypcie Bash, ponieważ Perl i SNMPTT często nie są dostępne we współczesnych dystrybucjach i wymagają bardziej złożonej konfiguracji. Jednak to rozwiązanie wykorzystuje skrypt skonfigurowany jako traphandle. Aby uzyskać lepszą wydajność w systemach produkcyjnych, użyj rozwiązania z osadzonym Perlem (skrypt z opcją do perl lub SNMPTT).

Przebieg odbierania pułapki:

  1. snmptrapd odbiera pułapkę
  2. snmptrapd przekazuje pułapkę do skryptu odbierającego (Bash, Perl) lub do SNMPTT
  3. Odbiornik analizuje, formatuje i zapisuje pułapkę do pliku
  4. Moduł SNMP trapper Zabbix odczytuje i analizuje plik pułapek
  5. Dla każdej pułapki Zabbix znajduje wszystkie pozycje „SNMP trapper” z interfejsami hosta pasującymi do adresu odebranej pułapki. Należy pamiętać, że podczas dopasowywania używane jest tylko wybrane „IP” lub „DNS” w interfejsie hosta.
  6. Dla każdej znalezionej pozycji pułapka jest porównywana z wyrażeniem regularnym w snmptrap[regexp]. Pułapka jest ustawiana jako wartość wszystkich dopasowanych pozycji. Jeśli nie zostanie znaleziona żadna pasująca pozycja, a istnieje pozycja snmptrap.fallback, pułapka jest ustawiana jako jej wartość.
  7. Jeśli pułapka nie została ustawiona jako wartość żadnej pozycji, Zabbix domyślnie zapisuje niedopasowaną pułapkę w logu. (Jest to konfigurowane przez opcję „Log unmatched SNMP traps” w Administration > General > Other.)
Uwagi dotyczące przełączenia awaryjnego HA

Podczas przełączania węzła wysokiej dostępności (HA) Zabbix będzie kontynuował przetwarzanie od ostatniego rekordu w ramach ostatniego znacznika czasu ISO 8601; jeśli ten sam rekord nie zostanie znaleziony, do określenia ostatniej pozycji zostanie użyty tylko znacznik czasu.

Konfigurowanie pułapek SNMP

Ten typ pozycji wymaga następującej konfiguracji frontend.

1. Utwórz interfejs SNMP dla swojego hosta

  • W Data collection > Hosts utwórz/edytuj host, a w polu Interfaces dodaj interfejs typu „SNMP”, podając adres IP lub DNS.

    Adres z każdej odebranej pułapki będzie porównywany z adresami IP i DNS wszystkich interfejsów SNMP w celu znalezienia odpowiadających hostów.

2. Skonfiguruj pozycję

  • W Data collection > Hosts utwórz/edytuj wymaganą pozycję.
  • W polu Key użyj jednego z kluczy pułapek SNMP:
Key
Description Return value Comments
snmptrap[regexp]
Przechwytuje wszystkie pułapki SNMP pasujące do wyrażenia regularnego określonego w regexp. Jeśli regexp nie jest określone, przechwytuje dowolną pułapkę. Pułapka SNMP Tę pozycję można ustawić tylko dla interfejsów SNMP.
Makra użytkownika i globalne wyrażenia regularne są obsługiwane w parametrze tego klucza pozycji.
snmptrap.fallback
Przechwytuje wszystkie pułapki SNMP, które nie zostały przechwycone przez żaden z elementów snmptrap[] dla tego interfejsu. Pułapka SNMP Tę pozycję można ustawić tylko dla interfejsów SNMP.

Dopasowywanie wielowierszowych wyrażeń regularnych nie jest obecnie obsługiwane.

  • Ustaw Type of information na „Log”, aby znaczniki czasu były analizowane. Inne formaty, takie jak „Numeric”, są również akceptowalne, ale mogą wymagać niestandardowej obsługi pułapek.

Konfigurowanie monitorowania pułapek SNMP

Konfigurowanie serwera/proxy Zabbix

Aby odczytywać pułapki, serwer lub proxy Zabbix musi być skonfigurowany tak, aby uruchamiał proces SNMP trapper i wskazywał plik pułapek, do którego zapisuje SNMPTT lub odbiornik pułapek Bash/Perl. W tym celu edytuj plik konfiguracyjny (zabbix_server.conf lub zabbix_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Jeśli używany jest parametr systemd PrivateTmp , ten plik najprawdopodobniej nie będzie działał w /tmp.

Konfigurowanie odbiornika pułapek Bash

Wymagania: tylko snmptrapd.

Skrypt odbiornika pułapek Bash script może być używany do przekazywania pułapek do serwera Zabbix z snmptrapd przy użyciu pliku trapper. Aby go skonfigurować, dodaj opcję traphandle do pliku konfiguracyjnego snmptrapd (snmptrapd.conf), zobacz przykład.

Aby zastosować zmiany w konfiguracji snmptrapd, może być konieczne jego ponowne uruchomienie.

Konfigurowanie odbiornika trapów Perl

Wymagania: Perl, Net-SNMP skompilowany z opcją --enable-embedded-perl (domyślnie od Net-SNMP 5.4)

Odbiornik trapów Perl (plik znajduje się w misc/snmptrap/zabbix_trap_receiver.pl) może być używany do przekazywania trapów bezpośrednio do serwera Zabbix z snmptrapd. Aby go skonfigurować:

  • dodaj skrypt Perl do pliku konfiguracyjnego snmptrapd (snmptrapd.conf), na przykład:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • skonfiguruj odbiornik, na przykład:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

Aby zastosować zmiany w konfiguracji, może być konieczne ponowne uruchomienie snmptrapd.

Jeśli nazwa skryptu nie jest ujęta w cudzysłów, snmptrapd odmówi uruchomienia i wyświetli komunikaty podobne do poniższych:

Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of line
Konfigurowanie SNMPTT

Na początku należy skonfigurować snmptrapd tak, aby używał SNMPTT.

Aby uzyskać najlepszą wydajność, SNMPTT należy skonfigurować jako daemon z użyciem snmptthandler-embedded do przekazywania do niego trapów. Zobacz instrukcje dotyczące konfigurowania SNMPTT.

Gdy SNMPTT jest skonfigurowany do odbierania trapów, skonfiguruj snmptt.ini:

  1. włącz użycie modułu Perl z pakietu NET-SNMP:
net_snmp_perl_enable = 1
  1. zapisuj trapy do pliku trapów, który będzie odczytywany przez Zabbix:
log_enable = 1
log_file = [TRAP FILE]
  1. ustaw format daty i czasu:
date_time_format = %Y-%m-%dT%H:%M:%S%z

Pakiet "net-snmp-perl" został usunięty w RHEL 8.0-8.2; ponownie dodany w RHEL 8.3. Więcej informacji można znaleźć w sekcji known issues.

Teraz sformatuj trapy tak, aby Zabbix mógł je rozpoznawać (edytuj snmptt.conf):

  1. Każda instrukcja FORMAT powinna zaczynać się od "ZBXTRAP [address]", gdzie [address] będzie porównywany z adresami IP i DNS interfejsów SNMP w Zabbix. Na przykład:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Więcej informacji o formacie trapów SNMP znajduje się poniżej.

Nie używaj nieznanych trapów — Zabbix nie będzie w stanie ich rozpoznać. Nieznane trapy można obsłużyć, definiując ogólne zdarzenie w snmptt.conf:

EVENT general .* "General event" Normal
Format pułapki SNMP

Wszystkie niestandardowe odbiorniki pułapek Perl oraz konfiguracja pułapek SNMPTT muszą formatować pułapkę w następujący sposób:

[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]

gdzie

  • [timestamp] - znacznik czasu w formacie "%Y-%m-%dT%H:%M:%S%z"
  • ZBXTRAP - nagłówek wskazujący, że w tym wierszu rozpoczyna się nowa pułapka
  • [address] - adres IP używany do znalezienia hosta dla tej pułapki

Należy pamiętać, że "ZBXTRAP" oraz "[address]" zostaną usunięte z wiadomości podczas przetwarzania. Jeśli pułapka będzie sformatowana inaczej, Zabbix może parsować pułapki w nieoczekiwany sposób.

Przykładowa pułapka:

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state: 1. Operational state: 2

Spowoduje to utworzenie następującej pułapki dla interfejsu SNMP z IP=192.168.1.1:

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events"
localhost - Link down on interface 2. Admin state: 1. Operational state: 2

Wymagania systemowe

Zaleca się zainstalowanie plików MIB, aby zapewnić, że wartości pozycji będą wyświetlane w prawidłowym formacie. Bez plików MIB mogą wystąpić problemy z formatowaniem, takie jak wyświetlanie wartości w formacie HEX zamiast UTF-8 lub odwrotnie.

Obsługa dużych plików

Zabbix obsługuje duże pliki dla plików SNMP trapper. Maksymalny rozmiar pliku, jaki Zabbix może odczytać, wynosi 2\^63 (8 EiB). Należy pamiętać, że system plików może narzucać niższy limit rozmiaru pliku.

Rotacja logów

Zabbix nie zapewnia żadnego systemu rotacji logów — powinno to być obsługiwane przez użytkownika. Rotacja logów powinna najpierw zmienić nazwę starego pliku, a dopiero później go usunąć, aby żadne trapy nie zostały utracone:\

  1. Zabbix otwiera plik trapów w ostatniej znanej lokalizacji i przechodzi do kroku 3.
  2. Zabbix sprawdza, czy aktualnie otwarty plik został poddany rotacji, porównując numer inode z numerem inode zdefiniowanego pliku trapów. Jeśli żaden plik nie jest otwarty, Zabbix resetuje ostatnią lokalizację i przechodzi do kroku 1.
  3. Zabbix odczytuje dane z aktualnie otwartego pliku i ustawia nową lokalizację.
  4. Nowe dane są analizowane. Jeśli był to plik po rotacji, plik zostaje zamknięty i następuje powrót do kroku 2.
  5. Jeśli nie było nowych danych, Zabbix usypia się na 1 sekundę i wraca do kroku 2.
System plików

Ze względu na implementację pliku pułapki, Zabbix wymaga, aby system plików obsługiwał i-węzły w celu rozróżniania plików (informacje są pobierane za pomocą wywołania stat()).

Przykłady konfiguracji z użyciem różnych wersji protokołu SNMP

Ten przykład wykorzystuje snmptrapd oraz skrypt odbiornika Bash do przekazywania trapów do serwera Zabbix.

Konfiguracja:

  1. Skonfiguruj Zabbix tak, aby uruchamiał SNMP trapper i ustaw plik trapów. Dodaj do zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Pobierz skrypt Bash do /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh

W razie potrzeby dostosuj zmienną ZABBIX_TRAPS_FILE w skrypcie. Aby użyć wartości domyślnej, najpierw utwórz katalog nadrzędny:

mkdir -p /var/lib/zabbix/snmptraps
  1. Dodaj następujący wpis do snmtrapd.conf (zobacz działający przykład)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

Może być konieczne ponowne uruchomienie snmptrapd, aby wczytał zmiany w swojej konfiguracji.

  1. Utwórz pozycję SNMP TEST (pamiętaj o początkowych wymaganiach konfiguracyjnych):\

    Typ: SNMP trap
    Typ informacji: Log Interfejs hosta: SNMP 127.0.0.1
    Klucz: snmptrap["linkUp"]
    Format czasu logu: yyyyMMdd.hhmmss

Zwróć uwagę, że używany jest format daty i czasu ISO 8601.

  1. Następnie skonfigurujemy snmptrapd dla wybranej wersji protokołu SNMP i wyślemy testowe trapy za pomocą narzędzia snmptrap.
SNMPv1, SNMPv2

Protokoły SNMPv1 i SNMPv2 opierają się na uwierzytelnianiu za pomocą „community string”. W poniższym przykładzie użyjemy „secret” jako community string. Musi ona być ustawiona na tę samą wartość u nadawców trapów SNMP.

Należy pamiętać, że mimo iż SNMPv2 jest nadal szeroko używany w środowiskach produkcyjnych, nie oferuje żadnego szyfrowania ani rzeczywistego uwierzytelniania nadawcy. Dane są przesyłane jawnym tekstem, dlatego te wersje protokołu powinny być używane wyłącznie w bezpiecznych środowiskach, takich jak sieć prywatna, i nigdy nie powinny być używane przez sieć publiczną ani sieć podmiotu trzeciego.

Wersja SNMP 1 nie jest obecnie praktycznie używana, ponieważ nie obsługuje liczników 64-bitowych i jest uznawana za przestarzały protokół.

Aby włączyć odbieranie trapów SNMPv1 lub SNMPv2, należy dodać następujący wiersz do snmptrapd.conf. Zastąp „secret” community string SNMP skonfigurowanym u nadawców trapów SNMP:

authCommunity log,execute,net secret

Następnie możemy wysłać testowy trap za pomocą snmptrap. W tym przykładzie użyjemy popularnego OID „link up”:

snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3

SNMPv3 rozwiązuje problemy bezpieczeństwa SNMPv1/v2 i zapewnia uwierzytelnianie oraz szyfrowanie. Można używać MD5 lub wielu metod uwierzytelniania SHA oraz DES/wielu wariantów AES jako szyfru.

Aby włączyć odbieranie SNMPv3, dodaj następujące wiersze do snmptrapd.conf:

createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest

Zwróć uwagę na słowo kluczowe „execute”, które pozwala wykonywać skrypty dla tego modelu bezpieczeństwa użytkownika.

snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0

Jeśli chcesz używać silnych metod szyfrowania, takich jak AES192 lub AES256, użyj net-snmp od wersji 5.8. Może być konieczne ponowne skompilowanie go z opcją configure: --enable-blumenthal-aes. Starsze wersje net-snmp nie obsługują AES192/AES256. Zobacz także: Strong Authentication or Encryption.

Weryfikacja

W obu przykładach zobaczysz podobne wiersze w /var/lib/zabbix/snmptraps/snmptraps.log:

2024-01-30T10:04:23+0200 ZBXTRAP 127.0.0.1
UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Wartość pozycji w Zabbix będzie następująca:

2024-01-30 10:04:23 2024-01-30 10:04:21 

2024-01-30T10:04:21+0200 UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Przykład z użyciem Perla:

2024-01-30T11:42:54+0200 ZBXTRAP 127.0.0.1
PDU INFO:
  receivedfrom                   UDP: [127.0.0.1]:58649->[127.0.0.1]:162
  notificationtype               TRAP
  version                        1
  community                      public
  errorstatus                    0
  transactionid                  1
  requestid                      2101882550
  messageid                      0
  errorindex                     0
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (457671) 1:16:16.71
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkUp.0

Zobacz także