[comment]: # (tags: snmp trap, trap, traps)

[comment]: # ({f40368a0-622befb9})
# 4 SNMP trap

[comment]: # ({/f40368a0-622befb9})

[comment]: # ({811a26b0-ff07904b})
#### 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.

::: noteclassic
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:

1.  `snmptrapd` odbiera pułapkę.
2.  `snmptrapd` przekazuje pułapkę do skryptu odbierającego (Bash, Perl) lub SNMPTT.
3.  Odbiornik analizuje, formatuje i zapisuje pułapkę do pliku.
4.  Trapper SNMP Zabbix odczytuje i analizuje plik z pułapkami.
5.  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.
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 i 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 rejestruje niedopasowaną pułapkę.
    (Jest to konfigurowane przez opcję *Log unmatched SNMP traps* w *Administration* > *General* > *Other*.)

[comment]: # ({/811a26b0-ff07904b})

[comment]: # ({3b1ff1a9-657fb528})
##### 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.

[comment]: # ({/3b1ff1a9-657fb528})

[comment]: # ({e5746000-a8df124c})
#### Konfigurowanie trapów SNMP

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

##### Krok 1: Utwórz interfejs SNMP dla hosta

1. W *Data collection > Hosts*, [utwórz host](/manual/config/hosts/host) lub edytuj istniejący.
2. W polu *Interfaces* wybierz typ interfejsu *SNMP*.
3. Wprowadź adres IP/nazwę DNS oraz numer portu.
4. Wybierz *wersję SNMP* z listy rozwijanej: ([*SNMPv1*, *SNMPv2*](#snmpv-snmpv), lub [*SNMPv3*](#snmpv)) 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ę

1. Dla hosta [utwórz pozycję](/manual/config/items/item) lub edytuj istniejącą.
2. W polu *Key* użyj jednego z kluczy trapów SNMP:

    -   `snmptrap[regexp]` - przechwytuje wszystkie trapy SNMP, które pasują do [wyrażenia regularnego](/manual/regular_expressions) określonego w parametrze `regexp`; jeśli `regexp` nie jest określony, przechwytuje dowolny trap.<br>
        W parametrze są obsługiwane makra użytkownika i globalne wyrażenia regularne.<br>
        Wartość zwracana: trap SNMP.<br>
        Tę pozycję można ustawić tylko dla interfejsów SNMP.
    -   `snmptrap.fallback` - przechwytuje wszystkie trapy SNMP, które nie zostały przechwycone przez żadne pozycje `snmptrap[]` dla tego interfejsu.<br>
        Wartość zwracana: trap SNMP.<br>
        Tę pozycję można ustawić tylko dla interfejsów SNMP.

::: noteclassic
Obecnie nie jest obsługiwane dopasowywanie wielowierszowych wyrażeń regularnych.
:::

3. 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.

[comment]: # ({/e5746000-a8df124c})

[comment]: # ({56d22f70-a08bce2a})
#### Konfigurowanie monitorowania pułapek SNMP

[comment]: # ({/56d22f70-a08bce2a})

[comment]: # ({35992c98-581aa946})
##### Konfigurowanie serwer/proxy Zabbix

Aby odczytywać pułapki, serwer Zabbix lub proxy muszą być skonfigurowane 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 należy edytować plik konfiguracyjny ([`zabbix\_server.conf`](/manual/appendix/config/zabbix_server) lub [`zabbix\_proxy.conf`](/manual/appendix/config/zabbix_proxy)):

```ini
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
```

::: notewarning
Jeśli używany jest parametr systemd [`PrivateTmp`](http://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateTmp=), ten plik prawdopodobnie nie będzie działać w `/tmp`.
:::

##### Konfigurowanie odbiornika pułapek Bash

Wymagania: tylko snmptrapd.

Skrypt odbiornika pułapek Bash [script](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/scripts/snmptraps/zabbix_trap_handler.sh)
może być używany do przekazywania pułapek do serwer Zabbix z snmptrapd za pomocą pliku trapper. Aby
go skonfigurować, dodaj opcję `traphandle` do pliku konfiguracyjnego snmptrapd (`snmptrapd.conf`),
zobacz [przykład](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/config/snmptraps/snmp/snmptrapd.conf).

:::notetip
snmptrapd może wymagać ponownego uruchomienia, aby uwzględnić zmiany w swojej konfiguracji.
:::

[comment]: # ({/35992c98-581aa946})

[comment]: # ({b886b6a4-0aa82990})
##### 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 serwer Zabbix bezpośrednio z snmptrapd.
Aby go skonfigurować:

-   Dodaj skrypt Perl do pliku konfiguracyjnego snmptrapd (`snmptrapd.conf`), np.:

```perl
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
```

-   Skonfiguruj odbiornik, np.:

```ini
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
```

:::notetip
snmptrapd może wymagać ponownego uruchomienia, aby uwzględnić zmiany w konfiguracji.
:::

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

```yaml
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
```

:::

[comment]: # ({/b886b6a4-0aa82990})

[comment]: # ({3f7b8028-af1e38f9})
##### Konfigurowanie SNMPTT

Na początku należy skonfigurować snmptrapd do używania SNMPTT.

::: notetip
Dla najlepszej wydajności SNMPTT powinien być skonfigurowany jako demon z użyciem `snmptthandler-embedded`, aby przekazywać do niego pułapki.
Instrukcje dotyczące [konfigurowania SNMPTT](http://snmptt.sourceforge.net/docs/snmptt.shtml).
:::

Gdy SNMPTT jest skonfigurowany do odbierania pułapek, skonfiguruj `snmptt.ini`:

1. Włącz użycie modułu Perl z pakietu `NET-SNMP`:

```ini
net_snmp_perl_enable = 1
```

2. Zapisuj pułapki do pliku pułapek, który będzie odczytywany przez Zabbix:

```ini
log_enable = 1
log_file = [TRAP FILE]
```
    
3.  Ustaw format daty i czasu:

```ini
date_time_format = %Y-%m-%dT%H:%M:%S%z
```

::: notewarning
Pakiet `net-snmp-perl` został usunięty w RHEL 8.0-8.2; ponownie dodany w RHEL 8.3.
Więcej informacji znajduje się w sekcji [znane problemy](/manual/installation/known_issues#snmp-traps).
:::

Teraz sformatuj pułapki tak, aby Zabbix mógł je rozpoznać (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.
Np.:

```ini
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
```

2.  Więcej informacji o formacie pułapek SNMP znajduje się poniżej.

::: noteimportant
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`:<br><br>

```ini
EVENT general .* "General event" Normal
```

:::

[comment]: # ({/3f7b8028-af1e38f9})

[comment]: # ({b354a28f-cd001892})
##### Format trapu SNMP

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

```yaml
[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:

```bash
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`:

```bash
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
```

[comment]: # ({/b354a28f-cd001892})

[comment]: # ({40179940-357f1824})
#### Wymagania systemowe

::: noteclassic
Zaleca się [zainstalowanie plików MIB](/manual/config/items/itemtypes/snmp/mibs),
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.
:::

[comment]: # ({/40179940-357f1824})

[comment]: # ({3866234a-6245c6ae})
##### 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.

[comment]: # ({/3866234a-6245c6ae})

[comment]: # ({754aa7b8-0f27a9bb})
##### 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:

1.  Zabbix otwiera plik trapów w ostatnio znanej lokalizacji i przechodzi do kroku 3.
2.  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.
3.  Zabbix odczytuje dane z aktualnie otwartego pliku i ustawia nową lokalizację.
4.  Nowe dane są analizowane. Jeśli był to zrotowany plik, plik zostaje zamknięty i następuje powrót do kroku 2.
5.  Jeśli nie było nowych danych, Zabbix usypia na 1 sekundę i wraca do kroku 2.

[comment]: # ({/754aa7b8-0f27a9bb})

[comment]: # ({6da22db2-608a14bd})
##### 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()`).

[comment]: # ({/6da22db2-608a14bd})

[comment]: # ({333ccd14-ee69482d})
#### 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:

1.  Skonfiguruj Zabbix tak, aby uruchamiał SNMP trapper i ustaw plik pułapek. Dodaj do `zabbix_server.conf`:

```ini
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
```

2.  Pobierz skrypt Bash do `/usr/sbin/zabbix_trap_handler.sh`:

```bash
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/scripts/snmptraps/zabbix_trap_handler.sh
```

Jeśli to konieczne, dostosuj zmienną `ZABBIX_TRAPS_FILE` w skrypcie.
Aby użyć wartości domyślnej, najpierw utwórz katalog nadrzędny:

```bash
mkdir -p /var/lib/zabbix/snmptraps
```

3.  Dodaj następującą konfigurację do `snmtrapd.conf` (zobacz działający [przykład](https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/config/snmptraps/snmp/snmptrapd.conf))

```ini
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
```

:::notetip
Może być konieczne ponowne uruchomienie snmptrapd, aby uwzględnił zmiany w konfiguracji.
:::

4.  [Utwórz](/manual/config/items/item) pozycję SNMP TEST (pamiętaj o początkowych [wymaganiach konfiguracyjnych](/manual/config/items/itemtypes/snmptrap#configuring-snmp-traps)):

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

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

5.  Następnie skonfigurujemy `snmptrapd` dla wybranej wersji protokołu SNMP i wyślemy testowe pułapki 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 on mieć tę samą wartość po stronie nadawców pułapek SNMP.

Należy pamiętać, że mimo iż 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 publicznych ani zewnętrznych sieciach.

Wersja SNMP 1 nie jest dziś 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 po stronie nadawców pułapek SNMP:

```ini
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":

```bash
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`:

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

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

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

::: notewarning
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](http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption).
:::

##### Weryfikacja

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

```bash
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:

```bash
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 Perl:

```perl
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
```

[comment]: # ({/333ccd14-ee69482d})

[comment]: # ({91956d23-75026475})
#### Zobacz także

-   [Artykuł na blogu Zabbix o pułapkach
    SNMP](https://blog.zabbix.com/snmp-traps-in-zabbix)
-   [Konfigurowanie snmptrapd (oficjalna dokumentacja net-snmp)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd)
-   [Konfigurowanie snmptrapd do odbierania powiadomień SNMPv3 (oficjalna dokumentacja net-snmp)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd_to_receive_SNMPv3_notifications)

[comment]: # ({/91956d23-75026475})
