我的问题是关于使用 SNMPv3 的 zabbix 陷阱和使用zabbix_trap_receiver.pl的 snmptrapd 服务。我有一个仅启用了 SNMPv3 的交换机,因此该交换机没有配置 SNMPv1/2c rw或ro社区,并且在修改现有 SNMPv2 模板的漫长旅程之后,我能够将其添加为 zabbix 上的主机。在snmptrapd.conf的zabbix 文档中,添加了如下所示的几行以启用 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陷阱,虽然它被加密为SNMPv3,但我在这里迷路了?
- 请向我解释启用 SNMPv2 和启用 SNMPv3 时陷阱如何工作?
编辑 我也尝试了以下
createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";
但没有运气
snmptrapd 守护进程与陷阱一起工作的方式不允许在不指定发送设备的 EngineID 的情况下接收任何 SNMPv3 陷阱,即,如果您只是在 /etc/snmp/snmptrapd.conf 中执行以下操作:
您将永远不会在 /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,这是一个很大的解脱。实际文件在显示交换机名称和 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
当你第一次阅读它时你会感到困惑,但是稍微集中一下变得非常清楚:/etc/snmp/snmptrapd.conf 文件如下所示:
该文件比这长得多,但现在我可以从所有交换机接收所有陷阱。我在 stackoverflow 上看到有人在不使用 EngineID 的情况下成功使用 DES,但这是真正的废话,无论是对于 DES 还是对于没有 EngineID 的 AES,它都对我不起作用。这只是在其他监控软件的后台完成的事情,这些软件确实记录了所有设备的引擎ID,用于陷阱接收任务。
我还注意到来自核心交换机的陷阱是从zabbix所在的vlan的虚拟接口接收的,所以我不得不修改zabbix_trap_receiver.pl脚本如下:
在处理陷阱时,我必须将它们视为历史记录,因此我将 SNMP 陷阱(回退)项从 Type of information=Log 更改为 Type of information=Text in template
Template Module Generic SNMPv3
。祝zabbixing好运!