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:
snmptrapdodbiera pułapkęsnmptrapdprzekazuje pułapkę do skryptu odbierającego (Bash, Perl) lub do SNMPTT- Odbiornik analizuje, formatuje i zapisuje pułapkę do pliku
- Moduł SNMP trapper Zabbix odczytuje i analizuje plik pułapek
- 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.
- 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 pozycjasnmptrap.fallback, pułapka jest ustawiana jako jej wartość. - 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:
- włącz użycie modułu Perl z pakietu NET-SNMP:
net_snmp_perl_enable = 1
- zapisuj trapy do pliku trapów, 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; 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):
- 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)
- 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:\
- Zabbix otwiera plik trapów w ostatniej znanej lokalizacji i przechodzi do kroku 3.
- 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.
- Zabbix odczytuje dane z aktualnie otwartego pliku i ustawia nową lokalizację.
- Nowe dane są analizowane. Jeśli był to plik po rotacji, plik zostaje zamknięty i następuje powrót do kroku 2.
- 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:
- 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
- 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
- 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.
-
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.
- Następnie skonfigurujemy
snmptrapddla wybranej wersji protokołu SNMP i wyślemy testowe trapy 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 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