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

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

[comment]: # ({811a26b0-ff07904b})
#### Visão geral

Receber traps SNMP é o oposto de consultar dispositivos habilitados para SNMP.

Nesse caso, as informações são enviadas de um dispositivo habilitado para SNMP para o snmptrapd e são coletadas ou "capturadas" pelo Zabbix server ou Zabbix proxy a partir de um arquivo.

Normalmente, os traps são enviados quando ocorre alguma mudança de condição e o agent
se conecta ao server na porta 162 (em oposição à porta 161 no lado do agent,
que é usada para consultas). O uso de traps pode detectar alguns problemas
breves que ocorrem entre os intervalos de consulta e que podem passar
despercebidos pelos dados consultados.

O recebimento de traps SNMP no Zabbix foi projetado para funcionar com **snmptrapd**
e um dos mecanismos para encaminhar os traps para o Zabbix -
seja um script Bash ou Perl, ou SNMPTT.

::: noteclassic
A maneira mais simples de configurar o monitoramento de traps após configurar o Zabbix
é usar a solução com script Bash, porque Perl e SNMPTT muitas vezes
estão ausentes em distribuições modernas e exigem uma configuração mais complexa.
No entanto, essa solução usa um script configurado como `traphandle`.
Para melhor desempenho em sistemas de produção, use a solução com Perl incorporado
(seja um script com a opção `do perl` ou SNMPTT).
:::

O fluxo de trabalho para receber um trap:

1.  `snmptrapd` recebe um trap.
2.  `snmptrapd` encaminha o trap para o script receptor (Bash, Perl) ou SNMPTT.
3.  O receptor analisa, formata e grava o trap em um arquivo.
4.  O Zabbix SNMP trapper lê e analisa o arquivo de traps.
5.  Para cada trap, o Zabbix encontra todos os itens SNMP trapper com interfaces de host que correspondem ao endereço do trap recebido.
    Observe que apenas o *IP* ou *DNS* selecionado na interface do host é usado durante a correspondência.
6.  Para cada item encontrado, o trap é comparado com a regexp em `snmptrap[regexp]`.
    O trap é definido como o valor de **todos** os itens correspondentes.
    Se nenhum item correspondente for encontrado e houver um item `snmptrap.fallback`, o trap é definido como o valor dele.
7.  Se o trap não tiver sido definido como o valor de nenhum item, o Zabbix, por padrão, registra o trap não correspondente.
    (Isso é configurado por *Registrar traps SNMP não correspondentes* em *Administração* > *Geral* > *Outros*.)

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

[comment]: # ({3b1ff1a9-657fb528})
##### Notas sobre failover de HA

Durante a troca de nó de alta disponibilidade (HA), o Zabbix continuará o processamento após o último registro dentro do último timestamp ISO 8601; se o mesmo registro não for encontrado, apenas o timestamp será usado para identificar a última posição.

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

[comment]: # ({e5746000-a8df124c})
#### Configurando traps SNMP

Este tipo de item requer a seguinte configuração no frontend:

##### Etapa 1: Criar uma interface SNMP para o host

1. Em *Coleta de dados > Hosts*, [crie um host](/manual/config/hosts/host) ou edite o existente.
2. No campo *Interfaces*, selecione o tipo de interface *SNMP*.
3. Informe o endereço IP/nome DNS e o número da porta.
4. Selecione a *versão SNMP* no menu suspenso: ([*SNMPv1*, *SNMPv2*](#snmpv-snmpv), ou [*SNMPv3*](#snmpv)) e adicione as credenciais da interface de acordo com a versão SNMP selecionada.

O endereço de cada trap recebido será comparado aos endereços IP e DNS de todas as interfaces SNMP para encontrar os hosts correspondentes.

##### Etapa 2: Configurar o item

1. Para o host, [crie um item](/manual/config/items/item) ou edite o existente.
2. No campo *Key*, use uma das chaves de trap SNMP:

    -   `snmptrap[regexp]` - captura todos os traps SNMP que correspondem à [expressão regular](/manual/regular_expressions) especificada no parâmetro `regexp`; se `regexp` não for especificado, captura qualquer trap.<br>
        Macros de usuário e expressões regulares globais são suportadas no parâmetro.<br>
        Valor de retorno: trap SNMP.<br>
        Este item pode ser definido apenas para interfaces SNMP.
    -   `snmptrap.fallback` - captura todos os traps SNMP que não foram capturados por nenhum dos itens `snmptrap[]` para essa interface.<br>
        Valor de retorno: trap SNMP.<br>
        Este item pode ser definido apenas para interfaces SNMP.

::: noteclassic
A correspondência de expressões regulares em várias linhas não é suportada neste momento.
:::

3. Defina *Tipo de informação* como *Log* para que os timestamps sejam analisados. Outros formatos, como *Numérico*, também são aceitáveis, mas podem exigir um manipulador de trap personalizado.

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

[comment]: # ({56d22f70-a08bce2a})
#### Configurando o monitoramento de traps SNMP

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

[comment]: # ({0ce4b7cf-581aa946})
##### Configurando o Zabbix server/proxy

Para ler os traps, o Zabbix server ou proxy deve ser configurado para iniciar o processo SNMP trapper e apontar para o arquivo de traps que está sendo gravado pelo SNMPTT ou por um receptor de traps em Bash/Perl.
Para isso, edite o arquivo de configuração ([`zabbix\_server.conf`](/manual/appendix/config/zabbix_server) ou [`zabbix\_proxy.conf`](/manual/appendix/config/zabbix_proxy)):

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

::: notewarning
Se o parâmetro do systemd [`PrivateTmp`](http://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateTmp=) for usado, é improvável que este arquivo funcione em `/tmp`.
:::

##### Configurando o receptor de traps em Bash

Requisitos: apenas snmptrapd.

Um [script](https://raw.githubusercontent.com/zabbix/zabbix-docker/7.4/templates/scripts/snmptraps/zabbix_trap_handler.sh) de receptor de traps em Bash
pode ser usado para encaminhar traps para o Zabbix server a partir do snmptrapd usando o arquivo do trapper. Para
configurá-lo, adicione a opção `traphandle` ao arquivo de configuração do snmptrapd (`snmptrapd.conf`),
veja o [exemplo](https://raw.githubusercontent.com/zabbix/zabbix-docker/7.4/templates/config/snmptraps/snmp/snmptrapd.conf).

:::notetip
Pode ser necessário reiniciar o snmptrapd para que as alterações na configuração sejam aplicadas.
:::

[comment]: # ({/0ce4b7cf-581aa946})

[comment]: # ({2bf8b8af-0aa82990})
##### Configurando o receptor de traps Perl

Requisitos: Perl, Net-SNMP compilado com `--enable-embedded-perl` (feito por padrão desde o Net-SNMP 5.4)

Um receptor de traps Perl (procure por `misc/snmptrap/zabbix\_trap\_receiver.pl`) pode ser usado para encaminhar traps para o Zabbix server diretamente do snmptrapd.
Para configurá-lo:

-   Adicione o script Perl ao arquivo de configuração do snmptrapd (`snmptrapd.conf`), por exemplo:

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

-   configure o receptor, por exemplo:

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

:::notetip
Talvez seja necessário reiniciar o snmptrapd para que ele carregue as alterações em sua configuração.
:::

::: notetip
Se o nome do script não estiver entre aspas, o snmptrapd recusará iniciar, com mensagens semelhantes a estas:<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]: # ({/2bf8b8af-0aa82990})

[comment]: # ({b937712d-af1e38f9})
##### Configurando o SNMPTT

Primeiro, o `snmptrapd` deve ser configurado para usar o SNMPTT.

::: notetip
Para obter o melhor desempenho, o SNMPTT deve ser configurado como um daemon usando `snmptthandler-embedded` para encaminhar os traps para ele.
Veja as instruções para [configurar o SNMPTT](http://snmptt.sourceforge.net/docs/snmptt.shtml).
:::

Quando o SNMPTT estiver configurado para receber os traps, configure `snmptt.ini`:

1. Habilite o uso do módulo Perl do pacote `NET-SNMP`:

```ini
net_snmp_perl_enable = 1
```

2. Registre os traps no arquivo de traps que será lido pelo Zabbix:

```ini
log_enable = 1
log_file = [TRAP FILE]
```
    
3. Defina o formato de data e hora:

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

::: notewarning
O pacote `net-snmp-perl` foi removido no RHEL 8.0-8.2; foi reintroduzido no RHEL 8.3.
Para mais informações, consulte os [problemas conhecidos](/manual/installation/known_issues#snmp-traps).
:::

Agora formate os traps para que o Zabbix os reconheça (edite `snmptt.conf`):

1. Cada instrução `FORMAT` deve começar com `ZBXTRAP [address]`, em que `[address]` será comparado aos endereços IP e DNS das interfaces SNMP no Zabbix.
Por exemplo:

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

2. Veja mais sobre o formato de trap SNMP abaixo.

::: noteimportant
Não use traps desconhecidos - o Zabbix não conseguirá reconhecê-los. 
Traps desconhecidos podem ser tratados definindo um evento geral em `snmptt.conf`:<br><br>

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

:::

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

[comment]: # ({b354a28f-cd001892})
##### Formato de trap SNMP

Todos os receivers de trap Perl personalizados e a configuração de trap do SNMPTT devem
formatar o trap da seguinte maneira:

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

onde

-   `[timestamp]` - o timestamp no formato `%Y-%m-%dT%H:%M:%S%z`.
-   `ZBXTRAP` - cabeçalho que indica que um novo trap começa nesta linha.
-   `[address]` - endereço IP usado para localizar o host para este trap.

Observe que `ZBXTRAP` e `[address]` serão removidos da mensagem durante o processamento.
Se o trap for formatado de outra maneira, o Zabbix poderá interpretar os traps de forma inesperada.

Exemplo de 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
```

Isso resultará no seguinte trap para a interface SNMP com 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})
#### Requisitos do sistema

::: noteclassic
Recomenda-se [instalar arquivos MIB](/manual/config/items/itemtypes/snmp/mibs)
para garantir que os valores dos items sejam exibidos no formato correto.
Sem os arquivos MIB, podem ocorrer problemas de formatação, como exibir valores em HEX em vez de UTF-8 ou vice-versa.
:::

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

[comment]: # ({3866234a-6245c6ae})
##### Suporte a arquivos grandes

O Zabbix possui suporte a arquivos grandes para arquivos de SNMP trapper. O tamanho máximo de arquivo que o Zabbix pode ler é 2\^63 (8 EiB). Observe que o sistema de arquivos pode impor um limite inferior ao tamanho do arquivo.

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

[comment]: # ({754aa7b8-0f27a9bb})
##### Rotação de logs

O Zabbix não fornece nenhum sistema de rotação de logs - isso deve ser tratado
pelo usuário. A rotação de logs deve primeiro renomear o arquivo antigo e somente depois excluí-lo, para que nenhum trap seja perdido:

1.  O Zabbix abre o arquivo de trap no último local conhecido e vai para a etapa 3.
2.  O Zabbix verifica se o arquivo atualmente aberto foi rotacionado comparando o número do inode com o número do inode do arquivo de trap definido.
    Se não houver nenhum arquivo aberto, o Zabbix redefine o último local e vai para a etapa 1.
3.  O Zabbix lê os dados do arquivo atualmente aberto e define o novo local.
4.  Os novos dados são analisados. Se este era o arquivo rotacionado, o arquivo é fechado e volta para a etapa 2.
5.  Se não houver novos dados, o Zabbix dorme por 1 segundo e volta para a etapa 2.

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

[comment]: # ({6da22db2-608a14bd})
##### Sistema de arquivos

Devido à implementação do arquivo de trap, o Zabbix precisa que o sistema de arquivos ofereça suporte a inodes para diferenciar arquivos (as informações são obtidas por uma chamada `stat()`).

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

[comment]: # ({51071ded-ee69482d})
#### Exemplos de configuração usando diferentes versões do protocolo SNMP

Este exemplo usa o snmptrapd e um script Bash receptor para encaminhar traps para o server Zabbix.

Configuração:

1.  Configure o Zabbix para iniciar o SNMP trapper e defina o arquivo de traps. Adicione ao `zabbix_server.conf`:

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

2.  Baixe o script Bash para `/usr/sbin/zabbix_trap_handler.sh`:

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

Se necessário, ajuste a variável `ZABBIX_TRAPS_FILE` no script.
Para usar o valor padrão, crie primeiro o diretório pai:

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

3. Adicione o seguinte ao `snmtrapd.conf` (consulte o [exemplo](https://raw.githubusercontent.com/zabbix/zabbix-docker/7.4/templates/config/snmptraps/snmp/snmptrapd.conf) em funcionamento)

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

:::notetip
Talvez seja necessário reiniciar o snmptrapd para que ele carregue as alterações em sua configuração.
:::

4.  [Crie](/manual/config/items/item) um item SNMP TEST (lembre-se dos [requisitos iniciais de configuração](/manual/config/items/itemtypes/snmptrap#configuring-snmp-traps)):

    Type: *SNMP trap*<br>
    Type of information: *Log*<br>
    Host interface: *SNMP 127.0.0.1*<br>
    Key: `snmptrap["linkUp"]`<br>
    Log time format: `yyyyMMdd.hhmmss`

Observe que o formato de data e hora ISO 8601 é usado.

5.  Em seguida, vamos configurar o `snmptrapd` para a versão do protocolo SNMP escolhida e enviar traps de teste usando o utilitário `snmptrap`.

##### SNMPv1, SNMPv2

Os protocolos SNMPv1 e SNMPv2 dependem de autenticação por "community string". No exemplo abaixo,
usaremos "secret" como community string. Ele deve ser definido com o mesmo valor nos remetentes de traps SNMP.

Observe que, embora ainda seja amplamente usado em ambientes de produção, o SNMPv2 não oferece
criptografia nem autenticação real do remetente. Os dados são enviados em texto simples e, portanto,
essas versões do protocolo devem ser usadas apenas em ambientes seguros, como uma rede privada,
e nunca devem ser usadas em qualquer rede pública ou de terceiros.

A versão 1 do SNMP não é realmente usada hoje em dia, pois não oferece suporte a contadores de 64 bits e
é considerada um protocolo legado.

Para habilitar o recebimento de traps SNMPv1 ou SNMPv2, adicione a seguinte linha ao `snmptrapd.conf`.
Substitua `secret` pela community string SNMP configurada nos remetentes de traps SNMP:

```ini
authCommunity log,execute,net secret
```

Em seguida, podemos enviar uma trap de teste usando `snmptrap`. Usaremos o OID comum "link up" neste exemplo:

```bash
snmptrap -v 2c -c secret localhost '' linkUp.0
```

##### SNMPv3

O SNMPv3 resolve os problemas de segurança do SNMPv1/v2 e fornece autenticação e criptografia.
Você pode usar os métodos de autenticação MD5 ou múltiplos SHA e DES/múltiplos AES como cifra.

Para habilitar o recebimento de SNMPv3, adicione as seguintes linhas ao `snmptrapd.conf`:

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

:::noteimportant
Observe a palavra-chave "execute", que permite executar scripts para este modelo de segurança de usuário.
:::

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

::: notewarning
Se você quiser usar métodos de criptografia fortes, como AES192 ou AES256, use
net-snmp a partir da versão 5.8. Talvez seja necessário recompilá-lo com a opção
`configure`: `--enable-blumenthal-aes`.
Versões mais antigas do net-snmp não oferecem suporte a AES192/AES256.
Veja também: [Strong Authentication or Encryption](http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption).
:::

##### Verificação

Em ambos os exemplos, você verá linhas semelhantes em seu `/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

```

O valor do item no Zabbix será:

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

Exemplo com 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]: # ({/51071ded-ee69482d})

[comment]: # ({91956d23-75026475})
#### Veja também

-   [Artigo do blog Zabbix sobre traps SNMP](https://blog.zabbix.com/snmp-traps-in-zabbix)
-   [Configurando snmptrapd (documentação oficial do net-snmp)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd)
-   [Configurando snmptrapd para receber notificações SNMPv3 (documentação oficial do net-snmp)](https://net-snmp.sourceforge.io/wiki/index.php/TUT:Configuring_snmptrapd_to_receive_SNMPv3_notifications)

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