我的问题是关于使用 SNMPv3 和 snmptrapd 服务的 zabbix 陷阱zabbix_trap_receiver.pl。我有一台仅启用 SNMPv3 的交换机,因此该交换机没有 SNMPv1/2c读写或者罗配置了社区,经过漫长的修改现有 SNMPv2 模板后,我能够将其添加为 zabbix 上的主机。在zabbix文档在snmptrapd.conf添加了几行(如下所示)以启用 SNMP 陷阱:
authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";
我的问题:
- 是什么意思
authCommunity execute public
- 我没有民众配置了社区后,snmptrapd 服务是否能够解密 SNMPv3 陷阱,因为在wireshark 上我必须定义 SNMPv3 凭据,以便它能够向我显示陷阱数据包内容?
- 如果没有,我该如何配置它snmptrapd.conf以便 perl 脚本可以从 SNMPv3 读取这些陷阱?
- 在wireshark上,为什么它说SNMPv2c trap,虽然它被加密为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";
你永远不会在 /tmp/zabbix_traps.tmp 中得到任何 SNMPv3 陷阱,因为 /var/lib/net-snmp/snmptrapd.conf 中创建的 usmUser 不满足实际要求,就是这样。
当涉及 SNMPv3 通知时,大多数交换机无法发送它们,因此我们只能使用 SNMPv3 陷阱,并且 snmptrapd 的编程方式仅适用于 SNMPv3 陷阱的 EngineID。即使我在 snmptrapd.conf 中使用disableAuthorization yes,如果没有每个发送设备(即交换机设备)的 EngineID,SNMPv3 陷阱也将无法工作。
现在,为了接收 SNMPv3 陷阱,您需要获取所有交换机的所有 EngineID,为此我编写了一个 python 脚本,以便使用 SNMPv3 构建 snmptrapd.conf,这真是一个很大的缓解。实际文件在每个 createUser 行之前都有一个注释,其中显示交换机名称和 IP 地址。这个SNMPv3 traps的信息实际上在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 使用发送陷阱的本地应用程序的engineID,而不是远程应用程序的engineID。这意味着您必须更加小心地在远程用户数据库中创建用户,并且需要为您希望从中发送陷阱的每个 engineID 创建一个用户。这意味着,如果您想让 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 陷阱(回退)项目从信息类型 = 日志更改为信息类型 = 文本Template Module Generic SNMPv3
。
祝 zabbix 好运!