4 SNMP trap
Omówienie
Odbieranie pułapek SNMP jest przeciwieństwem odpytywania urządzeń obsługujących SNMP.
W tym przypadku informacje są wysyłane z urządzenia obsługującego SNMP do snmptrapd i są zbierane lub „przechwytywane” przez serwer Zabbix albo proxy Zabbix z pliku.
Zazwyczaj pułapki są wysyłane po zmianie pewnego 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ń). Używanie pułapek może wykrywać krótkotrwałe problemy, które występują pomiędzy interwałami zapytań i mogą zostać pominięte przez dane z zapytań.
Odbieranie pułapek SNMP w Zabbix zostało zaprojektowane do współpracy z snmptrapd oraz jednym z mechanizmów przekazywania pułapek do Zabbix - albo skryptem Bash lub Perl, albo SNMPTT.
Najprostszym sposobem skonfigurowania monitorowania pułapek po skonfigurowaniu Zabbix
jest użycie rozwiązania ze skryptem Bash, ponieważ Perl i SNMPTT często
brakuje w nowoczesnych dystrybucjach i wymagają bardziej złożonej konfiguracji.
Jednak to rozwiązanie używa skryptu skonfigurowanego jako traphandle.
Dla lepszej wydajności w systemach produkcyjnych użyj wbudowanego rozwiązania Perl
(albo skryptu z opcją do perl, albo SNMPTT).
Przebieg odbierania pułapki:
snmptrapdodbiera pułapkę.snmptrapdprzekazuje pułapkę do skryptu odbierającego (Bash, Perl) lub SNMPTT.- Odbiornik analizuje, formatuje i zapisuje pułapkę do pliku.
- Trapper SNMP Zabbix odczytuje i analizuje plik z pułapkami.
- Dla każdej pułapki Zabbix znajduje wszystkie pozycje trappera SNMP z interfejsami hosta pasującymi do otrzymanego adresu pułapki. Należy pamiętać, że podczas dopasowywania używany jest tylko wybrany IP lub DNS w interfejsie hosta.
- 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 i istnieje pozycjasnmptrap.fallback, pułapka jest ustawiana jako jej wartość. - Jeśli pułapka nie została ustawiona jako wartość żadnej pozycji, Zabbix domyślnie rejestruje niedopasowaną pułapkę. (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 trapów SNMP
Ten typ pozycji wymaga następującej konfiguracji frontend:
Krok 1: Utwórz interfejs SNMP dla hosta
- W Data collection > Hosts, utwórz host lub edytuj istniejący.
- W polu Interfaces wybierz typ interfejsu SNMP.
- Wprowadź adres IP/nazwę DNS oraz numer portu.
- Wybierz wersję SNMP z listy rozwijanej: (SNMPv1, SNMPv2, lub SNMPv3) i dodaj dane uwierzytelniające interfejsu w zależności od wybranej wersji SNMP.
Adres z każdego odebranego trapu będzie porównywany z adresami IP i DNS wszystkich interfejsów SNMP, aby znaleźć odpowiadające hosty.
Krok 2: Skonfiguruj pozycję
- Dla hosta utwórz pozycję lub edytuj istniejącą.
-
W polu Key użyj jednego z kluczy trapów SNMP:
snmptrap[regexp]- przechwytuje wszystkie trapy SNMP, które pasują do wyrażenia regularnego określonego w parametrzeregexp; jeśliregexpnie jest określony, przechwytuje dowolny trap.
W parametrze są obsługiwane makra użytkownika i globalne wyrażenia regularne.
Wartość zwracana: trap SNMP.
Tę pozycję można ustawić tylko dla interfejsów SNMP.snmptrap.fallback- przechwytuje wszystkie trapy SNMP, które nie zostały przechwycone przez żadne pozycjesnmptrap[]dla tego interfejsu.
Wartość zwracana: trap SNMP.
Tę pozycję można ustawić tylko dla interfejsów SNMP.
Obecnie nie jest obsługiwane dopasowywanie wielowierszowych wyrażeń regularnych.
- Ustaw Type of information na Log, aby znaczniki czasu mogły zostać przeanalizowane. Inne formaty, takie jak Numeric, są również akceptowalne, ale mogą wymagać niestandardowego modułu obsługi trapów.
Konfigurowanie monitorowania pułapek SNMP
Konfigurowanie serwera/proxy Zabbix
Aby odczytywać trapy, serwer Zabbix lub proxy musi być skonfigurowany tak, aby uruchamiał proces SNMP trapper i wskazywał plik trapów, do którego zapisuje SNMPTT lub odbiornik trapów Bash/Perl.
W tym celu należy edytować plik konfiguracyjny (zabbix\_server.conf lub zabbix\_proxy.conf):
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
Jeśli używany jest parametr systemd PrivateTmp, ten plik prawdopodobnie nie będzie działał w /tmp.
Konfigurowanie odbiornika trapów Bash
Wymagania: tylko snmptrapd.
Skrypt odbiornika trapów Bash script
może być użyty do przekazywania trapów do serwera Zabbix z snmptrapd za pomocą pliku trapper. Aby
go skonfigurować, dodaj opcję traphandle do pliku konfiguracyjnego snmptrapd (snmptrapd.conf),
zobacz przykład.
Może być konieczne ponowne uruchomienie snmptrapd, aby uwzględnił zmiany w konfiguracji.
Konfigurowanie odbiornika trapów Perl
Wymagania: Perl, Net-SNMP skompilowany z --enable-embedded-perl (domyślnie od Net-SNMP 5.4)
Odbiornik trapów Perl (szukaj misc/snmptrap/zabbix\_trap\_receiver.pl) może być używany do przekazywania trapów do serwera Zabbix bezpośrednio z snmptrapd.
Aby go skonfigurować:
- Dodaj skrypt Perl do pliku konfiguracyjnego snmptrapd (
snmptrapd.conf), np.:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
- skonfiguruj odbiornik, np.:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
snmptrapd może wymagać ponownego uruchomienia, aby uwzględnić zmiany w konfiguracji.
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 do używania SNMPTT.
Dla najlepszej wydajności SNMPTT powinien być skonfigurowany jako demon z użyciem snmptthandler-embedded, aby przekazywać do niego pułapki.
Instrukcje znajdziesz w sekcji konfigurowania SNMPTT.
Gdy SNMPTT jest skonfigurowany do odbierania pułapek, skonfiguruj snmptt.ini:
- Włącz użycie modułu Perl z pakietu
NET-SNMP:
net_snmp_perl_enable = 1
- Zapisuj pułapki do pliku pułapek, który będzie odczytywany przez Zabbix:
log_enable = 1
log_file = [TRAP FILE]
- 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; dodano go ponownie w RHEL 8.3.
Więcej informacji znajdziesz w sekcji znane problemy.
Teraz sformatuj pułapki tak, aby Zabbix mógł je rozpoznać (edytuj snmptt.conf):
- Każda instrukcja
FORMATpowinna zaczynać się odZBXTRAP [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)
- Więcej informacji o formacie pułapek SNMP znajdziesz poniżej.
Nie używaj nieznanych pułapek - Zabbix nie będzie w stanie ich rozpoznać.
Nieznane pułapki można obsłużyć, definiując ogólne zdarzenie w snmptt.conf:
EVENT general .* "General event" Normal
Format trapu SNMP
Wszystkie niestandardowe odbiorniki trapów Perl oraz konfiguracja trapów SNMPTT muszą formatować trap 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 zaczyna się nowy trap.[address]- adres IP używany do znalezienia hosta dla tego trapu.
Zwróć uwagę, że ZBXTRAP i [address] zostaną usunięte z komunikatu podczas przetwarzania.
Jeśli trap ma inny format, Zabbix może zinterpretować trapy w nieoczekiwany sposób.
Przykładowy trap:
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ącego trapu 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 własnego mechanizmu rotacji logów — powinien być on obsługiwany przez użytkownika. Rotacja logów powinna najpierw zmienić nazwę starego pliku, a dopiero później go usunąć, aby nie utracić żadnych trapów:
- Zabbix otwiera plik trapów w ostatnio znanej lokalizacji i przechodzi do kroku 3.
- Zabbix sprawdza, czy aktualnie otwarty plik został zrotowany, porównując numer inode z numerem inode zdefiniowanego pliku trapów. Jeśli nie ma otwartego pliku, Zabbix resetuje ostatnią lokalizację i przechodzi do kroku 1.
- Zabbix odczytuje dane z aktualnie otwartego pliku i ustawia nową lokalizację.
- Nowe dane są analizowane. Jeśli był to zrotowany plik, plik zostaje zamknięty i następuje powrót do kroku 2.
- Jeśli nie było nowych danych, Zabbix usypia na 1 sekundę i wraca do kroku 2.
System plików
Ze względu na implementację pliku trap, Zabbix wymaga, aby system plików obsługiwał i-węzły, aby rozróżniać pliki (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 odbierający Bash do przekazywania pułapek do serwer Zabbix.
Konfiguracja:
- Skonfiguruj Zabbix tak, aby uruchamiał SNMP trapper i ustaw plik pułapek. Dodaj do
zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
- 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/7.4/templates/scripts/snmptraps/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
- Dodaj następującą konfigurację 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 uwzględnił zmiany w konfiguracji.
-
Utwórz pozycję SNMP TEST (pamiętaj o początkowych wymaganiach konfiguracyjnych):
Type: SNMP trap
Type of information: Log
Host interface: SNMP 127.0.0.1
Key:snmptrap["linkUp"]
Log time format:yyyyMMdd.hhmmss
Zwróć uwagę, że używany jest format daty i czasu ISO 8601.
- Następnie skonfigurujemy
snmptrapddla wybranej wersji protokołu SNMP i wyślemy testowe pułapki za pomocą narzędziasnmptrap.
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 on mieć tę samą wartość na nadawcach pułapek SNMP.
Należy pamiętać, że chociaż SNMPv2 jest nadal szeroko używany w środowiskach produkcyjnych, nie zapewnia szyfrowania ani rzeczywistego uwierzytelniania nadawcy. Dane są przesyłane jako zwykły tekst, dlatego tych wersji protokołu należy używać wyłącznie w bezpiecznych środowiskach, takich jak sieć prywatna, i nigdy nie należy ich używać w żadnej publicznej ani zewnętrznej sieci.
Wersja SNMP 1 nie jest obecnie właściwie używana, ponieważ nie obsługuje liczników 64-bitowych i jest uznawana za protokół przestarzały.
Aby włączyć odbieranie pułapek SNMPv1 lub SNMPv2, należy dodać następującą linię do snmptrapd.conf.
Zastąp secret ciągiem community SNMP skonfigurowanym na nadawcach pułapek SNMP:
authCommunity log,execute,net secret
Następnie możemy wysłać testową pułapkę 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żesz użyć metod uwierzytelniania MD5 lub wielu SHA oraz DES/wielu AES jako szyfru.
Aby włączyć odbieranie SNMPv3, dodaj następujące linie do snmptrapd.conf:
createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest
Zwróć uwagę na słowo kluczowe "execute", które umożliwia wykonywanie skryptów 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 w wersji 5.8 lub nowszej. Może być konieczna rekompilacja 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 Perlem:
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