区分路由器重新加载和“sysUpTime”SNMP 计数器换行

网络工程 思科-ios snmp
2021-07-15 17:15:14

如果我通过 SNMP 轮询,例如 Cisco IOS 接口ifHCInOctets计数器并且上次读数低于先前读数,那么我知道设备已重新加载,ifHCInOctets计数器已回绕,存在影响此特定接口的在线硬件插入/移除 (OIR)或者接口被删除并重新创建(这在 VLAN 接口、端口通道接口等情况下是可能的)。现在我想区分路由器重新加载和ifHCInOctets从零开始的所有其他可能性起初snmpEngineTime(根据 Cisco SNMP 对象导航器的范围为 0 - 2147483647)似乎是一个完美的解决方案,因为这个计数器在 68 年后回绕,但如果 SNMP 代理重新启动,它也会从零开始,即停止(no snmp-server)和启动(snmp-server community public RO)。这意味着仍然需要检查sysUpTime,据我所知,只有在系统重新启动的情况下从零开始,但不幸的是每 497 天后换行。这意味着如果sysUpTimeifHCInOctets变为零时在相同检查之间换行,则下面看到的简单算法将不起作用

if (( prev_ifHCInOctets > cur_ifHCInOctets )); then
  if (( prev_sysUpTime > cur_sysUpTime )); then
    echo "router reloaded"
  else
    echo "counter wrapped, OIR or interface recreated"
  fi
fi

如果有“ sysUpHCTime”计数器就完美了,但看起来没有。我有哪些选择?我想一种可能性是简单地忽略这种极不可能的情况,其中cur_ifHCInOctetsifHCInOctets计数器的当前读数)和cur_sysUpTimesysUpTime计数器的当前读数)都小于以前的读数,因为两个计数器都包含在相同的轮询间隔内。但是,出于兴趣,这里有什么选择?我想至少一种可能的选择不是检查 if prev_sysUpTime > cur_sysUpTime,而是检查prev_sysUpTime之间的增量cur_sysUpTime是否大致相当于脚本检查间隔?我的意思是,例如让我们想象一个prev_sysUpTime变量是 42949500 并且脚本知道它在 300 秒前获得这个值的情况。现在cur_sysUpTime脚本读取的是 128。作为下一步,脚本检查cur_sysUpTime+(42949672- prev_sysUpTime) 是否在 300 左右(例如在 295 - 305 范围内),如果是,则 100% 确定sysUpTime从零开始,因为计数器换行和不是因为设备重新加载。这个公式中使用的42949672是在sysUpTime不包括毫秒的情况下SNMP计数器的最大值,即SNMP的最大值sysUpTime是2^32,但最后两位数字代表毫秒,例如4294967296是42949672秒(约497天)和96毫秒。

很抱歉这篇很长的帖子,如果有任何不清楚的地方,请告诉我。

2个回答

我会这样处理:获取 sysuptime,然后计算启动日期/时间和预测的下一次包装日期/时间。将两者写入日志。计算下一次轮询时间,如果它比预测的下一次换行日期/时间晚一点,则将“预计换行”位写入日志。下次获取时,请查看日志中的“预期回绕”位和预测的下一次回绕时间,如果该位为 1,并且预测的回绕时间和当前启动时间是否非常接近(如果您的服务器和路由器非常接近)都在使用 NTP),那么您就知道它已经打包并且没有重新启动。如果没有,您就知道它重新启动了。如果未设置换行预期位,只需返回主脚本逻辑并计算新的启动时间和预测换行时间,制作您的换行预测位,并将其全部写入日志。

您试图通过不预期正常运行时间包装来防止重新启动误报,并通过假设计数器在实际重新启动时包装来防止重新启动真负。要做到这两点,您需要非常小心的时间安排,即使这样,它也只会降低概率(低于 1,000,000 分之一),但并不能消除它们。

如果你想完全倾斜,你可以做一些事情,比如在顶部添加第二个检测层。例如,查看 UDP 流量计数器:由于您通过 snmp 进行轮询,因此您将不断增加一点点。由于可能没有发生许多其他 SNMP 轮询,因此它不太可能经常换行(如果与出于其他原因的重新启动相比的话)所以如果您看到 sysuptime 下降并且 udp 流量计数下降,您可以增加您的信心抓住了重新启动。

您想要的是 SNMP 等效项:System restarted at 15:12:52 EDT Wed Jun 3 2015from show hardware但是,我不知道有任何 MIB 导出它。

另一种选择是跟踪系统日志消息计数。我不知道哪些路由器实际上支持它;我的 3745 运行 12.4T 没有。