내 질문은 SNMPv3 및 snmptrapd 서비스를 사용하는 zabbix 트랩에 관한 것입니다.zabbix_trap_receiver.pl. SNMPv3만 활성화한 스위치가 있어서 스위치에 SNMPv1/2c가 없습니다.rw또는로커뮤니티를 구성했으며 기존 SNMPv2 템플릿을 수정하는 오랜 여정 끝에 이를 zabbix의 호스트로 추가할 수 있었습니다. ~ 안에자빅스 문서~에snmptrapd.confSNMP 트랩을 활성화하기 위해 여기에 표시된 것처럼 몇 줄이 추가되었습니다.
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";
내 질문:
- 의 의미는 무엇입니까?
authCommunity execute public
- 나는 가지고 있지 않다공공의커뮤니티가 구성되어 있는데, Wireshark에서 트랩 패킷 콘텐츠를 표시하려면 SNMPv3 자격 증명을 정의해야 했기 때문에 snmptrapd 서비스가 SNMPv3 트랩을 해독할 수 있습니까?
- 그렇지 않은 경우 어떻게 구성할 수 있습니까?snmptrapd.confPerl 스크립트가 SNMPv3에서 이러한 트랩을 읽을 수 있도록 하시겠습니까?
- Wireshark에서 SNMPv2c 트랩이라고 표시되는 이유는 SNMPv3으로 암호화되어 있는데 여기서는 길을 잃습니까?
- 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";
파일은 그보다 훨씬 길지만 이제 모든 스위치에서 모든 트랩을 수신할 수 있습니다. 누군가가 EngineID를 사용하지 않고 DES로 성공했다는 것을 stackoverflow에서 보았지만 이것은 정말 쓰레기입니다. 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 트랩(대체) 항목을 정보 유형=로그에서 정보 유형=템플릿의 텍스트로 변경했습니다 Template Module Generic SNMPv3
.
행운을 빕니다!