내 질문은 SNMPv3 및 snmptrapd 서비스를 사용하는 zabbix 트랩에 관한 것입니다.zabbix_trap_receiver.pl. SNMPv3만 활성화된 스위치가 있으므로 해당 스위치에는 SNMPv1/2c가 없습니다.읽고 쓰기또는루오커뮤니티가 구성되었으며 기존 SNMPv2 템플릿을 수정하는 오랜 과정을 거친 후 이를 zabbix의 호스트로 추가할 수 있었습니다. 존재하다자빅스 문서존재하다snmptrapd.confSNMP 트랩을 활성화하기 위해 몇 줄(아래 표시)을 추가했습니다.
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";
내 질문:
- 무슨 뜻인가요?
authCommunity execute public
- 나는 아니에요사람들커뮤니티를 구성한 후 snmptrapd 서비스가 SNMPv3 트랩을 해독할 수 있습니까? Wireshark에서는 트랩 패킷 내용을 표시할 수 있도록 SNMPv3 자격 증명을 정의해야 합니까?
- 그렇지 않은 경우 어떻게 구성합니까?snmptrapd.confPerl 스크립트가 SNMPv3에서 이러한 트랩을 읽을 수 있도록 하시겠습니까?
- Wireshark에서는 SNMPv3로 암호화되어 있는데 왜 SNMPv2c 트랩이라고 표시되어 있는데 여기서는 길을 잃었나요?
- SNMPv2가 활성화되고 SNMPv3가 활성화될 때 트랩이 어떻게 작동하는지 설명해주세요.
편집하다 나는 또한 다음을 시도했다
createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";
하지만 행운은 없어
답변1
snmptrapd 데몬이 트랩을 처리하는 방식에서는 전송 장치의 EngineID를 지정하지 않고는 SNMPv3 트랩 수신을 허용하지 않습니다. 즉, /etc/snmp/snmptrapd.conf에서 다음을 수행하는 경우에만 가능합니다.
createUser snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";
/var/lib/net-snmp/snmptrapd.conf에서 생성된 usmUser가 실제 요구 사항을 충족하지 않기 때문에 /tmp/zabbix_traps.tmp에서 SNMPv3 트랩을 얻을 수 없습니다. 그게 전부입니다.
SNMPv3 알림의 경우 대부분의 스위치는 알림을 보낼 수 없으므로 SNMPv3 트랩만 사용할 수 있으며 snmptrapd가 프로그래밍된 방식은 SNMPv3 트랩의 EngineID에서만 작동합니다. snmptrapd.conf에서 비활성화Authorization yes를 사용하더라도 각 전송 장치(예: 스위치 장치)의 EngineID가 없으면 SNMPv3 트랩이 작동하지 않습니다.
이제 SNMPv3 트랩을 수신하려면 모든 스위치의 모든 EngineID를 가져와야 합니다. 이를 위해 SNMPv3로 snmptrapd.conf를 빌드하는 Python 스크립트를 작성했는데, 이는 큰 도움이 되었습니다. 실제 파일에는 스위치 이름과 IP 주소를 표시하는 각 createUser 줄 앞에 주석이 있습니다. SNMPv3 트랩에 대한 이 정보는 실제로 net-snmp 문서에 언급되어 있지만 처음 읽을 때 그렇게 설명되어 있기 때문에 이해할 수 없었고 The difference is that SNMPv3 TRAPs use the engineID of the local application sending the trap rather than the engineID of the remote application
처음 읽을 때 혼란스러울 수 있지만 조금만 더 집중하면 매우 이해가 됩니다. 분명한:
SNMPv3 TRAP은 어떤 면에서는 조금 복잡하지만, 오랫동안 생각해보면 프로토콜이 이런 방식으로 작동한다는 것은 이해가 됩니다. 차이점은 SNMPv3 TRAP은 원격 애플리케이션의 엔진 ID가 아닌 트랩을 보내는 로컬 애플리케이션의 엔진 ID를 사용한다는 것입니다. 이는 원격 사용자 데이터베이스에 사용자를 생성할 때 더 주의해야 하며 트랩을 보내려는 각 엔진 ID에 대해 사용자를 생성해야 함을 의미합니다. 즉, 100개의 snmp 에이전트가 snmpv3 트랩을 트랩 수신기로 보내려면 /var/net-snmp/snmptrapd.conf 파일에 100개의 createUser 지시문이 필요합니다.
/etc/snmp/snmptrapd.conf 파일은 다음과 같습니다:
createUser -e 0x800007c703609c9f1eff01 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703cc4e24e4c6c3 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703d4c19e743e86 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10ca715 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10c46f0 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121bacd snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121b7d8 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703609c9f5136f4 snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";
파일은 이보다 훨씬 길지만 이제 모든 스위치에서 모든 트랩을 수신할 수 있습니다. Stackoverflow에서 누군가가 EngineID 없이 DES를 성공적으로 사용하는 것을 보았지만 그것은 쓰레기였고 DES나 EngineID 없이 AES에서는 작동하지 않았습니다. 이는 트랩 수신 작업을 위해 모든 장치의 EngineID를 기록하는 다른 모니터링 소프트웨어의 백그라운드에서 수행되는 작업입니다.
또한 코어 스위치의 트랩이 zabbix가 위치한 vlan의 가상 인터페이스에서 수신되는 것을 확인했기 때문에 zabbix_trap_receiver.pl 스크립트를 다음과 같이 수정해야 했습니다.
use NetSNMP::TrapReceiver; # should be added in order to get the script to work, otherwise it fails -- elekgeek 2nd DEC 2019
# get the host name
$pdu_info{'receivedfrom'} =~ s/192.168.168.254/192.168.168.1/ig; # I added this line to get the core switch IP instead of zabbix's VLAN SVI IP, otherwise trap is not added to the CORE trap.fallback -- elekgeek 2nd DEC 2019
my $hostname = $pdu_info{'receivedfrom'} || 'unknown';
if ($hostname ne 'unknown')
트랩을 처리할 때 히스토리로 처리해야 하므로 템플릿의 SNMP Trap (Fallback) 항목을 InfoType = Log 에서 InfoType = Text 로 변경했습니다 Template Module Generic SNMPv3
.
Zabbix에게 행운을 빕니다!