4 SNMP trap
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 ser perdidos pelos dados consultados.
O recebimento de traps SNMP no Zabbix foi projetado para funcionar com snmptrapd e um dos mecanismos para encaminhar os traps ao Zabbix - seja um script Bash ou Perl, ou SNMPTT.
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:
snmptrapdrecebe um trap.snmptrapdencaminha o trap para o script receptor (Bash, Perl) ou SNMPTT.- O receptor analisa, formata e grava o trap em um arquivo.
- O Zabbix SNMP trapper lê e analisa o arquivo de traps.
- 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.
- 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 itemsnmptrap.fallback, o trap é definido como o valor dele. - Se o trap não tiver sido definido como o valor de nenhum item, o Zabbix registra, por padrão, o trap sem correspondência. (Isso é configurado por Registrar traps SNMP sem correspondência em Administração > Geral > Outros.)
Notas sobre failover de HA
Durante a troca de nó em 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.
Configurando traps SNMP
Este tipo de item requer a seguinte configuração no frontend:
Etapa 1: Criar uma interface SNMP para o host
- Em Coleta de dados > Hosts, crie um host ou edite o existente.
- No campo Interfaces, selecione o tipo de interface SNMP.
- Informe o endereço IP/nome DNS e o número da porta.
- Selecione a versão SNMP no menu suspenso: (SNMPv1, SNMPv2, ou SNMPv3) e adicione as credenciais da interface de acordo com a versão SNMP selecionada.
O endereço de cada trap recebida será comparado com os endereços IP e DNS de todas as interfaces SNMP para encontrar os hosts correspondentes.
Etapa 2: Configurar o item
- Para o host, crie um item ou edite o existente.
-
No campo Key, use uma das chaves de trap SNMP:
snmptrap[regexp]- captura todas as traps SNMP que correspondem à expressão regular especificada no parâmetroregexp; seregexpnão for especificado, captura qualquer trap.
Macros de usuário e expressões regulares globais são suportadas no parâmetro.
Valor de retorno: trap SNMP.
Este item pode ser definido apenas para interfaces SNMP.snmptrap.fallback- captura todas as traps SNMP que não foram capturadas por nenhum dos itenssnmptrap[]dessa interface.
Valor de retorno: trap SNMP.
Este item pode ser definido apenas para interfaces SNMP.
A correspondência de expressão regular em várias linhas não é suportada neste momento.
- 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.
Configurando o monitoramento de traps SNMP
Configurando o server/proxy do Zabbix
Para ler os traps, o server ou proxy do Zabbix 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 ou zabbix\_proxy.conf):
StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]
Se o parâmetro do systemd PrivateTmp for usado, é improvável que esse arquivo funcione em /tmp.
Configurando o receptor de traps em Bash
Requisitos: apenas snmptrapd.
Um script de receptor de traps em Bash
pode ser usado para encaminhar traps para o server do Zabbix a partir do snmptrapd usando o arquivo trapper. Para
configurá-lo, adicione a opção traphandle ao arquivo de configuração do snmptrapd (snmptrapd.conf),
veja o exemplo.
Talvez seja necessário reiniciar o snmptrapd para que as alterações em sua configuração sejam aplicadas.
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 do "[FULL PATH TO PERL RECEIVER SCRIPT]";
- Configure o receptor, por exemplo:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';
Talvez seja necessário reiniciar o snmptrapd para que ele carregue as alterações em sua configuração.
Se o nome do script não estiver entre aspas, o snmptrapd recusará iniciar com 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
Configurando o SNMPTT
Primeiro, o snmptrapd deve ser configurado para usar o SNMPTT.
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.
Quando o SNMPTT estiver configurado para receber os traps, configure snmptt.ini:
- Habilite o uso do módulo Perl do pacote
NET-SNMP:
net_snmp_perl_enable = 1
- Registre os traps no arquivo de traps que será lido pelo Zabbix:
log_enable = 1
log_file = [TRAP FILE]
- Defina o formato de data e hora:
date_time_format = %Y-%m-%dT%H:%M:%S%z
O pacote net-snmp-perl foi removido no RHEL 8.0-8.2; foi adicionado novamente no RHEL 8.3.
Para mais informações, consulte os known issues.
Agora formate os traps para que o Zabbix os reconheça (edite snmptt.conf):
- Cada instrução
FORMATdeve começar comZBXTRAP [address], em que[address]será comparado aos endereços IP e DNS das interfaces SNMP no Zabbix. Por exemplo:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
- Veja mais sobre o formato de trap SNMP abaixo.
Não use traps desconhecidos - o Zabbix não conseguirá reconhecê-los.
Traps desconhecidos podem ser tratados definindo um evento geral em snmptt.conf:
EVENT general .* "General event" Normal
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:
[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:
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:
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
Requisitos do sistema
Recomenda-se instalar arquivos MIB 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.
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.
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:
- O Zabbix abre o arquivo de trap no último local conhecido e vai para a etapa 3.
- 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.
- O Zabbix lê os dados do arquivo atualmente aberto e define o novo local.
- Os novos dados são analisados. Se este era o arquivo rotacionado, o arquivo é fechado e volta para a etapa 2.
- Se não houver novos dados, o Zabbix dorme por 1 segundo e volta para a etapa 2.
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()).
Exemplos de configuração usando diferentes versões do protocolo SNMP
Este exemplo usa o snmptrapd e um script receptor em Bash para encaminhar traps para o server Zabbix.
Configuração:
- Configure o Zabbix para iniciar o SNMP trapper e defina o arquivo de traps. Adicione ao
zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
- 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/trunk/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:
mkdir -p /var/lib/zabbix/snmptraps
- Adicione o seguinte ao
snmtrapd.conf(consulte o exemplo em funcionamento)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
Talvez seja necessário reiniciar o snmptrapd para que ele carregue as alterações em sua configuração.
-
Crie um item SNMP TEST (lembre-se dos requisitos iniciais de configuração):
Type: SNMP trap
Type of information: Log
Host interface: SNMP 127.0.0.1
Key:snmptrap["linkUp"]
Log time format:yyyyMMdd.hhmmss
Observe que o formato de data e hora ISO 8601 é usado.
- Em seguida, vamos configurar o
snmptrapdpara a versão escolhida do protocolo SNMP e enviar traps de teste usando a utilidadesnmptrap.
SNMPv1, SNMPv2
Os protocolos SNMPv1 e SNMPv2 dependem de autenticação por "community string". No exemplo abaixo, usaremos "secret" como community string. Ela deve ser definida com o mesmo valor nos emissores 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 emissor. Os dados são enviados em texto simples e, portanto, essas versões do protocolo devem ser usadas apenas em ambientes seguros, como redes privadas, e nunca devem ser usadas em redes públicas 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 emissores de traps SNMP:
authCommunity log,execute,net secret
Em seguida, podemos enviar uma trap de teste usando snmptrap. Usaremos o OID comum de "link up" neste exemplo:
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:
createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest
Observe a palavra-chave "execute", que permite executar scripts para este modelo de segurança de 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, 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.
Verificação
Em ambos os exemplos, você verá linhas semelhantes em /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
O valor do item no Zabbix será:
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:
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