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:
snmptrapdrecebe uma trapsnmptrapdpassa a trap para o script receptor (Bash, Perl) ou SNMPTT- O receptor analisa, formata e escreve a 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 correspondentes ao endereço da trap recebida. Note que apenas o "IP" ou "DNS" selecionado na interface do host é utilizado durante a correspondência
- 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 itemsnmptrap.fallback, - a trap é definida como o valor desse item -
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 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
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:
- habilite o uso do módulo Perl do pacote NET-SNMP:
net_snmp_perl_enable = 1
- registre as 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 = %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):
- 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)
- 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
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:\
- O Zabbix abre o arquivo de traps na última localização conhecida e vai para o passo 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 traps definido. Se não houver arquivo aberto, o Zabbix redefine a última localização e volta para o passo 1.
- O Zabbix lê os dados do arquivo atualmente aberto e define a nova localização.
- Os novos dados são analisados. Se este for o arquivo rotacionado, o arquivo é fechado e o processo retorna ao passo 2.
- 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:
- 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
- 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
- Adicione o seguinte em
snmtrapd.conf(consulte o exemplo example)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
-
Crie um item SNMP TEST:\
IP da interface do host: 127.0.0.1
Chave:snmptrap["linkup"]
Formato do log:: yyyyMMdd.hhmmss -
A seguir, configuraremos o
snmptrapdpara a versão escolhida do protocolo SNMP e enviaremos traps de teste usando o utilitáriosnmptrap.
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