3 Traps SNMP

Visão geral

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

Neste caso, a informação é enviada de um dispositivo habilitado para SNMP e é coletada ou "trapped" pelo Zabbix.

Normalmente, traps são enviadas quando há alguma mudança de condição, e o agente se conecta ao servidor na porta 162 (ao contrário da porta 161 no lado do agente, usada para consultas). O uso de traps pode detectar problemas curtos que ocorrem entre os intervalos de consulta e podem ser perdidos pelos dados de consulta.

Receber traps SNMP no Zabbix é projetado para funcionar com o snmptrapd e um dos mecanismos para passar as traps para o Zabbix – seja um script Bash ou Perl, ou o SNMPTT.

A maneira mais simples de configurar o monitoramento de traps após a configuração do Zabbix é usar a solução com script Bash, pois Perl e SNMPTT geralmente estão ausentes em distribuições modernas e requerem 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 Perl embutida (script com a opção do perl ou SNMPTT).

O workflow para receber uma trap é o seguinte:

  1. snmptrapd recebe uma trap
  2. snmptrapd passa a trap para o script receptor (Bash, Perl) ou SNMPTT
  3. O receptor analisa, formata e escreve a 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 correspondentes ao endereço da trap recebida. Note que apenas o "IP" ou "DNS" selecionado na interface do host é utilizado durante a correspondência
  6. Para cada item encontrado, a trap é comparada com a expressão regular no snmptrap[regexp]. A trap é definida como o valor de todos os itens correspondentes. Se nenhum item correspondente for encontrado e houver um item snmptrap.fallback, - a trap é definida como o valor desse item
  7. Se a trap não for definida como valor de nenhum item, o Zabbix, por padrão, registra a trap não correspondida. (Isso é configurado por "Log unmatched SNMP traps" em Administração→ Geral → Outros.)

#### Configurando traps SNMP

A configuração dos seguintes campos no frontend é específica para este tipo de item:

  • Seu host deve ter uma interface SNMP

Em Configuração → Hosts, no campo Host interface, configure uma interface SNMP com o IP ou endereço DNS correto. O endereço de cada trap recebida é comparado aos endereços IP e DNS de todas as interfaces SNMP para encontrar os hosts correspondentes.

  • Configure o item

No campo Key, utilize uma das chaves de trap SNMP:

Key
Descrição Valor de retorno Comentários
snmptrap[regexp]
Captura todas as traps SNMP que correspondem à regular expression especificada em regexp. Se regexp não for especificado, captura qualquer trap. Trap SNMP Este item só pode ser configurado para interfaces SNMP.
Macros de usuário e expressões regulares globais são suportadas no parâmetro desta chave de item.
snmptrap.fallback
Captura todas as traps SNMP que não foram capturadas por nenhum dos itens snmptrap[] para essa interface. SNMP trap Este item só pode ser configurado para interfaces SNMP.

Atualmente, a correspondência com expressões regulares de várias linhas não é suportada.

Defina o Tipo de informação como 'Log' para que os carimbos de data/hora sejam analisados. Observe que outros formatos, como como 'Numérico', também são aceitáveis, mas podem exigir um manipulador de traps personalizado.

Para o monitoramento de traps SNMP funcionar, ele deve ser configurado corretamente (veja abaixo).

Configurando o monitoramento de traps SNMP

Configurando Zabbix server/proxy

Para ler as traps, o servidor ou proxy Zabbix deve ser configurado para iniciar o processo SNMP trapper e apontar para o arquivo de traps que está sendo escrito pelo SNMPTT ou por um receptor de traps em Bash/Perl. Para isso, edite o arquivo de configuração (zabbix_server.conf ou zabbix_proxy.conf):

StartSNMPTrapper=1
       SNMPTrapperFile=[TRAP FILE]

Se o parâmetro systemd PrivateTmp do systemd for usado, esse arquivo provavelmente não funcionará em /tmp.

Configurando o receptor de traps em Bash

Requisitos: apenas snmptrapd.

Um script de receptor de traps em Bash pode ser usado para passar traps diretamente do snmptrapd para o servidor Zabbix. Para configurá-lo, adicione a opção traphandle no arquivo de configuração do (snmptrapd.conf), veja exemplo.

Configurando SNMPTT

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

Para melhor desempenho, o SNMPTT deve ser configurado como um daemon usando snmptthandler-embedded para passar as traps para ele. Veja as instruções para configurar SNMPTT.

Quando o SNMPTT estiver configurado para receber as traps, configure o arquivosnmptt.ini:

  1. habilite o uso do módulo Perl do pacote NET-SNMP:
net_snmp_perl_enable = 1
  1. registre as traps no arquivo de traps que será lido pelo Zabbix:
log_enable = 1
       log_file = [TRAP FILE]
  1. defina o formato de data e hora:
date_time_format = %H:%M:%S %Y/%m/%d

O pacote "net-snmp-perl" foi removido no RHEL 8.0-8.2 e readicionado no RHEL 8.3. Para mais informações, veja os problemasconhecidos.

Agora, formate as traps para que o Zabbix as reconheça (edite o arquivo snmptt.conf):

  1. Cada declaração de FORMAT deve começar com "ZBXTRAP [address]", onde [address] será comparado aos endereços IP e DNS das interfaces SNMP no Zabbix. Exemplo:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
       FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Veja mais sobre o formato de trap SNMP abaixo.

Não use traps desconhecidas – o Zabbix não conseguirá reconhecê-las. Traps desconhecidas podem ser tratadas definindo um evento geral no snmptt.conf:

EVENT general .* "General event" Normal
Configurando o receptor de trap Perl

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

Um receptor de traps em Perl (procure por misc/snmptrap/zabbix_trap_receiver.pl) pode ser usado para passar traps diretamente do snmptrapd para o servidor Zabbix. Para configurá-lo:

  • Adicione o script Perl ao arquivo de configuração do snmptrapd (snmptrapd.conf), por exemplo:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • configure o receptor, por exemplo:
$SNMPTrapperFile = '[TRAP FILE]';
       $DateTimeFormat = '[DATE TIME FORMAT]';

Se o nome do script não estiver entre aspas, o snmptrapd se recusará a iniciar, mostrando mensagens semelhantes a estas:

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
Formato de trap SNMP

Todos os receptores de trap personalizados em Perl e as configurações de trap SNMPTT devem formatar o trap da seguinte forma:

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

onde

  • [timestamp] - to timestamp usado para itens de log
  • ZBXTRAP - cabeçalho que indica o início de um novo trap nesta linha
  • [address] - endereço IP usado para identificar o host para este trap

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

Exemplo de trap:

11:30:15 2011/07/27 .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:

11:30:15 2011/07/27 .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

Requisitos do sistema

Suporte a arquivos grandes

O Zabbix oferece suporte a arquivos grandes para arquivos de trap SNMP. O tamanho máximo de arquivo que o Zabbix pode ler é 2^63 (8 EiB). Note que o sistema de arquivos pode impor um limite menor no tamanho dos arquivos.

Rotação de logs

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

  1. O Zabbix abre o arquivo de traps na última localização conhecida e vai para o passo 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 traps definido. Se não houver arquivo aberto, o Zabbix redefine a última localização e volta para o passo 1.
  3. O Zabbix lê os dados do arquivo atualmente aberto e define a nova localização.
  4. Os novos dados são analisados. Se este for o arquivo rotacionado, o arquivo é fechado e o processo retorna ao passo 2.
  5. Se não houver novos dados, o Zabbix dorme por 1 segundo e volta para o passo 2.
File system

Devido à implementação de arquivos de trap, o Zabbix precisa que o sistema de arquivos suporte inodes para diferenciar arquivos (a informação é obtida por meio de uma chamada stat() call).

Exemplos de configuração usando diferentes versões do protocolo SNMP

Este exemplo usa o snmptrapd e um script Bash para receber e passar traps para o servidor Zabbix.

Configuração:

  1. Configure o Zabbix para iniciar o trapper SNMP e defina o arquivo de trap. Adicione o seguinte em zabbix_server.conf:
StartSNMPTrapper=1
       SNMPTrapperFile=/tmp/my_zabbix_traps.tmp
  1. Baixe o script Bash para /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/6.0/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh

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

mkdir -p /var/lib/zabbix/snmptraps
  1. Adicione o seguinte em snmtrapd.conf (consulte o exemplo example)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
  1. Crie um item SNMP TEST:

    IP da interface do host: 127.0.0.1
    Chave: snmptrap["linkup"]
    Formato do log:: yyyyMMdd.hhmmss

  2. A seguir, configuraremos o snmptrapd para a versão escolhida do protocolo SNMP e enviaremos traps de teste usando o utilitário snmptrap.

SNMPv1, SNMPv2

Os protocolos SNMPv1 e SNMPv2 usam "community string" para autenticação. No exemplo abaixo, usaremos "secret" como community string. Esse valor deve ser configurado com o mesmo valor nos emissores de traps SNMP.

Note que, apesar de amplamente utilizado 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 essas versões do protocolo só devem ser usadas em ambientes seguros, como redes privadas, e nunca em redes públicas ou de terceiros.

A versão SNMP 1 não é muito utilizada hoje em dia, pois não suporta contadores de 64 bits e é considerada um protocolo legado.

Para permitir o recebimento de traps SNMPv1 ou SNMPv2, adicione a seguinte linha em snmptrapd.conf. Substitua "secret" pela community string configurada nos emissores de traps SNMP:

authCommunity log,execute,net secret

Agora podemos enviar um trap de teste usando o snmptrap. Vamos usar o OID como um "link up" neste exemplo:

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

O SNMPv3 resolve as questões de segurança do SNMPv1/v2 e oferece autenticação e criptografia. Você pode usar os métodos de autenticação MD5 ou múltiplos SHA e os algoritmos de cifra DES/múltiplos AES.

Para habilitar a aceitação de SNMPv3, adicone as seguintes linhas no snmptrapd.conf:

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

Observe que a palavra-chave "execute" permite executar scripts para o modelo de segurança do usuário.

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

Se você quiser usar métodos de criptografia fortes, como AES192 ou AES256, utilize o net-snmp a partir da versão 5.8. Você pode precisar recompilá-lo com a opção configure: --enable-blumenthal-aes. Versões mais antigas do net-snmp não suportam AES192/AES256. Veja também: http://www.net-snmp.org/wiki/index.php/Strong_Authentication_or_Encryption

Verificação

Em ambos os exemplos, você verá linhas semelhantes no arquivo /var/lib/zabbix/snmptraps/snmptraps.log:

20220805.102235 ZBXTRAP 127.0.0.1
       UDP: [127.0.0.1]:35736->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

O valor do item no Zabbix será:

2022-08-05 10:22:35 2022-08-05 10:22:33 
       
       20220805.102233 UDP: [127.0.0.1]:35736->[127.0.0.1]:162
       DISMAN-EVENT-MIB::sysUpTimeInstance = 0:0:00:00.00
       SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Consulte também